Selvom jeg ved, er spørgsmål om dette allerede blevet dækket (f.eks. https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), jeg føler ikke, at jeg har fået et tilfredsstillende svar.

Spørgsmålet er: hvorfor understøtter ikke JVMs grønne tråde længere?

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

En grøn tråd refererer til en driftsform for Java Virtual Machine (JVM), hvor al kode udføres i en enkelt operativsystemtråd.

Og dette slut på java.sun.com :

Ulempen er, at brugen af grønne tråde betyder, at systemtråde på Linux ikke udnyttes, og at den virtuelle Java-maskine ikke kan skaleres, når yderligere CPUer tilføjes.

Det forekommer mig, at JVM kunne have en pulje af systemprocesser svarende til antallet af kerner og derefter køre grønne tråde oven på det. Dette kan give nogle store fordele, når du har et meget stort antal tråde, som ofte blokerer (for det meste fordi den nuværende JVM “sætter antallet af tråde”).

Tanker?

Kommentarer

  • For mig ser spørgsmålet ud: Hvorfor grønne tråde? Hvorfor genindføre multithreading ved at efterligne det på JVM-niveau via flere processer? Det ' meget smerte og overhead for tilsyneladende ingen gevinst ud over at lade programmører være mere generøse med gydetråde (og jeg ' er ikke overbevist om, at ' er en fordel).
  • Nå, det ' handler om at have en samtidig programmeringsmodel, der skaleres. I øjeblikket i Java, hvis du vil skalere du skifter til NIO med din egen trådpulje. I det mindste er ' min forståelse.
  • Tilstedeværelsen af ting som < akka.io > hvilket suppo rts lette tråde får mig også til at tro, at der er behov. Faktisk fandt jeg bare en god diskussion her < stackoverflow.com/questions/7458782/… >
  • @delnan Fordi kontekstskift til native threads koster. Grønne tråde har meget mindre omkostninger til kontekstskift og interprocess-synkronisering. Derudover er mængden af grønne tråde praktisk talt ubegrænset (det kan være hundreder af tusinder af dem uden for meget stress for VM-processen), mens mængden af indfødte tråde er begrænset af OS og hukommelsesoverhead.
  • Det tog lang tid, før JVM understøttede indfødte tråde direkte. Grønne tråde var den mellemliggende løsning indtil da.

Svar

Jeg husker, at JVM opgav grønne tråde og flyttede til indfødte tråde. Dette var af to enkle grunde: de grønne tråde var ærligt talt skrald, og der var behov for at støtte multi-core processorer med den begrænsede udviklerindsats, der er tilgængelig hos Sun.

Dette var en skam – grønne tråde giver en langt bedre abstraktion, så samtidighed kan være et nyttigt værktøj ikke en snublesten. Men grønne tråde nytter ikke, hvis flere forhindringer ikke kan overvindes:

  • de skal bruge alle de tilgængelige CPU-kerner

  • kontekstskift skal være billigt

  • I / O kan blokere enhver tråd, der er involveret i den, men ikke nogen anden tråd og bestemt ikke alle andre tråde , hvilket var tilfældet i nogle tidlige implementeringer.

Jeg har ofte spekuleret på, hvorfor multi-threading er så hårdt i Java, men det bliver nu klarere – det var i sidste ende at gøre med skiftet til indfødte tråde, som er:

  • gode til at bruge alle CPU-kerner

  • gode til at være virkelig samtidig giver uafhængig I / O osv.

  • langsom ved kontekstskift (sammenlignet med de bedste implementeringer af grøn tråd)

  • forfærdeligt grådig med hukommelse og dermed begrænse det maksimale anvendelige antal af dem

  • en dårlig abstraktion for ethvert grundlag for at udtrykke den virkelige verden, hvilket naturligvis er meget samtidig.

I dag er en masse af programmørtid går nu i kodning af ikke-blokerende I / O, futures osv. Det er en stor skam, at vi ikke har et bedre abstraktionsniveau.

For sammenligning udover Erlang gør det nye Go sprog et godt stykke arbejde med stor samtidighed. Bedstefar af dem alle forbliver Occam , stadig et igangværende forskningsprojekt.

Kommentarer

  • hvor langt er vi gået siden det tidspunkt, du postede: O
  • Ak, Rust er et andet sprog, der opgav bedre abstraktioner i samtidighed. De besluttede også at flytte fra kooperative tråde til native tråde.
  • @ Rick-777 Rust er for lavt niveau til at gøre det.

Svar

En enkelt proces, der fejler flere tråde, har mange problemer. En af dem er, at alle de falske tråde holder fast ved enhver sidefejl.

Det alternativ, du foreslår, en pulje af processer, har nogle fordele og nogle ulemper. Den største fordel, isolering af “tråde”, ville virkelig ikke give dig meget her. Den store ulempe, ekstreme vanskeligheder ved implementering og mindre effektiv synkronisering, er deal-killer her.

Men jeg er enig i, at der findes nogle applikationer (ikke Java), hvor en pool af processer, som du kunne bruge som en pool af tråde (men med mere isolation) ville være en god ting at have. Tråde deler stort set alt. Med processer kan du vælg specifikt hvad du vil dele. Efter min viden har ingen gjort noget for at implementere det endnu.

Kommentarer

  • Occam hævder at tilbyde dette. Det var et betydningsfuldt sprog i ' 80erne, men led af mangel på udviklingsfinansiering og blev derfor kun en forskningsniche. Men dets ideer om samtidighed er lige så solide nu som de var dengang og er endnu ikke forbedret.
  • Hvis du er " multi-threaded " al en golang (" M: N " type planlægning) så er teoretisk kun en grøn tråd blokeret af en sidefejl, fordi de andre tråde kan " saml op " (andre grønne tråde) det ser ud til … softwareengineering.stackexchange.com/questions/222642/…

Svar

Der vil slet ikke være nogen fordel for en gennemsnitlig Java-kode. Java er ikke Erlang, og Java-programmører har ikke samme tankegang som Erlang-programmører. Sproget var aldrig beregnet til at blive brugt på denne måde.

Hvis du vil have den ægte lette procesproces – brug Erlang og opret tusindvis af tråde, der kommunikerer via beskeder. I Java har du et dusin tråde, der deler en fælles hukommelse med mutexes og semafhores. Det er bare en anden programmeringsmodel, der er designet til et andet sæt problemer.

Kommentarer

  • Så for at præcisere det er det en nyttig tilgang i Erlang. Og ignorerer problemerne med Java-tankegangen, kan det faktisk hjælpe?
  • @redjamjar, det er usandsynligt for at være nyttigt i Java, er selve sproget ikke helt egnet til en sådan brug, og dets vigtigste (og eneste) fordel – den store mængde klar til brug biblioteker – vandt ' t fit godt ind i en sådan fremmed programmeringsmetode.
  • Ja, hvis du vil have den model, skal du bare bruge Erlang, det vil være en størrelsesorden lettere
  • Java! = JVM, bare sige 🙂
  • @Bane, disse " fordele " findes kun, hvis du ' ve har intet at sammenligne

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *