Selv om jeg vet har spørsmål om dette allerede blitt dekket (f.eks. https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), jeg føler ikke at jeg har fått et tilfredsstillende svar.

Spørsmålet er: hvorfor støtter ikke JVM lenger grønne tråder?

Det står dette på FAQ med Java-stil i kodestil :

En grønn tråd refererer til en driftsmåte for Java Virtual Machine (JVM) der all kode kjøres i en enkelt operativsystemtråd.

Og dette over på java.sun.com :

Ulempen er at bruk av grønne tråder betyr at systemtråder på Linux ikke blir utnyttet, og at den virtuelle Java-maskinen ikke er skalerbar når flere CPUer legges til.

Det virker for meg at JVM kan ha en pool av systemprosesser lik antall kjerner, og deretter kjøre grønne tråder på toppen av det. Dette kan gi noen store fordeler når du har et veldig stort antall tråder som ofte blokkeres (hovedsakelig fordi gjeldende JVM setter antall tråder).

Tanker?

Kommentarer

  • For meg virker spørsmålet: Hvorfor grønne tråder? Hvorfor gjeninnføre multithreading ved å etterligne det på JVM-nivå via flere prosesser? Det ' mye smerte og overhead for tilsynelatende ingen gevinst annet enn å la programmerere være mer sjenerøse med gytetråder (og jeg ' er ikke overbevist om at ' er en fordel).
  • Vel, det ' handler om å ha en samtidig programmeringsmodell som skalerer. For øyeblikket i Java, hvis du vil skalere du bytter til NIO med din egen trådgruppe. I det minste er ' min forståelse.
  • Tilstedeværelsen av ting som < akka.io > som suppo rts lette tråder får meg til å tro at det er behov. Fant faktisk ganske god diskusjon her < stackoverflow.com/questions/7458782/… >
  • @delnan Fordi kontekstbryter for innfødte tråder koster. Grønne tråder har mye mindre overhead for kontekstbryter og interprosess-synkronisering. I tillegg er mengden av grønne tråder praktisk talt ubegrenset (det kan være hundretusener av dem uten for mye stress for VM-prosessen), mens mengden av innfødte tråder er begrenset av OS og minneoverhead.
  • Det tok lang tid før JVM støttet innfødte tråder direkte. Grønne tråder var den mellomliggende løsningen til da.

Svar

Jeg husker JVM forlot grønne tråder og flyttet til innfødte tråder. Dette var av to enkle grunner: de grønne trådene var ærlig talt søppel, og det var behov for å støtte flerkjerneprosessorer med den begrensede utviklerinnsatsen som er tilgjengelig på Sun.

Dette var synd – grønne tråder gir en langt bedre abstraksjon, slik at samtidighet kan være et nyttig verktøy, ikke en snublestein. Men grønne tråder nytter ikke hvis flere hindringer ikke kan overvinnes:

  • de må bruke alle CPU-kjernene som er tilgjengelige for dem

  • kontekstbytte må være billig

  • I / O kan blokkere hvilken som helst tråd som er involvert i den, men ikke noen annen tråd og absolutt ikke alle andre tråder , noe som var tilfelle i noen tidlige implementeringer.

Jeg har ofte lurt på hvorfor multi-threading er så vanskelig i Java, men det blir nå tydeligere – det var til slutt å gjøre med byttet til innfødte tråder, som er:

  • flinke til å bruke alle CPU-kjernene

  • flinke til å være virkelig samtidig, gir uavhengig I / O osv.

  • sakte ved kontekstbytte (sammenlignet med de beste implementeringene av grønne tråder)

  • fryktelig grådig med hukommelse, og dermed begrense det maksimale brukbare antallet av dem

  • en dårlig abstraksjon for ethvert grunnlag for å uttrykke den virkelige verden, noe som selvfølgelig er veldig samtidig.

I våre dager, a mye av programmererens tid går nå i koding av ikke-blokkerende I / O, futures osv. Det er veldig synd at vi ikke har et bedre abstraksjonsnivå.

For sammenligning, foruten Erlang, gjør det nye Go -språket en god jobb med stor samtidighet. Bestefaren til dem alle er fortsatt Occam , fortsatt et pågående forskningsprosjekt.

Kommentarer

  • hvor langt har vi gått siden du postet: O
  • Alas, Rust er et annet språk som forlot bedre samtidige abstraksjoner. Også de bestemte seg for å gå fra samarbeidstråder til innfødte tråder.
  • @ Rick-777 Rust er for lavt nivå til å gjøre det.

Svar

En enkelt prosess som falsker flere tråder har mange problemer. En av dem er at alle falske tråder holder fast på en hvilken som helst sidefeil.

Alternativet du foreslår, et utvalg av prosesser, har noen fordeler og noen ulemper. Den største fordelen, isolering av «trådene», ville ikke gi deg mye her. Den store ulempen, ekstreme vanskeligheter med implementering og mindre effektiv synkronisering, er deal-killer her.

Imidlertid, jeg er enig i at det finnes noen applikasjoner (ikke Java) der en prosessmasse som du kan bruke som en gruppe tråder (men med mer isolasjon) vil være en god ting å ha. Tråder deler stort sett alt. Med prosesser kan du velg spesifikt hva du vil dele. Så vidt jeg vet, har ingen prøvd å implementere det ennå.

Kommentarer

  • Occam hevder å tilby dette. Det var et viktig språk i ' 80-årene, men led av mangel på utviklingsfinansiering og ble følgelig bare en forskningsnisje. Men ideene om samtidighet er like solide nå som de var den gang og er ennå ikke forbedret.
  • Hvis du er " flertrådet " al en golang (" M: N " type planlegging) så er teoretisk sett bare en grønn tråd blokkert av en sidefeil fordi de andre trådene kan " plukk opp slakken " (andre grønne tråder) det virker … softwareengineering.stackexchange.com/questions/222642/…

Svar

Det vil ikke være noen fordel i det hele tatt for en gjennomsnittlig Java-kode. Java er ikke Erlang, og Java-programmerere er ikke i samme tankesett som Erlang-programmerere. Språket var aldri ment å bli brukt på denne måten.

Hvis du vil ha den ekte, lette prosessen – bruk Erlang og lag tusenvis av tråder som kommuniserer via meldinger. I Java vil du ha et dusin tråder som deler et felles minne med mutexes og semafores. Det er bare en annen programmeringsmodell, designet for et annet sett med problemer.

Kommentarer

  • Så, for å avklare det, er det en nyttig tilnærming i Erlang. Og ignorerer du problemene med Java-tankegangen, kan det faktisk hjelpe?
  • @redjamjar, det er lite sannsynlig for å være nyttig i Java, er språket i seg selv ikke helt egnet for en slik bruk, og dets viktigste (og eneste) fordel – den store mengden klar til bruk biblioteker – vant ' godt inn i en slik fremmed programmeringsmetode.
  • Ja, hvis du vil ha den modellen, bruk bare Erlang, det vil være en størrelsesorden lettere
  • Java! = JVM, bare si 🙂
  • @Bane, disse " fordelene " eksisterer bare hvis du ' har ikke noe å sammenligne

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *