Vaikka tiedän, että tähän liittyvät kysymykset on jo käsitelty (esim. https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), en tunne, että saisin tyydyttävän vastauksen.

Kysymys kuuluu: miksi en enää tue vihreitä ketjuja?

Se kertoo tämän -koodityyppisissä Java-usein kysytyissä kysymyksissä :

Vihreä ketju viittaa Java-virtuaalikoneen (JVM) toimintatilaan, jossa kaikki koodit suoritetaan yhdessä käyttöjärjestelmän ketjussa.

Ja tämä käy läpi java.sun.com :

Haittapuoli on, että vihreiden säikeiden käyttäminen tarkoittaa, että Linuxin järjestelmäketjua ei hyödynnetä, joten Java-virtuaalikone ei ole skaalautuva, kun lisätään lisää suorittimia.

Minusta näyttää siltä, että JVM: llä voisi olla ydinmääriä vastaava järjestelmäprosessien pooli ja suorittaa sen jälkeen vihreitä ketjuja. Tämä voi tarjota suuria etuja, kun sinulla on hyvin suuri määrä säikeitä, jotka estävät usein (lähinnä siksi, että nykyinen JVM rajoittaa ketjujen määrää).

Ajatuksia?

Kommentit

  • Minusta kysymys näyttää olevan: miksi vihreät säikeet? Miksi ottaa uudelleen käyttöön monisäikeisyys emuloimalla sitä JVM-tasolla useiden prosessien kautta? Se ' sa paljon tuskaa ja yleiskustannuksia näennäisesti ilman voittoa, paitsi että ohjelmoijat ovat anteliaampia kutevan langan kanssa (enkä ole ' vakuuttunut siitä, että ' s etu).
  • No, ' on kyse siitä, että sinulla on samanaikainen ohjelmointimalli, joka skaalaa. Tällä hetkellä Java-tilassa, jos haluat skaalautuvuuden vaihdat NIO: han omalla säikeesi poolilla. Ainakin tämä ' ymmärtää minua.
  • Esimerkiksi < akka.io > mikä suppo RTS kevyet langat saavat minut ajattelemaan myös tarvetta. Löysin juuri melko hyvän keskustelun täältä < stackoverflow.com/questions/7458782/… >
  • @delnan Koska natiivien ketjujen kontekstikytkin maksaa. Vihreillä säikeillä on paljon vähemmän yleiskustannuksia kontekstikytkimelle ja prosessien väliselle synkronoinnille. Lisäksi vihreiden säikeiden määrä on käytännössä rajaton (niitä voi olla satoja tuhansia ilman liikaa stressiä VM-prosessille), kun taas natiivien säikeiden määrää rajoittaa käyttöjärjestelmä ja muisti.
  • Se kesti kauan, ennen kuin JVM tuki suoraan alkuperäisiä ketjuja. Vihreät säikeet olivat siihen asti väliratkaisu.

Vastaus

Muistan, että JVM hylkäsi vihreät säikeet ja siirtyi alkuperäiset ketjut. Tämä johtui kahdesta yksinkertaisesta syystä: vihreät säikeet olivat rehellisesti roskaa, ja moniytimisiä prosessoreita oli tarpeen tukea Sunin käytettävissä olevilla rajoitetuilla kehittäjien ponnisteluilla.

Tämä oli sääli – vihreät langat tarjoavat paljon parempi abstraktio, jolloin samanaikaisuus on hyödyllinen työkalu eikä kompastuskivi. Vihreistä säikeistä ei kuitenkaan ole hyötyä, jos useita esteitä ei voida voittaa:

  • heidän on käytettävä kaikkia käytettävissä olevia suorittimen ytimiä

  • kontekstivaihdon on oltava halpaa

  • I / O voi estää kaikki siihen kytketyt ketjut, mutta ei muita ketjuja eikä varmasti kaikkia muita ketjuja , mikä tapahtui joissakin varhaisissa toteutuksissa.

Olen usein miettinyt, miksi monisäikeisyys on niin vaikeaa Javalassa, mutta se on nyt tulossa selvemmäksi – se oli viime kädessä liittyy siirtymiseen natiiviketjuihin, jotka ovat:

  • hyvä käyttää kaikkia suorittimen ytimiä

  • hyvä olla todella samanaikainen, tarjoaa itsenäisen I / O: n jne.

  • hidas kontekstivaihdossa (verrattuna parhaisiin vihreän langan toteutuksiin)

  • kauheasti ahne muistin kanssa, mikä rajoittaa niiden käyttökelpoista enimmäismäärää

  • huono abstraktio millä tahansa pohjalla todellisen maailman ilmaisemiseksi, mikä on tietysti erittäin samanaikaista.

Nykyään a Paljon ohjelmoijan aikaa menee nyt estämättömien I / O: n, futuurien jne. koodaamiseen. Se ”ei ole suurta häpeää, että meillä ei ole parempaa abstraktiotasoa.

Vertailun lisäksi Erlangin lisäksi uusi Go kieli tekee hyvää ja valtavaa samanaikaisuutta. Heidän kaikkien isoisänsä on edelleen Occam , edelleen käynnissä oleva tutkimusprojekti.

Kommentit

  • kuinka pitkälle olemme menneet julkaisuhetkestäsi lähtien: O
  • Valitettavasti ruoste on toinen kieli, joka hylkäsi paremmat samanaikaisuuden abstraktit. Myös he päättivät siirtyä osuuskunnan ketjuista alkuperäisiin ketjuihin.
  • @ Rick-777 Rust on liian matala siihen.

vastaus

Yhdellä prosessilla, joka väärentää useita ketjuja, on paljon ongelmia. Yksi niistä on, että kaikki väärennetyt säikeet pysähtyvät missä tahansa sivuvirheessä.

Ehdotamallasi vaihtoehdolla, prosessien joukolla, on joitain etuja ja joitain haittoja. Suurin etu, ”säikeiden” eristäminen, ei todellakaan tuota sinua paljon tänne. Suuri haitta, äärimmäinen toteutusvaikeus ja vähemmän tehokas synkronointi ovat täällä tappaja.

Olen kuitenkin olet samaa mieltä siitä, että on olemassa joitain sovelluksia (ei Java), joissa prosessien joukko, jota voit käyttää kuin ketjujen joukko (mutta enemmän eristettyjä), olisi hieno asia. Langat jakavat melkein kaiken. Prosesseilla voit Valitse erityisesti mitä jakaa. Tietojeni mukaan kukaan ei ole vielä pyrkinyt toteuttamaan sitä.

Kommentit

  • Occam väittää tarjoavansa tätä. Se oli merkittävä kieli ' 80-luvulla, mutta kärsi kehitysrahoituksen puutteesta ja siitä tuli siten vain tutkimustekniikka. Mutta sen ajatukset samanaikaisuudesta ovat yhtä vankat nyt kuin silloin ja niitä on vielä parannettava.
  • Jos olet " monisäikeinen " al golang (" M: N " -tyyppinen aikataulutus), sitten teoriassa vain yksi vihreä ketju on sivuvian estämä, koska muut ketjut voivat " poimi löysä " (muut vihreät langat) näyttää … softwareengineering.stackexchange.com/questions/222642/…

Vastaa

Keskimääräiselle Java-koodille ei tule mitään hyötyä. Java ei ole Erlang, ja Java-ohjelmoijat eivät ole samassa ajattelutavassa kuin Erlang-ohjelmoijat. Kieltä ei koskaan ollut tarkoitus käyttää tällä tavalla.

Jos haluat aidon kevyen prosessorin – käytä Erlangia ja luo tuhansia viestiketjuin viestiviä ketjuja. Java-ohjelmassa sinulla on tusina säiettä, jotka jakavat yhteisen muistin muteksien ja semaforien kanssa. Se on vain erilainen ohjelmointimalli, joka on suunniteltu erilaisille ongelmille.

Kommentit

  • Selvennykseksi se on kuitenkin hyödyllinen lähestymistapa Erlangissa. Ja jättäen Java-ajattelutavan ongelmat huomiotta, se voisi todella auttaa?
  • @redjamjar, on epätodennäköistä Jotta kieli olisi hyödyllinen Java-kielessä, se ei itsessään sovi tällaiseen käyttöön, ja sen tärkein (ja ainoa) etu – valtava käyttövalmiiden kirjastojen joukko – ei sopinut ' t hyvin tällaiseen muukalaisohjelmointiin.
  • Joo, jos haluat kyseisen mallin, käytä vain Erlangia, se on suuruusluokkaa helpompaa
  • Java! = JVM, sanomalla 🙂
  • @Bane, nämä " edut " ovat olemassa vain, jos ' ve: llä ei ole mitään vertailukelpoista

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *