Im einfachsten Sinne werden Fäden im Allgemeinen als präventiv angesehen (obwohl dies je nach Betriebssystem möglicherweise nicht immer der Fall ist), während Fasern als leichte, kooperative Fäden angesehen werden. Beide sind separate Ausführungspfade für Ihre Anwendung.
Bei Threads: Der aktuelle Ausführungspfad kann jederzeit unterbrochen oder verhindert werden (Hinweis: Diese Anweisung ist eine Verallgemeinerung und gilt je nach Betriebssystem / Threading-Paket / etc. 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 gestoppt 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 es mehr als einen Thread gleichzeitig ausführt und es dem Entwickler überlässt, den Datenzugriff zu schützen.
Bei Fasern: Der aktuelle Ausführungspfad wird nur unterbrochen, wenn die Faser die Ausführung ergibt (gleiche Anmerkung wie oben). Dies bedeutet, dass Fasern immer an genau definierten Stellen starten und stoppen, sodass die Datenintegrität weniger ein Problem darstellt. Da Fasern häufig im Benutzerbereich verwaltet werden, müssen keine teuren Kontextwechsel und Änderungen des CPU-Status vorgenommen werden, was den Wechsel von einer Faser zur nächsten äußerst effizient macht. Da jedoch keine zwei Fasern genau zur gleichen Zeit ausgeführt werden können, werden bei alleiniger Verwendung von Fasern nicht mehrere CPUs oder mehrere CPU-Kerne genutzt.
Threads verwenden eine vorbeugende Planung, während Fasern eine kooperative Planung verwenden.
Mit einem Thread kann der Kontrollfluss jederzeit unterbrochen werden und ein anderer Thread kann übernehmen. Bei mehreren Prozessoren können mehrere Threads gleichzeitig ausgeführt werden ( simultanes 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 wechselt die Steuerung nur, wenn Sie dazu aufgefordert werden, normalerweise mit einem Funktionsaufruf mit dem Namen "So"
yield()
. Dies erleichtert den gleichzeitigen Datenzugriff, da Sie sich nicht um die Atomizität von Datenstrukturen oder Mutexen kümmern müssen. Solange Sie nicht nachgeben, gibt es keine Gefahr, verdrängt und eine andere Faser, die versucht , die Daten zu lesen oder ändern mit dem Sie arbeiten. Wenn Ihre Faser jedoch in eine Endlosschleife gerät, kann keine andere Faser laufen, da Sie nicht nachgeben.Sie können auch Fäden und Fasern mischen, was zu den Problemen führt, mit denen beide konfrontiert sind. Nicht empfohlen, aber manchmal kann es das Richtige sein, wenn es sorgfältig durchgeführt wird.
quelle
In Win32 ist eine Glasfaser eine Art vom Benutzer verwalteter Thread. Eine Glasfaser hat einen eigenen Stapel und einen eigenen Befehlszeiger usw., aber Glasfasern werden vom Betriebssystem nicht geplant: Sie müssen SwitchToFiber explizit aufrufen. Im Gegensatz dazu werden Threads vom Betriebssystem präventiv 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.
(Möglicherweise gibt es andere Verwendungen für denselben Begriff. Wie bereits erwähnt, ist dies die Win32-Definition.)
quelle
Zuerst würde ich empfehlen, diese Erklärung des Unterschieds 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 Benutzerbereich implementiert werden, oder die beiden können gemischt werden. Fasern sind im Grunde genommen Threads, die im Benutzerbereich implementiert sind.
In Abschnitt 11.4 "Prozesse und Threads in Windows Vista" unter modernen Betriebssystemen kommentiert Tanenbaum:
quelle
Beachten Sie, dass Windows 7 zusätzlich zu Threads und Glasfasern die Benutzermodusplanung einführt :
Weitere Informationen zu Threads, Fasern und UMS finden Sie unter Dave Probert: Inside Windows 7 - User Mode Scheduler (UMS) .
quelle
Threads werden vom Betriebssystem geplant (vorbeugend). Ein Thread kann vom Betriebssystem jederzeit gestoppt oder wieder aufgenommen werden, aber Fasern verwalten sich mehr oder weniger selbst (kooperativ) und geben sich gegenseitig nach. Das heißt, der Programmierer steuert, wann Fasern ihre Verarbeitung durchführen und wann diese Verarbeitung zu einer anderen Faser wechselt.
quelle
Threads sind im Allgemeinen darauf angewiesen, dass der Kernel den Thread unterbricht, damit er oder ein anderer Thread ausgeführt werden kann (was besser als präventives Multitasking bekannt ist), während Fasern kooperatives Multitasking verwenden, bei dem die Faser selbst ihre Laufzeit aufgibt, damit andere Fasern können laufen.
Einige nützliche Links, die es besser erklären als ich es wahrscheinlich getan habe, sind:
quelle
Threads wurden ursprünglich als einfache 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 sie Kontrolle ergeben.
Ich denke, der nächste Schritt werden Stränge sein, bei denen Sie ihnen jedes Mal ein Signal senden müssen, wenn Sie möchten, dass sie eine Anweisung ausführen (ähnlich wie bei meinem 5-jährigen Sohn :-). In den alten Tagen (und sogar jetzt auf einigen eingebetteten Plattformen) waren alle Threads Fasern, es gab keine Vorkaufsrechte und Sie mussten Ihre Threads schreiben, um sich gut zu verhalten.
quelle
Die Win32-Faserdefinition ist in der Tat die bei Sun Microsystems festgelegte "Green Thread" -Definition. Es ist nicht erforderlich, den Begriff Faser auf dem Thread irgendeiner Art zu verschwenden, dh einem Thread, der im Benutzerbereich unter der Kontrolle von Benutzercode / Thread-Bibliothek ausgeführt wird.
Um das Argument zu verdeutlichen, lesen Sie die folgenden Kommentare:
Wir sollten davon ausgehen, dass Prozesse aus Fäden bestehen und dass Fäden aus Fasern bestehen sollten. In Anbetracht dieser Logik ist die Verwendung von Fasern für andere Arten von Fäden falsch.
quelle