Deși știu că întrebările despre acest aspect au fost deja acoperite (de ex. https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), nu simt că am primit un răspuns satisfăcător.

Întrebarea este: de ce „JVM” nu mai acceptă fire verzi?

Spune acest lucru în Întrebări frecvente despre Java în stil de cod :

Un fir verde se referă la un mod de funcționare pentru mașina virtuală Java (JVM) în care tot codul este executat într-un singur fir de sistem de operare.

Și asta pe java.sun.com :

Dezavantajul este că utilizarea firelor verzi înseamnă că firele de sistem de pe Linux nu sunt profitate și astfel mașina virtuală Java nu este scalabilă atunci când sunt adăugate procesoare suplimentare.

Mi se pare că JVM ar putea avea un grup de procese de sistem egal cu numărul de nuclee, și apoi să ruleze fire verzi deasupra. Acest lucru ar putea oferi câteva avantaje mari atunci când aveți un număr foarte mare de fire de execuție care se blochează adesea (mai ales pentru că JVM curent „limitează numărul de fire de execuție”). / h3>

  • Pentru mine, întrebarea mi se pare: de ce fire verzi? De ce să reintroducem multithread-ul emulându-l la nivelul JVM prin mai multe procese? It ‘ multă durere și cheltuială, pentru că aparent niciun câștig altul decât să permită programatorilor să fie mai generoși cu firele de reproducere (și eu ‘ nu sunt convins că ‘ este un avantaj).
  • Ei bine, ‘ este despre a avea un model de programare concurent care se scalează. În prezent, în Java, dacă doriți scalabilitate treceți la NIO cu propriul grup de fire. Cel puțin, asta ‘ este înțelegerea mea.
  • Prezența unor lucruri precum < akka.io > care presupune rts fire ușoare, de asemenea, mă face să cred că este nevoie. De fapt, tocmai am găsit o discuție destul de bună aici < stackoverflow.com/questions/7458782/… >
  • @delnan Deoarece costul comutatorului de context pentru firele native. Firele verzi au mult mai puține cheltuieli generale pentru comutarea contextului și sincronizarea interprocesului. În plus, cantitatea de fire verzi este practic nelimitată (poate fi de sute de mii dintre ele fără prea multă tensiune pentru procesul VM), în timp ce cantitatea de fire native este restricționată de sistemul de operare și de cheltuielile de memorie.
  • a durat mult înainte ca JVM să accepte direct firele native. Firele verzi au fost soluția intermediară până atunci.

Răspuns

Îmi amintesc că JVM a abandonat firele verzi și a trecut la fire native. Acest lucru a fost din două motive simple: firele verzi erau sincer gunoi și era nevoie să susțină procesoarele multi-core cu efortul limitat al dezvoltatorului disponibil la Sun.

Aceasta a fost o rușine – firele verzi oferă un abstracție mult mai bună, permițând concurenței să fie un instrument util, nu un obstacol. Dar firele verzi nu sunt folositoare dacă mai multe obstacole nu pot fi depășite:

  • trebuie să utilizeze toate nucleele cpu disponibile lor

  • comutarea contextului trebuie să fie ieftină

  • I / O poate bloca orice fir implicat în acesta, dar nu orice alt fir și cu siguranță nu toate celelalte fire , care a fost cazul în unele implementări timpurii.

„M-am întrebat adesea de ce multi-threading este atât de greu în Java, dar acum devine mai clar – în cele din urmă era pentru a face cu trecerea la firele native, care sunt:

  • bun la utilizarea tuturor nucleelor CPU

  • bun la a fi cu adevărat simultan, oferind I / O independente etc

  • lent la comutarea contextului (comparativ cu cele mai bune implementări de fire verzi)

  • oribil lacom de memorie, limitând astfel numărul maxim utilizabil al acestora

  • o abstracție slabă pentru orice bază de exprimare a lumii reale, care este foarte concurentă, desigur.

În zilele noastre, a O mulțime de timp al programatorului merge acum în codificarea I / O non-blocante, futures etc. Este „o mare rușine că nu avem un nivel mai bun de abstractizare.

comparație, pe lângă Erlang, noua limbă Go face o treabă bună de concurență uriașă. Bunicul tuturor rămâne Occam , încă un proiect de cercetare în desfășurare.

Comentarii

  • cât de departe am mers de când ați postat: O
  • Din păcate, Rust este un alt limbaj care a abandonat abstracții mai bune concurente. Și ei au decis să treacă de la fire de cooperare la fire native.
  • @ Rick-777 Rust este prea scăzut pentru a face acest lucru.

Răspuns

Un singur proces care falsifică mai multe fire are multe probleme. Unul dintre ele este că toate firele falsificate se blochează în orice defecțiune a paginii.

Alternativa pe care o sugerați, un grup de procese, are unele avantaje și unele dezavantaje. Cel mai mare avantaj, izolarea „firelor”, nu te va aduce prea mult aici. Marele dezavantaj, dificultatea extremă de implementare și sincronizarea mai puțin eficientă, este deal-killer-ul aici.

Cu toate acestea, eu sunt de acord că există unele aplicații (nu Java) în care un grup de procese pe care le-ați putea folosi ca un grup de fire de execuție (dar cu mai multă izolare) ar fi un lucru grozav de avut. Subiectele împărtășesc aproape totul. Cu procesele, puteți alegeți în mod specific ce să partajați. Din câte știu eu, nimeni nu a făcut încă efortul de a-l implementa.

Comentarii

  • Occam susține că oferă acest lucru. A fost un limbaj semnificativ în ‘ anii 80, dar a suferit de lipsa finanțării dezvoltării și, în consecință, a devenit doar o nișă de cercetare. Dar ideile sale privind concurența sunt la fel de solide acum ca atunci când erau și sunt încă de îmbunătățit.
  • Dacă sunteți ” multi-threaded ” al o programare de tip golang (” M: N „), teoretic, doar un fir verde este blocat de o eroare a paginii, deoarece celelalte fire pot ” ridicați slăbiciunea ” (alte fire verzi) se pare … softwareengineering.stackexchange.com/questions/222642/…

Răspuns

Nu va exista niciun beneficiu pentru un cod Java mediu. Java nu este Erlang, iar programatorii Java nu sunt în aceeași mentalitate cu programatorii Erlang. Limbajul nu a fost niciodată destinat să fie folosit în acest fel.

Dacă doriți adevărata procesă ușoară – utilizați Erlang și creați mii de fire de comunicare prin mesaje. În Java veți avea o duzină de fire care partajează o memorie comună cu mutexes și semafoare. Este doar un alt model de programare, conceput pentru un set diferit de probleme.

Comentarii

  • Deci, pentru a clarifica totuși, este o abordare utilă în Erlang. Și, ignorând problemele mentalității Java, ar putea ajuta de fapt?
  • @redjamjar, este puțin probabil pentru a fi util în Java, limbajul în sine nu este destul de potrivit pentru o astfel de utilizare, iar principalul său (și singurul) avantaj – vastul corp de biblioteci gata de utilizare – nu se va potrivi ‘ intră într-o astfel de abordare de programare extraterestră.
  • Da, dacă vrei acel model, folosește Erlang, va fi o ordine de mărime mai ușoară
  • Java! = JVM, spunând doar 🙂
  • @Bane, aceste ” avantaje ” există numai dacă ‘ nu am nimic de comparat

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *