I když vím, že otázky k této otázce již byly probrány (např. https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), nemám pocit, že bych dostal uspokojivou odpověď.
Otázka zní: proč již nepodporuje zelená vlákna JVM?
Uvádí se to v nejčastějších dotazech týkajících se jazyka Java ve stylu :
Zelené vlákno označuje provozní režim Java Virtual Machine (JVM), ve kterém je veškerý kód spuštěn v jediném vlákně operačního systému.
A to na java.sun.com :
Nevýhodou je, že používání zelených vláken znamená, že se nevyužívají výhody systémových vláken v systému Linux, takže virtuální počítač Java není při přidání dalších procesorů škálovatelný.
Zdá se mi, že JVM by mohl mít fond systémových procesů rovný počtu jader, a poté nad ním spustit zelené podprocesy. To by mohlo nabídnout několik velkých výhod, pokud máte velmi velký počet vláken, která často blokují (většinou proto, že současný JVM omezuje počet vláken).
Myšlenky?
Komentáře
- Zdá se mi otázka: Proč zelená vlákna? Proč znovu zavádět vícevláknové vlákno jeho emulací na úrovni JVM prostřednictvím více procesů? ' je spousta bolesti a režie pro zdánlivě žádný zisk, kromě toho, že programátorům umožňuje velkorysější rozmnožování vláken (a já ' nejsem přesvědčen, že ' s výhodou).
- No, ' jde o to mít souběžný programovací model, který se mění. Aktuálně v Javě, pokud chcete škálovatelnost přepnete na NIO se svým vlastním fondem vláken. Alespoň to mi ' odpovídá.
- Přítomnost věcí jako < akka.io > který podporuje Díky lehkým vláknům RTS si také myslím, že je potřeba. Ve skutečnosti jsem zde našel celkem dobrou diskusi < stackoverflow.com/questions/7458782/… >
- @delnan Protože kontextový přepínač pro náklady na nativní vlákna. Zelená vlákna mají mnohem menší režii pro přepínání kontextu a synchronizaci mezi procesy. Kromě toho je množství zelených vláken prakticky neomezené (mohou to být stovky tisíc bez přílišného stresu pro proces VM), zatímco množství nativních vláken je omezeno operačním systémem a režií paměti.
- It trvalo dlouho, než JVM přímo podporovala nativní vlákna. Zelená vlákna byla do té doby přechodným řešením.
Odpověď
Vzpomínám si, že JVM opouštěla zelená vlákna a přešla na nativní vlákna. Bylo to ze dvou jednoduchých důvodů: zelená vlákna byla upřímně nesmyslná a bylo potřeba podporovat vícejádrové procesory s omezeným vývojářským úsilím dostupným na Sun.
To byla škoda – zelená vlákna poskytují mnohem lepší abstrakce, umožňující souběžnost být užitečným nástrojem, nikoli překážkou. Ale zelená vlákna nejsou k ničemu, pokud nelze překonat několik překážek:
-
musí použít všechna jádra CPU, která mají k dispozici
-
přepínání kontextu musí být levné
-
I / O může blokovat jakékoli vlákno v něm zapojené, ale ne žádné jiné vlákno a určitě ne všechna ostatní vlákna , což byl případ některých raných implementací.
Často jsem si říkal, proč je multi-threading v Javě tak tvrdý, ale nyní je to jasnější – bylo to nakonec dělat s přechodem na nativní vlákna, která jsou:
-
dobrá v používání všech jader CPU
-
dobrá v tom, že je skutečně souběžné poskytování nezávislých I / O atd.
-
pomalé při přepínání kontextu (ve srovnání s nejlepšími implementacemi zelených vláken)
-
příšerně chamtivý s pamětí, a proto omezuje jejich maximální použitelný počet.
-
špatná abstrakce pro jakýkoli základ pro vyjádření skutečného světa, což je samozřejmě velmi souběžné.
V dnešní době a hodně programátorského času nyní jde do kódování neblokujících I / O, futures atd. „Je velká škoda, že nemáme lepší úroveň abstrakce.
Pro srovnání, kromě jazyka Erlang, nový jazyk Go odvádí dobrou práci s obrovským souběhem. Dědeček ze všech zůstává Occam , stále probíhajícím výzkumným projektem.
Komentáře
- jak daleko jsme zašli od doby, kdy jste zveřejnili příspěvek: O
- Bohužel, Rust je další jazyk, který opustil lepší abstrakce souběžnosti. Také se rozhodli přejít z kooperativních vláken na nativní vlákna.
- @ Rick-777 Rust je na to příliš nízký.
Odpověď
Jeden proces předstírání více vláken má spoustu problémů. Jedním z nich je, že se všechna zfalšovaná vlákna zastaví při jakékoli chybě stránky.
Alternativa, kterou navrhujete, soubor procesů, má některé výhody a nevýhody. Největší výhoda, izolace „vláken“, by vás sem moc nedostala. Velkou nevýhodou, extrémní obtížností implementace a méně efektivní synchronizací je zde zabiják obchodů.
Nicméně souhlasím s tím, že existují některé aplikace (ne Java), kde by bylo skvělé mít soubor procesů, které byste mohli použít jako fond vláken (ale s větší izolací). Vlákna sdílejí skoro všechno. S procesy můžete konkrétně vybrat, co chcete sdílet. Pokud je mi známo, nikdo se zatím nepokusil implementovat to.
Komentáře
- Occam tvrdí, že to nabízí. V 80. letech to byl významný jazyk, ', ale trpěl nedostatkem financování rozvoje a následně se stal pouze výzkumným místem. Ale jeho představy o souběžnosti jsou nyní stejně pevné jako tehdy a je třeba ještě vylepšit.
- Pokud jste " vícevláknový " al golang (" M: N " typ plánování), pak je teoreticky blokována pouze jedna zelená nit kvůli chybě stránky, protože ostatní vlákna mohou " vyzvedněte uvolněné " (další zelené vlákna), zdá se … softwareengineering.stackexchange.com/questions/222642/…
odpověď
Průměrný kód Java nebude mít vůbec žádnou výhodu. Java není Erlang a programátoři Java nejsou ve stejném smýšlení jako programátoři Erlang. Tento jazyk nebyl nikdy zamýšlen k použití tímto způsobem.
Pokud chcete skutečnou odlehčenou technologii – použijte Erlang a vytvořte tisíce vláken komunikujících prostřednictvím zpráv. V Javě budete mít tucet vláken sdílejících společnou paměť s mutexy a semafory. Jde pouze o jiný programovací model určený pro různé problémy.
Komentáře
- Takže pro vyjasnění je to v Erlangu užitečný přístup. A při ignorování problémů Java mindset by to vlastně mohlo pomoci?
- @redjamjar, je nepravděpodobné aby byl užitečný v Javě, samotný jazyk není pro takové použití zcela vhodný a jeho hlavní (a jediná) výhoda – obrovské množství knihoven připravených k použití – nevyhovuje ' t fit dobře do takového mimozemského programovacího přístupu.
- Ano, pokud chcete tento model, stačí použít Erlang, bude to o řád jednodušší
- Java! = JVM, stačí říct 🙂
- @Bane, tyto " výhody " existují pouze v případě, že ' nemám co porovnávat