Zelená vlákna - Green threads
V programování počítače , zelená vlákna nebo virtuální závity jsou závity , které jsou naplánovány pomocí runtime knihovny nebo virtuálního stroje (VM), namísto nativně podkladové operačního systému (OS). Zelená vlákna napodobují vícevláknová prostředí, aniž by se spoléhali na jakékoli schopnosti nativního operačního systému, a jsou spravována v uživatelském prostoru místo v prostoru jádra , což jim umožňuje pracovat v prostředích, která nemají podporu nativních vláken.
Etymologie
Zelená vlákna odkazují na název původní knihovny vláken pro programovací jazyk Java (která byla vydána ve verzi 1.1 a poté byla zelená vlákna ve verzi 1.3 upuštěna od nativních vláken). Byl navržen The Green Team ve společnosti Sun Microsystems .
Výkon
Na vícejádrovém procesoru mohou implementace nativního vlákna automaticky přiřadit práci více procesorům, zatímco implementace zeleného vlákna obvykle ne. Zelená vlákna lze u některých virtuálních počítačů spustit mnohem rychleji. Na jednoprocesorových počítačích však dosud nebyl nejefektivnější model jednoznačně určen.
Srovnávací testy na počítačích s (dlouho zastaralým) Linuxovým jádrem verze 2.2 ukázaly, že:
- Zelená vlákna výrazně překonávají nativní vlákna Linuxu při aktivaci a synchronizaci vláken .
- Nativní vlákna Linuxu mají o něco lepší výkon při operacích vstupu/výstupu (I/O) a přepínání kontextu .
Když zelené vlákno provede blokovací systémové volání, nejenže je toto vlákno zablokováno, ale jsou zablokována všechna vlákna v rámci procesu. Aby se tomuto problému vyhnuly, musí zelená vlákna používat asynchronní I/O operace, i když zvýšenou složitost na straně uživatele lze snížit, pokud virtuální stroj implementující zelená vlákna vyvolá konkrétní I/O procesy (skryté uživateli) pro každý I/O O operace.
Existují také mechanismy, které umožňují použití nativních vláken a snižují režijní náklady na aktivaci a synchronizaci vláken:
- Závit bazény snížit náklady na plodit nové vlákno by opětovné použití omezeného počtu vláken.
- Jazyky, které používají virtuální počítače a nativní vlákna, mohou použít únikovou analýzu, aby se vyhnuly synchronizaci bloků kódu, když nejsou potřeba.
Zelená vlákna ve virtuálním stroji Java
Původní implementace: Green Threads
V Javě 1.1 byla zelená vlákna jediným modelem vláken používaným virtuálním strojem Java (JVM), alespoň na Solarisu . Protože zelená vlákna mají ve srovnání s nativními vlákny určitá omezení, následné verze Java je upustily ve prospěch nativních vláken.
Výjimkou je virtuální počítač Squawk , který je směsicí mezi operačním systémem pro zařízení s nízkou spotřebou a virtuálním strojem Java. K minimalizaci používání nativního kódu a podpoře migrace jeho izolátů používá zelená vlákna .
Kilim a Quasar jsou projekty s otevřeným zdrojovým kódem, které implementují zelená vlákna v novějších verzích JVM úpravou bajtového kódu Java vytvořeného kompilátorem Java (Quasar také podporuje Kotlin a Clojure ).
Budoucí implementace: Project Loom
Project Loom : Virtuální vlákna jsou odlehčenou alternativou naplánovanou v uživatelském režimu ke standardním vláknům spravovaným OS. Virtuální vlákna jsou namapována na vlákna OS ve vztahu mnoho k mnoha, na rozdíl od vztahu mnoho k jednomu z původní implementace.
Zelená vlákna v jiných jazycích
Existuje několik dalších programovacích jazyků, které místo nativních vláken implementují ekvivalenty zelených vláken. Příklady:
- Chicken Scheme využívá lehká vlákna na úrovni uživatelů na základě prvotřídních pokračování
- Lisp
- CPython s greenletem , eventletem a gevent , PyPy
- Crystal nabízí vlákna
- D nabízí vlákna , používaná pro asynchronní I/O
- Dyalog APL je označuje jako vlákna
- Erlang
- Přejít všechny goroutiny (korutiny, které mají implicitně odevzdat kontrolu v určitých neurčitých bodech) jsou spuštěny ve virtuálních vláknech
- Haskell
- Julia používá pro své úkoly zelená vlákna .
- Předpeklí
- Lua používá souběžnost coroutines . Lua 5.2 také nabízí skutečnou sémantiku korutinů C prostřednictvím funkcí lua_yieldk , lua_callk a lua_pcallk . Rozšíření CoCo umožňuje skutečnou sémantiku korutinů C pro Lua 5.1.
- Nim poskytuje asynchronní I/O a korutiny
- occam , který dává přednost pojmu proces místo vlákna kvůli svému původu v komunikaci sekvenčních procesů
- Perl podporuje zelená vlákna prostřednictvím korutin
- PHP podporuje zelená vlákna prostřednictvím korutin
- Ruby před verzí 1.9
- Raketa (nativní vlákna jsou k dispozici také prostřednictvím Adresáře míst)
- Rust spouští systémová vlákna nativně, podporuje však zelená vlákna prostřednictvím knihoven třetích stran, jako je tokio .
- Implementace SML/NJ souběžného ML
- Smalltalk (většina dialektů: Squeak , VisualWorks, GNU Smalltalk atd.)
- Stackless Python podporuje buď preemptivní multitasking, nebo kooperativní multitasking prostřednictvím microthreads (nazývaných tasklets ).
- Tcl má korutiny a smyčku událostí
Erlang virtuální stroj má to, co by se dalo nazvat zelené procesy - jsou jako operační systém zpracovává (nesdílejí stav jako nitě dělat), ale jsou realizovány v rámci Erlang běhové prostředí (ERTS). Někdy se jim říká zelená vlákna , ale mají výrazné rozdíly od standardních zelených vláken.
V případě GHC Haskell dojde k přepnutí kontextu při prvním přidělení po konfigurovatelném časovém limitu. Vlákna GHC jsou také potenciálně spuštěna na jednom nebo více vláknech OS během jejich životnosti (mezi vlákny GHC a vlákny OS existuje vztah mnoho k mnoha), což umožňuje paralelismus na symetrických víceprocesních strojích, aniž by se vytvářely dražší vlákna OS, než je potřeba běžet na dostupném počtu jader.
Occam je v tomto seznamu neobvyklý, protože jeho původní implementace byla vytvořena pro transputer , a proto nebyl potřeba žádný virtuální stroj. Pozdější porty pro jiné procesory zavedly virtuální stroj podle vzoru transputeru, což je efektivní volba kvůli nízkým režijním nákladům.
Většina virtuálních počítačů Smalltalk nepočítá kroky vyhodnocení; virtuální počítač však může stále předcházet provádění podprocesu na externích signálech (například vypršení časovačů nebo zpřístupnění I/O). Obvykle se používá plánování každý s každým, aby proces s vysokou prioritou, který se pravidelně probouzí, účinně implementoval předponu sdílení času :
[
[(Delay forMilliseconds: 50) wait] repeat
] forkAt: Processor highIOPriority
Jiné implementace, např. QKS Smalltalk, vždy sdílejí čas. Na rozdíl od většiny implementací zeleného vlákna podporuje QKS také prevenci prioritní inverze .
Viz také
- Asynchronní/čekejte
- Lehký proces
- Coroutine
- Virtuální stroj Java
- Globální zámek tlumočníka
- Fiber (počítačová věda)
- Přenosná vlákna GNU
- Protothreads
Reference
externí odkazy
- „ Čtyři pro věky “, článek JavaWorld o zelených vláknech
- Zelená vlákna na vláknech Java Časté dotazy