Drucken

Fiber Pool: Task Scheduler für Multi Core Systeme

Mehrkern-Prozessoren sind ja mittlerweile etabliert und weit verbreitet, und somit steigen auch die Anforderungen an die auf diesen Plattformen laufende Software, sowie an die Entwickler, die diese Software implementieren müssen.

Software, die beispielsweise auf einem Quad-Core-Rechner ausgeführt wird, aber davon nur einen Kern auslastet und somit die verfügbare Rechenleistung des Systems nicht optimal ausnutzt, wird es bald schwer haben die Akzeptanz beim Nutzer zu finden. Multi-Threaded ist in!

Allerdings ist es alles andere als trivial, einwandfreie Multithread-Programme zu schreiben. Da sich solche Programme nicht-deterministisch verhalten kann es passieren, das diese trotz eines Fehlers die meiste Zeit noch anscheinend funktionsfähig sind und unauffällig weiterlaufen…manchmal mit verheerenden Folgen. Häufig zeigen sich Bugs erst unter bestimmten race conditions (dt. Wettlauf-Situation), meist unter hoher Last im Produktionseinsatz. Da sich auch das Debuggen schwieriger gestaltet, können die Ursachen solcher Fehler auch sehr lange Zeit unentdeckt bleiben. Zudem kann es zu sog. Deadlocks (Verklemmungen) bei Zugriffen auf zwischen Threads gemeinsam genutzten Speicherbereichen kommen, wenn es mehrere und ungeordnete Sperren gibt: die Threads warten dann gegenseitig darauf, das die gemeinsam genutzte Ressource wieder freigegeben wird, was niemals passiert. Zudem können die vom Scheduler des Kernels verursachten Thread-Wechsel auch einen nicht zu unterschätzenden Overhead erzeugen, welcher das System deutlich ausbremsen kann, wenn viele Threads zum Einsatz kommen.

Eine Alternative zu den Threads bieten Fibers (auch: User-Threads). Während Kernel-Threads präemptiv (”unterbrechbar”) im Systemkern laufen und somit ein Thread-Wechsel durch den Scheduler des Betriebssystems veranlasst wird, laufen Fibers innerhalb eines Threads und im Benutzermodus ab. Hierbei kommen kooperative Wechselstrategien zum Einsatz, d.h.: der Fiber-Wechsel wird durch die Applikation selbst programmiert, oder er wird durch eine dafür eingesetzte Scheduler-Bibliothek vorgenommen, anstatt das dieses unvorhersehbar vom Kernel ausgelöst wird. Die Fiber-Umschaltung ist in der Regel (Ausnahme: blockierende Systemfunktionen) schneller und erlaubt eine bessere Lastverteilung auf Multiprozessor-Systemen als mit Threads, so daß auch ein Performance-Gewinn zu erwarten ist. Dadurch, dass einem Fiber an kritischen Stellen die Rechenzeit nicht vom Kernel entzogen werden kann, kann bei dieser Art von Threads der Einsatz von Synchronisationsobjekten (Locking) entfallen.

George Kotorlis, Entwickler bei der Genericom Software GmbH, hat nun vor wenigen Tagen seine Fiber Pool-Bibliothek veröffentlicht. Fiber Pool ist der erste kooperative Task Scheduler für Mehrprozessorsysteme, der echte Synchronisation zwischen Tasks erlaubt. Erste Tests sehen vielversprechend aus: in seinem Blog berichtet George Kotorlis das es ihm im Open-Source Archivierungsprogramm 7-Zip gelungen sei, durch ein simples Ersetzen des vorhandenen Multithreadings durch die Fiber Pool-Technik das Programm um 17% zu beschleunigen.

Das Projekt klingt derart interessant, das ich mir die Fiber Pool-Bibliothek in den kommenden Wochen auf jeden Fall einmal näher anschauen werde.

Amazon Ads...

Hosted by...

Publicons

Google Ads...

Creative Commons License

Dieses Werk bzw. dieser Inhalt steht unter einer Creative Commons Namensnennung-Nicht-kommerziell-Weitergabe unter gleichen Bedingungen 3.0 Deutschland Lizenz.

Fork me on GitHub