Frage

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

War es hilfreich?

Lösung

In den einfachsten Begriffe sind Fäden im Allgemeinen als preemptive betrachtet (obwohl dies nicht immer der Fall sein kann, je nach Betriebssystem), während Fasern betrachtet werden leichte, kooperativen Threads zu sein. Beide sind getrennte Ausführungspfade für Ihre Anwendung.

Mit Themen: der aktuelle Ausführungspfad kann jederzeit unterbrochen oder verdrängt werden. (Anmerkung: diese Aussage ist eine Verallgemeinerung und kann nicht immer wahr hält je nach O / Gewinde Paket / etc). Dies bedeutet, dass für Threads, die Datenintegrität ist ein großes Problem, weil ein Thread in der Mitte angehalten werden, um einen Teil der Daten zu aktualisieren, um die Integrität der Daten in einem schlechten oder unvollständigen Zustand verlassen. Dies bedeutet auch, dass das Betriebssystem die Vorteile von mehreren CPUs und CPU-Kerne von mehr als einem Thread laufen zur gleichen Zeit in Anspruch nehmen und es an den Entwickler verlassen den Datenzugriff zu schützen.

Mit Fasern: der aktuelle Ausführungspfad wird nur unterbrochen, wenn die Faserertrag Ausführung (gleiche Note wie oben). Dies bedeutet, dass Fasern immer beginnen und gut definierten Stellen stoppen in die Datenintegrität viel weniger ein Problem ist. Auch, weil Fasern werden häufig in dem Benutzerraum verwaltet, teure Kontextwechsel und CPU-Zustandsänderungen müssen nicht vorgenommen werden, so dass von einer Faser zum nächsten extrem effizient zu ändern. Auf der anderen Seite, da keine zwei Fasern können genau zur gleichen Zeit laufen, nur Fasern allein verwenden, wird Kern nicht die Vorteile von mehreren CPUs oder mehr CPU nehmen.

Andere Tipps

Threads verwenden präemptive Scheduling, während Fasern mit kooperativ Scheduling.

Mit einem Gewinde, könnte der Steuerablauf jederzeit bekommen unterbrochen, und ein anderer Thread übernehmen kann. Mit mehreren Prozessoren, können Sie mehrere Threads haben alle zur gleichen Zeit ausgeführt wird ( gleichzeitige Multithreading oder SMT). Als Ergebnis müssen Sie sein sehr vorsichtig gleichzeitigen Datenzugriff und schützen Sie Ihre Daten mit Mutexe, Semaphore, Bedingungsvariablen, und so weiter. Es ist oft sehr schwierig richtig zu machen.

Mit einer Faser, Steuerung schaltet nur dann, wenn Sie ihm zu sagen, in der Regel mit einem Funktionsaufruf etwas wie yield() genannt. Dies macht die gleichzeitige Datenzugriff einfacher, da Sie müssen keine Sorgen über die Unteilbarkeit von Datenstrukturen oder mutexes. Solange Sie nicht nachgeben, gibt es keine Gefahr des Seins preempted und mit einer anderen Faser, um die Daten zu lesen oder zu ändern versuchen, mit dem Sie arbeiten. Als Ergebnis kann aber, wenn Ihre Faser in eine Endlosschleife wird, keine andere Faser laufen, da Sie nicht sind erhalten werden.

Sie können auch Fäden und Fasern mischen, die durch beide konfrontiert Probleme hervorrufen gibt. Nicht zu empfehlen, aber es kann manchmal das Richtige zu tun, wenn sorgfältig durchgeführt.

In Win32 ist eine Fiber eine Art vom Benutzer verwalteter Thread.Eine Fiber verfügt über einen eigenen Stack und einen eigenen Befehlszeiger usw., Fibers werden jedoch nicht vom Betriebssystem geplant:Sie müssen SwitchToFiber explizit aufrufen.Im Gegensatz dazu werden Threads vom Betriebssystem präventiv geplant.Grob gesagt handelt es sich bei einer Fiber also um einen Thread, der auf der Anwendungs-/Laufzeitebene verwaltet wird, und nicht um einen echten Betriebssystem-Thread.

Die Folge ist, dass Fasern günstiger sind und die Anwendung mehr Kontrolle über die Planung hat.Dies kann wichtig sein, wenn die App viele gleichzeitige Aufgaben erstellt und/oder deren Ausführung genau optimieren möchte.Beispielsweise könnte sich ein Datenbankserver für die Verwendung von Fasern anstelle von Threads entscheiden.

(Es kann andere Verwendungen für denselben Begriff geben;Wie bereits erwähnt, ist dies die Win32-Definition.)

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

Sobald Sie habe gelesen, dass es ziemlich geradlinig ist. Threads implementiert Dosen entweder in den Kernel werden, in Benutzerraum oder die beiden gemischt werden können. Die Fasern werden grundsätzlich Fäden im User-Space implementiert.

  • Was normalerweise ein Thread genannt wird, ist ein Ausführungs-Thread im Kernel implementiert: was als Kernel-Thread bekannt ist. Die Terminierung eines Kernfaden wird ausschließlich durch den Kernel gehandhabt, obwohl ein Kernel-Thread freiwillig die CPU durch Schlafen freigeben kann, wenn er will. Ein Kernel-Thread hat den Vorteil, dass sie verwenden können E / A blockiert und die Kernel Sorgen über Scheduling lassen. Es ist Hauptnachteil ist, dass Threadwechsel relativ langsam ist, da es Trapping in den Kernel benötigt.
  • Fasern sind Fäden Benutzerraum, deren Terminierung in Benutzerraum durch ein oder mehr Kernel-Threads in einem einzigen Prozess behandelt wird. Dies macht Faser sehr schnell wechseln. Wenn Sie Gruppe alle Fasern einen bestimmten Satz von gemeinsam genutzten Daten im Kontext eines einzelnen Kernel-Thread Zugriff auf und haben ihre Terminplanung von einem einzigen Kernel-Thread behandelt, dann können Sie Synchronisierungsprobleme, da die Fasern beseitigen effektiv in Serien laufen und Sie haben die vollständige Kontrolle über ihren Scheduling. Gruppieren in Verbindung stehende Fasern unter einem Kernel-Thread ist wichtig, da der Kernel-Thread sie ausgeführt werden kann in der vom Kernel vorbelegt werden. Dieser Punkt wird in vielen der anderen Antworten nicht klar gemacht. Auch, wenn Sie E / A in einer Faser verwenden blockiert, der gesamte Kernel-Thread es ein Teil der Blöcke ist einschließlich aller Fasern, die Teil der Kernel-Thread sind.

In Abschnitt 11.4 "Prozesse und Threads in Windows Vista" in der modernen Betriebssystemen, Tanenbaum Kommentare:

  

Obwohl Fasern kooperativ geplant sind, wenn es mehrere   Themen Planung der Fasern, ist eine Menge sorgfältiger Synchronisation   erforderlich, dass Fasern nicht stören miteinander zu machen. Zu   die Wechselwirkung zwischen Fäden und Fasern vereinfachen, ist es oft   nur sinnvoll, wie viele Threads zu erstellen, wie es Prozessoren laufen   sie und die Fäden affinitize jeden Durchlauf nur auf einem unterscheidbaren Satz von   verfügbare Prozessoren oder auch nur ein Prozessor. Jeder Thread kann   dann eine bestimmte Teilmenge der Fasern verlaufen, eine eine Festlegung   n-Beziehung zwischen den Fäden und Fasern, die vereinfacht   Synchronisation. Trotzdem gibt es noch viele Schwierigkeiten mit   Fasern. Die meisten Win32-Bibliotheken haben keine Ahnung von Fasern und   Anwendungen, die Fasern zu verwenden versuchen, als ob sie Themen sind, werden   verschiedene Fehler auftreten. Der Kernel hat keine Kenntnis von Fasern,   und wenn eine Faser, die den Kern eintritt, der Faden wird auf die Ausführung kann   Block und der Kernel einen beliebigen Faden auf den Zeitplan   Prozessor, so dass es nicht zur Verfügung andere Fasern läuft. Für diese   Gründe Fasern werden selten verwendet, außer wenn sie von anderen Portieren von Code   Systeme, die die Funktionalität von Fasern bereitgestellt explizit benötigen.

Beachten Sie, dass zusätzlich zu Fäden und Fasern, Windows 7 stellt User-Mode Scheduling :

  

User-Mode-Scheduling (UMS) ist ein   Dünner Mechanismus,   Anwendungen können planen nutzen, um ihre   eigene Threads. Eine Anwendung kann wechseln   zwischen UMS Threads im Benutzermodus   ohne das System Scheduler Beteiligung   und wieder die Kontrolle über den Prozessor, wenn   ein UMS Gewindeblöcke in den Kernel. UM   Fäden unterscheiden sich von Fasern, dass   jedes UMS Gewinde hat seinen eigenen Faden   Kontext statt den Faden des Teilens   Rahmen eines einzelnen Thread. Das   Fähigkeit, zwischen den Threads wechseln in   User-Modus macht UM effizienten   als Thread-Pools für die Verwaltung großer   Anzahl der Arbeitselemente kurzer Dauer   das erfordert einige Systemaufrufe.

Weitere Informationen über Fäden, Fasern und UM sind durch die Beobachtung Dave Probert. Inside Windows 7 - User Mode Scheduler (UMS)

Themen werden durch das Betriebssystem (präemptive) geplant. Ein Thread kann jederzeit durch das Betriebssystem angehalten oder wieder aufgenommen werden, aber Fasern, die mehr oder weniger sich selbst verwalten (kooperativer) und Ausbeute zueinander. Das heißt, die Programmiereinrichtung steuert, wenn Fasern ihre Verarbeitung zu tun, und wenn diese Verarbeitung zu einer anderen Faser schaltet.

Themen wurden ursprünglich als leichtgewichtige Prozesse geschaffen. In ähnlicher Weise Fasern sind ein leichtes Gewinde, die sie (vereinfachend) auf den Fasern, sich gegenseitig planen, indem Steuer erhalten wird.

Ich denke, der nächste Schritt Stränge sein, wo man ihnen ein Signal jedes Mal, wenn sie einen Befehl ausführen möchten senden (nicht im Gegensatz zu meinem 5yo Sohn :-). In den alten Tagen (und auch jetzt auf einigen Embedded-Plattformen), waren alle Fäden Fasern, gab es keine Vorkaufsrechte und man musste Threads schreiben schön zu verhalten.

Threads beruht im allgemeinen auf der Kernel den Thread, so dass es oder ein anderen Thread ausgeführt werden kann, zu unterbrechen (was besser als präemptivem Multitasking bezeichnet wird), während Fasern kooperatives Multitasking verwenden, wo es die Faser selbst ist, der die seinen Lauf aufgeben Zeit, so dass andere Fasern laufen können.

Einige nützliche Links es zu erklären besser, als ich wahrscheinlich tat sind:

Win32 Faser Definition ist in der Tat "Green Thread" Definition bei Sun Microsystems etabliert. Es besteht keine Notwendigkeit, den Begriff Faser auf den Faden von einer Art zu verschwenden, das heißt, ein Thread die Ausführung in Benutzerraum unter dem Benutzercode / Thread-Bibliothekssteuer.

Um das Argument Blick auf die folgenden Kommentare zu verdeutlichen:

  • Mit Hyper-Threading kann Multi-Core-CPU mehrere Threads übernehmen und ihnen eine auf jedem Kern verteilen.
  • superskalare Pipeline-CPU einen Thread für die Ausführung übernimmt und verwendet Parallelität auf Befehlsebene (ILP) zu der der Faden schneller zu laufen. Wir können annehmen, dass ein Thread in parallele Fasern aufgebrochen wird in parallelen Pipelines ausgeführt werden.
  • SMT-CPU kann mehrere Threads und zerschmetterte sie in dem Befehl Fasern akzeptieren parallele Ausführung auf mehreren Pipelines, Rohrleitungen effizienter zu nutzen.

Wir sollten davon ausgehen, dass Prozesse von Fäden hergestellt und die Fäden aus Fasern werden sollen. Mit dieser Logik im Kopf, mit Fasern für andere Arten von Fäden sind falsch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top