Bár tudom, hogy az ezzel kapcsolatos kérdéseket már lefedtük (pl. https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), nem érzem úgy, hogy kielégítő választ kaptam volna.
A kérdés a következő: miért nem támogatják többé a zöld szálakat?
Ezt a kód stílusú Java GYIK-re mondja:
A zöld szál a Java Virtual Machine (JVM) működési módjára utal, amelyben az összes kód egyetlen operációs rendszer szálban fut.
És ezt végeztük el a java.sun.com oldalon:
A hátrány az, hogy a zöld szálak használata azt jelenti, hogy a Linux szálait nem használják ki, így a Java virtuális gép nem méretezhető, ha további CPU-kat adnak hozzá.
Számomra úgy tűnik, hogy a JVM rendelkezhet a magok számával megegyező rendszerfolyamat-készlettel, majd ezen felül zöld szálakat futtathat. Ez nagy előnyöket kínálhat, ha nagyon sok szál van, amelyek gyakran blokkolnak (főleg azért, mert a jelenlegi JVM korlátozza a szálak számát).
Gondolatok?
Megjegyzések
- Számomra a kérdés úgy tűnik: miért zöld szálak? Miért kell újra bevezetni a többszálas szálat úgy, hogy több folyamaton keresztül JVM szinten emuláljuk? Ez ‘ sok fájdalom és rezsi látszólag nincs nyereségen kívül, csak lehetővé teszi, hogy a programozók nagyobblelkűbbek legyenek az ívó szálakkal (és én ‘ nem vagyok meggyőződve arról, hogy ‘ s előny).
- Nos, ‘ arról van szó, hogy van egy párhuzamos programozási modellje, amely méretez. Jelenleg Java-ban, ha méretezhetőséget szeretne a saját szálkészleteddel NIO-ra váltasz. Legalább ez ‘ megértésem.
- Olyan dolgok jelenléte, mint < akka.io > amelyik Az rts könnyű szálak arra is gondolnak, hogy szükség van rá. Valójában itt találtam egy nagyon jó beszélgetést < stackoverflow.com/questions/7458782/… >
- @delnan Mivel a natív szálak kontextusváltása költséges. A zöld szálak sokkal kevesebb rezsivel rendelkeznek a kontextusváltáshoz és a folyamatok közötti szinkronizáláshoz. Ezenkívül a zöld szálak mennyisége gyakorlatilag korlátlan (több százezer lehet belőlük, anélkül, hogy a virtuálisgép-folyamat túl nagy stresszt jelentene), míg a natív szálak mennyiségét korlátozza az operációs rendszer és a memória rezsije.
- Ez sokáig tartott, mire a JVM közvetlenül támogatta a natív szálakat. A zöld szálak voltak a köztes megoldások addig.
Válasz
Emlékszem, hogy a JVM elhagyta a zöld szálakat, és natív szálak. Ennek két egyszerű oka volt: a zöld szálak őszintén szemétnek bizonyultak, és szükség volt a többmagos processzorok támogatására a Sun által rendelkezésre álló korlátozott fejlesztői erőfeszítések mellett.
Ez szégyen volt – a zöld szálak sokkal jobb absztrakció, lehetővé téve, hogy a párhuzamosság hasznos eszköz legyen, és ne botlás. De a zöld szálak nem használhatók, ha több akadályt nem lehet leküzdeni:
-
fel kell használniuk a rendelkezésükre álló összes processzormagot
-
kontextusváltásnak olcsónak kell lennie -
Az I / O blokkolhat minden benne foglalt szálat, de nem más szálat és minden más szálat természetesen nem , ami néhány korai megvalósításnál így volt.
Gyakran gondolkodtam azon, hogy miért olyan nehéz a multi-threading a Java-ban, de most már világosabbá válik – végül a natív szálakra való áttéréssel kapcsolatos:
-
jó az összes CPU-mag használatában
-
jó, hogy valóban egyidejű, független I / O stb. biztosítása
-
lassú a kontextusváltásban (összehasonlítva a legjobb zöld szál megvalósításokkal)
-
borzalmasan kapzsi a memóriával, ezért korlátozza ezek maximális felhasználható számát
-
gyenge absztrakció bármilyen alapon a való világ kifejezéséhez, ami természetesen nagyon egyidejű.
Manapság a A programozói sok idõ most a nem blokkoló I / O, jövõk stb. kódolására fordítódik. “Nagy kár, hogy az absztrakció szintje nem jobb.
összehasonlítás, Erlang mellett az új Go nyelv óriási egyidejűséggel jár el. Mindegyikük nagyapja Occam marad, még mindig folyamatban lévő kutatási projekt.
Hozzászólások
- milyen messzire mentünk az Ön által közzétett idő óta: O
- Sajnos, a Rust egy másik nyelv, amely felhagyott a jobb párhuzamossági absztrakciókkal. Ők is úgy döntöttek, hogy áttérnek a szövetkezeti szálakról a natív szálakra.
- @ Rick-777 A Rust túl alacsony szintű ahhoz.
Válasz
Egyetlen, több szálat hamisító folyamatnak sok problémája van. Az egyik az, hogy az összes hamis szál elakad minden oldalhibán.
Az Ön által javasolt alternatívának, a folyamatok halmazának van néhány előnye és hátránya. A legnagyobb előny, a “szálak” elszigeteltsége nem igazán juttat el ide. A nagy hátrány, a megvalósítás rendkívüli nehézsége és a kevésbé hatékony szinkronizálás itt az üzletgyilkos.
Azonban én egyetértenek abban, hogy léteznek olyan alkalmazások (nem Java), ahol nagyszerű lenne egy olyan folyamatkészlet, amelyet használhat, mint egy szálkészlet (de nagyobb elszigeteltség mellett). A szálak nagyjából mindent megosztanak. A folyamatokkal kifejezetten válassza ki, hogy mit oszt meg. Tudomásom szerint még senki sem törekedett ennek megvalósítására.
Megjegyzések
- Az Occam állítása szerint ezt kínálja. Jelentős nyelv volt ez a ‘ 80-as években, de a fejlesztés finanszírozásának hiányában szenvedett, és következésképpen csak kutatási réssé vált. De az egyidejűségről alkotott elképzelései ugyanolyan szilárdak mint most, még javítani kell.
- Ha Ön ” többszálas ” al egy golang (” M: N ” típusú ütemezés), akkor elméletileg csak egy zöld szálat blokkol egy oldalhiba, mert a többi szál képes ” vegye fel a laza ” (egyéb zöld szálak) látszatot … softwareengineering.stackexchange.com/questions/222642/…
Válasz
Egy átlagos Java-kód egyáltalán nem lesz előnyös. A Java nem Erlang, és a Java programozók nem azonos gondolkodásmódban vannak, mint az Erlang programozók. A nyelvet soha nem akarták ilyen módon használni.
Ha igazi könnyű processzort szeretne, használja az Erlang alkalmazást, és hozzon létre több ezer szálat, amelyek üzenetben kommunikálnak. A Java-ban tucatnyi szálad lesz, amelyek közös memóriát használnak mutexekkel és szemaforokkal. Ez csak egy másik programozási modell, amelyet különböző problémákra terveztek.
Megjegyzések
- Tehát, hogy tisztázzuk, hasznos megközelítés az Erlangban. És a Java gondolkodásmód kérdéseit figyelmen kívül hagyva valóban segíthet?
- @redjamjar, nem valószínű hogy a nyelv a Java-ban hasznos legyen, maga a nyelv nem igazán alkalmas ilyen használatra, és fő (és egyetlen) előnye – a használatra kész könyvtárak hatalmas tömege – nem fog illeszkedni ‘ egy ilyen idegen programozási megközelítésbe.
- Igen, ha azt a modellt akarja, akkor csak használja az Erlang-ot, ez nagyságrenddel könnyebb lesz
- Java! = JVM, csak annyit mondani, hogy 🙂
- @Bane, ezek az ” előnyök ” csak akkor léteznek, ha ‘ ve nincs mit összehasonlítani