Latente Defekte zutage fördern


Single-Core

Programme, die sich in mehrere Threads gliedern, verhalten sich auf Single-Core-Prozessoren tendenziell unproblematischer, weil die Nebenläufigkeit hier nur virtueller Natur ist. Die Threads arbeiten hier in Wirklichkeit nicht parallel zueinander, sondern nutzen abwechselnd den einzigen vorhandenen Core. Die Threading-Bibliothek oder das Betriebssystem kümmern sich um das Scheduling der Threads mit dem Ziel, eine parallele Verarbeitung zu simulieren. Da Kontextwechsel stets mehrere Befehle erfordern, ist es ineffizient, zu viele Kontextwechsel vorzunehmen. Der Scheduler ist aus diesem Grund bestrebt, ihre Anzahl zu minimieren. Die CPU führt deshalb möglicherweise einige Tausend Instruktionen von Thread A aus, um anschließend ein paar Millionen Befehle von Thread B zu verarbeiten und anschließend wieder zu Thread A zu wechseln usw. Dies führt dazu, dass die Abfolge der Speicherzugriffs-Ereignisse der einzelnen Threads nur grob miteinander verzahnt wird.

Multi-Core

Auf einem Multi-Core-Prozessor kommt es dagegen zu einer echten, physischen Nebenläufigkeit. Die verschiedenen Threads arbeiten tatsächlich parallel zueinander und die Speicherzugriffs-Ereignisse werden wesentlich feiner miteinander verzahnt, wie es Bild 1 verdeutlicht. Bei der eher groben Verzahnung, zu der es bei der Verarbeitung durch einen Single-Core-Prozessor kommt, ist es wesentlich unwahrscheinlicher, dass ein Data Race einen Funktionsfehler auslöst. Wenn die problematischen Speicherzugriffe beispielsweise nur wenige Instruktionen nach dem Start des Threads vorkommen, ist sehr unwahrscheinlich, dass der Scheduler so früh einen Kontextwechsel vornimmt. Dementsprechend gering ist das Risiko, dass die Zugriffe falsch verzahnt werden. Bei der feinstufigeren Verzahnung auf einem Multi-Core-Prozessor ist dagegen schon aufgrund der größeren Zahl der Verzahnungen das Risiko eines Fehlers höher. Hieraus kann das Fazit gezogen werden, dass die einwandfreie Verarbeitung auf einem Single-Core-Prozessor denkbar schlecht geeignet ist, Aussagen über die Betriebssicherheit nebenläufiger Programme einzuholen. Latente, nicht zum Tragen gekommene Nebenläufigkeits-Schwachstellen, die sich bisher einer Entdeckung entzogen, können jetzt gravierende Fehler auslösen.

Traditionelle Prüftechniken unzureichend

Traditionelle Prüftechniken sind nur unzureichend in der Lage, Nebenläufigkeits-Defekte zu finden. Entwickler müssen deshalb neue Methoden und Werkzeuge einsetzen, um sichere Aussagen über die einwandfreie Verarbeitung von Multi-Core-Software zu bekommen. Inzwischen werden dynamische Tools verfügbar, die entweder die Verarbeitung des Codes auf verdächtige Speicherzugriffs-Muster hin absuchen oder aber den Prüfern die Möglichkeit geben, das Scheduling genau zu kontrollieren, damit sich Fehler leichter reproduzieren und diagnostizieren lassen.

Seiten: 1 2 3Auf einer Seite lesen

GrammaTech Inc.
www.grammatech.com

Das könnte Sie auch Interessieren