Faser (Informatik)
Im Informatik, a Faser ist besonders leicht Ausführungsfaden.
Wie Fäden teilen sich Fasern Adressraum. Fasern verwenden jedoch jedoch Kooperatives Multitasking während Themen verwenden Präventiver Multitasking. Themen hängen oft vom Thread -Scheduler des Kernels ab, um einen geschäftigen Thread zu verhindern und einen anderen Thread wieder aufzunehmen. Fasern liefern sich, um während der Ausführung eine weitere Faser zu führen.
Themen, Fasern und Coroutinen
Der wichtigste Unterschied zwischen Fasern und Kernelfäden besteht darin, dass Fasern kooperative Kontextschaltungen anstelle einer präventiven Zeitverletzung verwenden. Tatsächlich erweitern die Fasern die Taxonomie der Parallelität:
- Auf einem einzelnen Computer können mehrere Prozesse ausgeführt werden
- Innerhalb eines einzelnen Vorgangs können mehrere Threads ausgeführt werden
- Innerhalb eines einzelnen Fadens können mehrere Fasern ausgeführt werden[1]
Fasern (manchmal als stapelful Coroutinen oder Benutzermodus kooperativ geplante Threads bezeichnet) und stacklose Coroutinen (Compiler -synthetisierte Zustandsmaschinen) stellen zwei unterschiedliche Programmieranlagen mit enormen Leistungs- und Funktionsunterschieden dar.[2]
Vorteile und Nachteile
Weil Fasern multitasking kooperativ, Fadensicherheit ist weniger ein Problem als mit präventiv geplanten Threads und Synchronisationskonstrukte einschließlich Spinlocks und atomare Operationen sind unnötig beim Schreiben von fasered Code, da sie implizit synchronisiert sind. Viele Bibliotheken liefern jedoch eine Faser implizit als Leitmethode Nicht blockierende i/o; Daher wird ein gewisses Vorsicht und Dokumentationslesung empfohlen. Ein Nachteil ist, dass Fasern nicht eingesetzt werden können Multiprozessor Maschinen ohne auch präventive Threads; Allerdings an M: N -Threading -Modell ohne mehr präventive Fäden als CPU -Kerne können effizienter sein als reine Fasern oder reines Präventivfaden.
In einigen Serverprogrammen werden Fasern verwendet, um sich weich zu blockieren, damit ihre übergeführten Elternprogramme weiter funktionieren können. In diesem Design werden Fasern hauptsächlich für den E/A -Zugriff verwendet, der keine CPU -Verarbeitung benötigt. Dadurch kann das Hauptprogramm mit dem fortfahren, was es tut. Die Fasern liefern die Kontrolle über das Hauptprogramm mit einem Thread, und wenn der E/A-Betrieb abgeschlossen ist, bleiben die Fasern dort, wo sie aufgehört haben.
Betriebssystemunterstützung
Weniger Unterstützung von der Betriebssystem wird für Fasern als für Fäden benötigt. Sie können in der Moderne implementiert werden Unix Systeme mit den Bibliotheksfunktionen getContext, setContext und swapContext in ucontext.h
, wie in GNU tragbare Threads, oder in Assembler als Boost.fiber.
An Microsoft WindowsFasern werden mit dem erstellt ConvertThreadtofiber
und CreateFiber
Anrufe; Eine derzeit suspendierte Faser kann in jedem Thread wieder aufgenommen werden. Faserlokaler Speicher, analog zu Thread-lokaler Speicherkann verwendet werden, um eindeutige Kopien von Variablen zu erstellen.[3]
Symbian OS verwendete ein ähnliches Konzept wie Fasern in seinem aktiven Scheduler. Ein aktives Objekt enthielt eine Faser, die vom aktiven Scheduler ausgeführt werden soll, wenn einer von mehreren herausragenden asynchronen Anrufen abgeschlossen wurde. Mehrere aktive Objekte könnten darauf warten, auszuführen (basierend auf Priorität), und jeder musste seine eigene Ausführungszeit einschränken.
Beispiele für Faserimplementierung
Fasern können ohne Betriebssystemunterstützung implementiert werden, obwohl einige Betriebssysteme oder Bibliotheken explizite Unterstützung für sie bieten.
- Win32 liefert eine Faser -API[4] (Windows NT 3.51 SP3 und später)
- Die C ++ - Boost -Bibliotheken haben eine Faserklasse Seit Boost Version 1.62
- Rubin hatte Grüne Fäden (vor Version 1.9)
- Netscape tragbare Laufzeit (Enthält eine Implementierung von Benutzer-Raum-Fasern)
- Ribs2
- Php Seit Version 8.1[5]
Siehe auch
Verweise
Externe Links
- GNU tragbare Threads
- "Tragbare Coroutine -Bibliothek". Freecode.
- Faserpool Ein Multicore-fähiger C ++-Framework basierend auf Fasern für Microsoft Windows.
- Zustandsfäden
- Prototheads
- Ribs2
- Boost.fiber