web-dev-qa-db-de.com

Was ist der Unterschied zwischen einem Faden und einer Faser?

Was ist der Unterschied zwischen einem Faden und einer Faser? Ich habe von Fasern aus Ruby gehört und gelesen, dass sie in anderen Sprachen verfügbar sind. Könnte mir jemand in einfachen Worten erklären, was der Unterschied zwischen einem Faden und einer Faser ist?.

163
tatsuhirosatou

In den einfachsten Ausdrücken werden Threads im Allgemeinen als präventiv angesehen (obwohl dies je nach Betriebssystem möglicherweise nicht immer zutrifft), während Fasern als leichte, kooperative Threads angesehen werden. Beide sind separate Ausführungspfade für Ihre Anwendung.

Bei Threads: Der aktuelle Ausführungspfad kann jederzeit unterbrochen oder unterbrochen werden (Hinweis: Diese Anweisung ist eine Verallgemeinerung und gilt je nach Betriebssystem/Threading - Paket/usw. Möglicherweise nicht immer). Dies bedeutet, dass für Threads die Datenintegrität ein großes Problem darstellt, da ein Thread möglicherweise während der Aktualisierung eines Datenblocks angehalten wird und die Integrität der Daten in einem fehlerhaften oder unvollständigen Zustand verbleibt. Dies bedeutet auch, dass das Betriebssystem mehrere CPUs und CPU-Kerne nutzen kann, indem mehrere Threads gleichzeitig ausgeführt werden und der Entwickler den Datenzugriff überwachen kann.

Mit Fasern: Der aktuelle Ausführungspfad wird nur unterbrochen, wenn die Faser die Ausführung erbringt (gleicher Hinweis wie oben). Dies bedeutet, dass Fasern immer an genau definierten Stellen starten und stoppen, sodass die Datenintegrität viel weniger ein Problem darstellt. Da Glasfasern häufig im Benutzerbereich verwaltet werden, müssen keine teuren Kontextwechsel und CPU-Statusänderungen vorgenommen werden, wodurch der Wechsel von einer Glasfaser zur nächsten äußerst effizient ist. Da jedoch keine zwei Fasern genau zur gleichen Zeit laufen können, können allein durch die Verwendung von Fasern nicht mehrere CPUs oder mehrere CPU-Kerne ausgenutzt werden.

144
Jason Coco

Threads verwenden vorbeugend Zeitplanung, während Fasern kooperativ Zeitplanung verwenden.

Bei einem Thread kann der Steuerungsfluss jederzeit unterbrochen werden und ein anderer Thread kann die Kontrolle übernehmen. Bei mehreren Prozessoren können mehrere Threads gleichzeitig ausgeführt werden ( gleichzeitiges Multithreading oder SMT). Daher müssen Sie beim gleichzeitigen Datenzugriff sehr vorsichtig sein und Ihre Daten mit Mutexen, Semaphoren, Bedingungsvariablen usw. schützen. Es ist oft sehr schwierig, richtig zu machen.

Bei einer Glasfaser schaltet die Steuerung nur um, wenn Sie dazu aufgefordert werden, normalerweise mit einem Funktionsaufruf mit dem Namen yield(). Dies erleichtert den gleichzeitigen Datenzugriff, da Sie sich keine Gedanken über die Atomizität von Datenstrukturen oder Mutexen machen müssen. Solange Sie nicht nachgeben, besteht keine Gefahr, dass Sie vorbelastet werden und eine andere Faser versucht, die Daten, mit denen Sie arbeiten, zu lesen oder zu ändern. Infolgedessen kann jedoch keine andere Faser verlaufen, wenn Ihre Faser in eine Endlosschleife gerät, da Sie nicht nachgeben.

Sie können auch Fäden und Fasern mischen, was zu Problemen bei beiden führt. Nicht zu empfehlen, aber manchmal ist es das Richtige, wenn es sorgfältig durchgeführt wird.

52
Adam Rosenfield

In Win32 ist eine Glasfaser eine Art benutzerverwalteter Thread. Eine Faser hat einen eigenen Stapel und einen eigenen Befehlszeiger usw., aber Fasern werden nicht vom Betriebssystem geplant: Sie müssen SwitchToFiber explizit aufrufen. Threads werden dagegen vom Betriebssystem vorab geplant. Grob gesagt ist eine Glasfaser ein Thread, der auf Anwendungs-/Laufzeitebene verwaltet wird, anstatt ein echter Betriebssystem-Thread zu sein.

Die Konsequenzen sind, dass Fasern billiger sind und die Anwendung mehr Kontrolle über die Planung hat. Dies kann wichtig sein, wenn die App viele gleichzeitige Aufgaben erstellt und/oder die Ausführung genau optimieren möchte. Beispielsweise kann ein Datenbankserver Fasern anstelle von Threads verwenden.

(Es kann auch andere Verwendungen für denselben Begriff geben. Dies ist, wie bereits erwähnt, die Win32-Definition.)

42
itowlson

Zuerst würde ich empfehlen, diese Erklärung von der Unterschied zwischen Prozessen und Threads als Hintergrundmaterial zu lesen.

Sobald Sie gelesen haben, dass es ziemlich einfach ist. Threads können entweder im Kernel oder im User Space implementiert oder gemischt werden. Fasern sind im Grunde genommen Threads, die im Benutzerbereich implementiert sind.

  • Was normalerweise als Thread bezeichnet wird, ist ein im Kernel implementierter Ausführungsthread: ein sogenannter Kernel-Thread. Die Planung eines Kernel-Threads wird ausschließlich vom Kernel übernommen, obwohl ein Kernel-Thread die CPU freiwillig freigeben kann, indem er in den Ruhezustand wechselt, wenn er dies wünscht. Ein Kernel-Thread hat den Vorteil, dass er blockierende E/A verwenden kann und sich der Kernel um die Zeitplanung kümmert. Der Hauptnachteil ist, dass das Thread-Wechseln relativ langsam ist, da es das Trapping in den Kernel erfordert.
  • Fasern sind User-Space-Threads, deren Planung im User-Space von einem oder mehreren Kernel-Threads in einem einzigen Prozess ausgeführt wird. Dies macht das Glasfaserumschalten sehr schnell. Wenn Sie alle Fasern, die auf einen bestimmten Satz gemeinsam genutzter Daten zugreifen, im Kontext eines einzelnen Kernel-Threads gruppieren und deren Zeitplanung von einem einzelnen Kernel-Thread abwickeln lassen, können Sie Synchronisierungsprobleme beseitigen, da die Fasern effektiv seriell ausgeführt werden und Sie den Vorgang abgeschlossen haben Kontrolle über ihre Planung. Das Gruppieren verwandter Fasern unter einem einzelnen Kernel-Thread ist wichtig, da der Kernel-Thread, in dem sie ausgeführt werden, vom Kernel vorbelegt werden kann. Dieser Punkt wird in vielen anderen Antworten nicht klargestellt. Wenn Sie blockierende E/A in einer Faser verwenden, ist der gesamte Kernel-Thread ein Teil der Blöcke, einschließlich aller Fasern, die Teil dieses Kernel-Threads sind.

In Abschnitt 11.4 "Prozesse und Threads unter Windows Vista" in modernen Betriebssystemen erklärt Tanenbaum:

Obwohl Fasern kooperativ geplant werden, ist bei mehreren Threads, die die Fasern planen, eine sorgfältige Synchronisation erforderlich, um sicherzustellen, dass sich die Fasern nicht gegenseitig stören. Um die Interaktion zwischen Threads und Fasern zu vereinfachen, ist es oft nützlich, nur so viele Threads zu erstellen, wie Prozessoren zum Ausführen vorhanden sind, und die Threads für jeden Lauf nur auf einem bestimmten Satz verfügbarer Prozessoren oder sogar nur auf einem Prozessor zuzuordnen. Jeder Thread kann dann eine bestimmte Teilmenge der Fasern ausführen, wodurch eine Eins-zu-Viele-Beziehung zwischen Threads und Fasern hergestellt wird, die die Synchronisation vereinfacht. Trotzdem gibt es immer noch viele Schwierigkeiten mit Fasern. Die meisten Win32-Bibliotheken kennen keine Fasern, und Anwendungen, die versuchen, Fasern so zu verwenden, als wären sie Threads, treten verschiedene Fehler auf. Der Kernel kennt keine Fasern, und wenn eine Faser in den Kernel eintritt, blockiert möglicherweise der Thread, auf dem er ausgeführt wird, und der Kernel plant einen beliebigen Thread auf dem Prozessor, sodass andere Fasern nicht ausgeführt werden können. Aus diesen Gründen werden Fasern nur selten verwendet, außer wenn Code von anderen Systemen portiert wird, die die von Fasern bereitgestellte Funktionalität ausdrücklich benötigen.

35

Beachten Sie, dass Windows 7 zusätzlich zu Threads und Fasern die Benutzermodus-Zeitplanung einführt :

User-Mode-Scheduling (UMS) ist ein leichter Mechanismus, mit dem Anwendungen ihre eigenen Threads planen können. Eine Anwendung kann im Benutzermodus zwischen UMS-Threads wechseln, ohne den System-Scheduler einzubeziehen, und die Kontrolle über den Prozessor wiedererlangen, wenn ein UMS-Thread im Kernel blockiert wird. UMS-Threads unterscheiden sich von Fasern darin, dass jeder UMS-Thread seinen eigenen Thread-Kontext hat, anstatt den Thread-Kontext eines einzelnen Threads gemeinsam zu nutzen. Die Möglichkeit, im Benutzermodus zwischen Threads zu wechseln, macht UMS effizienter als Thread-Pools, um eine große Anzahl von Workitems mit kurzer Dauer zu verwalten, für die nur wenige Systemaufrufe erforderlich sind.

Weitere Informationen zu Threads, Fasern und UMS finden Sie unter Dave Probert: Inside Windows 7 - User Mode Scheduler (UMS) .

12
Grant Wagner

Threads werden vom Betriebssystem geplant (vorbeugend). Ein Thread kann jederzeit vom Betriebssystem angehalten oder fortgesetzt werden, aber Fasern verwalten sich mehr oder weniger selbst (kooperativ) und geben sich gegenseitig hin. Das heißt, der Programmierer steuert, wann Fasern verarbeitet werden und wann diese Verarbeitung auf eine andere Faser umschaltet.

7
Arnold Spence

Threads wurden ursprünglich als Lightweight-Prozesse erstellt. In ähnlicher Weise sind Fasern ein leichter Faden, der sich (vereinfacht) auf die Fasern selbst stützt, um sich gegenseitig zu planen, indem er Kontrolle gibt.

Ich denke, der nächste Schritt werden Stränge sein, bei denen Sie ihnen jedes Mal ein Signal senden müssen, wenn sie eine Anweisung ausführen sollen (nicht anders als bei meinem 5-jährigen Sohn :-). In früheren Zeiten (und sogar auf einigen eingebetteten Plattformen) waren alle Threads Fasern, es gab keine Präemission und Sie mussten Ihre Threads schreiben, um sich gut zu verhalten.

7
paxdiablo

Threads verlassen sich im Allgemeinen darauf, dass der Kernel den Thread unterbricht, damit er oder ein anderer Thread ausgeführt werden kann (was besser als vorbeugendes Multitasking bezeichnet wird), wohingegen Fasern kooperatives Multitasking verwenden, wenn es die Faser selbst ist, die die Laufzeit aufgibt andere Fasern können verlaufen.

Einige nützliche Links, die es besser erklären als ich es wahrscheinlich getan habe, sind:

6
Mike Lowen

Bei der Win32-Glasfaserdefinition handelt es sich um die bei Sun Microsystems festgelegte "Green Thread" -Definition. Es besteht keine Notwendigkeit, den Begriff Faser auf irgendeine Art von Thread zu verschwenden, d. H. Einen Thread, der im Benutzerraum unter der Steuerung des Benutzercodes/der Thread-Bibliothek ausgeführt wird.

Um das Argument zu verdeutlichen, lesen Sie die folgenden Kommentare:

  • Mit Hyper-Threading kann eine Mehrkern-CPU mehrere Threads akzeptieren und diese auf jeden Kern verteilen.
  • Superskalare Pipeline-CPU akzeptiert einen Thread zur Ausführung und verwendet ILP (Instruction Level Parallelism), um den Thread schneller auszuführen. Wir können annehmen, dass ein Faden in parallele Fasern gebrochen ist, die in parallelen Pipelines verlaufen.
  • Die SMT-CPU kann mehrere Threads akzeptieren und sie für die parallele Ausführung in mehreren Pipelines in Anweisungsfasern bremsen, wodurch Pipelines effizienter genutzt werden.

Wir sollten annehmen, dass Prozesse aus Fäden bestehen und dass Fäden aus Fasern bestehen sollten. Unter Berücksichtigung dieser Logik ist es falsch, Fasern für andere Arten von Fäden zu verwenden.

3
billmic