BenBE's humble thoughts Thoughts the world doesn't need yet …

26.08.2012

Threads und Fibers

Filed under: Software — Schlagwörter: , , , — BenBE @ 01:40:34

Für ein Projekt, welches ich bereits seit etwas längerer Zeit vorbereite, benötige ich eine sehr flexible IO-Schicht, mit der ich eine Reihe verschiedener Tätigkeiten wie IO und anderer Events möglichst flexibel parallelisieren kann. Nun gibt es für solche Aufgaben zwar üblicherweise Threads, aber da die Aufgaben zum einen sehr kurzweilig sind, andererseits aber unter gewissen Umständen blockieren können, funktioniert der Ansatz über Thread Pools nur bedingt. Eine vollständige asynchrone Bearbeitung der Ereignisse scheided auf Grund der Komplexität aber auch aus, da das System leicht erweiterbar bleiben muss. Was also benötigt wurde, ist ein Mittelweg aus beiden Ansätzen.

Ein Ansatz für einen solchen Mittelweg bieten Fibers, die analog zu POSIX Threads dem Programm erlauben, mehrere Ausführungsstränge zu erzeugen und damit die Abläufe in der Anwendung zu parallelisieren. Fibers fungieren dabei vollständig im User Mode und sind dadurch gegenüber PThreads oder gar geforkten Prozessen wesentlich leichtgewichtiger beim Wechseln des Zustands. (more…)

Flattr this!

30.09.2011

Thread Pools

Filed under: Software — Schlagwörter: , , — BenBE @ 10:38:24

Neuere Prozessoren bieten immer mehr Leistung durch immer mehr parallele Kerne bei aber seit längerem nahezu gleich gebliebener Taktrate. Somit bleibt einem ohne Anpassung seiner Programme diese zusätzliche Leistung verwehrt. Nur in dem man sein Programm in mehrere Teile spaltet, die parallel ablaufen können, kann man sein Programm auch auf heutigen Prozessoren in optimaler Geschwindigkeit ausführen.

Für die Parallelisierung gibt es hierbei je nach Betriebssystem verschiedene Mittel. Die wohl bekanntesten Mittel stellen hierbei Threads unter Windows, bzw. das Forken unter Linux dar. Aber auch etwas exotischere Mittel wie PThreads oder Fibers bieten gute Möglichkeiten, um ein Programm auf mehrere CPUs zu verteilen.

Die verschiedenen Ansätze haben dabei gemeinsam, dass für verschiedene Aufgaben jeweils mehr oder weniger Umfangreiche Objekte erzeugt werden müssen, die für jede Aufgabe einen Zwischenstand enthalten, den sogenannten Kontext. Dieser ist bei Fibers (Windows) sehr klein, bei Multitasking mittels Prozessen aber durchaus sehr groß. Je größer dabei solch ein Kontext wird, desto langsamer wird das Umschalten zwischen mehreren Aufgaben. Außerdem steigt mit der Größe des Kontext oftmals auch der Aufwand für die Erzeugung eines neuen Kontextes, was insbesondere, wenn man viele kleinere Aufgaben parallelisieren möchte von großer Bedeutung ist.

Eine relativ gute Einführung (leider hinter einer via BugMeNot umgehbaren Paywall *sigh*) gibt es beim Linux Magazine. Auch die beiden Videos mit der Erklärung kann ich wärmstens ans Herz legen.

Nach diesem kurzen Abstecher nun wieder zurück zum eigentlichen Thema dieses Beitrages, denn wie auch im verlinkten Beitrag, sowie den beiden darin enthaltenen Videos erklärt, möchte man in aller Regel den Setup-Aufwand für viele kleine Aufgaben möglichst gering halten. Zu diesem Zweck bietet Windows sogenannte Threadpools. Etwas ähnliches bietet Linux nicht von Haus aus; doch das lässt sich recht einfach ändern.

Für ein eigenes Projekt unter Linux war ich nämlich selber auf der Suche und wurde nach etwas Suchen auch bereits fündig. Die gefundene Implementation ist zwar funktional und minimalistisch gehalten, hat jedoch ein paar kleinere Ecken und Kanten, weshalb ich sie für meine Zwecke noch einmal überarbeitet habe.

Da der Source somit eh einmal komplett bearbeitet wurde, nutze ich die Chance (insbesondere auf Grund des vielfachen Wunsches eines einzelnen Herren), um die Funktionsweise einmal direkt am Source des Thread Pools zu erklären. Eine Vorwarnung möchte ich aber bereits jetzt geben: Das wird etwas technisch 😉 (more…)

Flattr this!

Powered by WordPress