Anche se so che le domande su questo argomento sono già state trattate (ad es. https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), non mi sento come se avessi una risposta soddisfacente.

La domanda è: perché “t JVM” non supporta più i thread verdi?

Si dice questo nelle FAQ Java in stile codice :

Un thread verde si riferisce a una modalità di funzionamento per la Java Virtual Machine (JVM) in cui tutto il codice viene eseguito in un singolo thread del sistema operativo.

E questo su java.sun.com :

Lo svantaggio è che lutilizzo di thread verdi significa che i thread di sistema su Linux non vengono sfruttati e quindi la macchina virtuale Java non è scalabile quando vengono aggiunte CPU aggiuntive.

Mi sembra che la JVM possa avere un pool di processi di sistema pari al numero di core, e quindi eseguire thread verdi in cima a quello. Ciò potrebbe offrire alcuni grandi vantaggi quando si dispone di un numero molto elevato di thread che si bloccano spesso (principalmente perché lattuale JVM “limita il numero di thread).

Pensieri?

Commenti

  • A me la domanda sembra: perché i thread verdi? Perché reintrodurre il multithreading emulandolo a livello di JVM tramite più processi? ‘ è molto doloroso e sovraccarico per apparentemente nessun guadagno diverso dal consentire ai programmatori di essere più generosi con i thread di generazione delle uova (e ‘ non sono convinto che ‘ è un vantaggio).
  • Bene, ‘ è avere un modello di programmazione simultaneo che si adatta. Attualmente, in Java, se si desidera la scalabilità passi a NIO con il tuo pool di thread. Almeno, questo ‘ è di mia comprensione.
  • La presenza di cose come < akka.io > che suppo Anche i thread leggeri di rts mi fanno pensare che sia necessario. In realtà, ho appena trovato una buona discussione qui < stackoverflow.com/questions/7458782/… >
  • @delnan Perché il cambio di contesto per i thread nativi costa. I thread verdi hanno molto meno overhead per il cambio di contesto e le sincronizzazioni tra processi. Inoltre, la quantità di thread verdi è praticamente illimitata (può essere centinaia di migliaia senza troppo stress per il processo VM), mentre la quantità di thread nativi è limitata dal sovraccarico del sistema operativo e della memoria.
  • ha impiegato molto tempo prima che la JVM supportasse direttamente i thread nativi. I thread verdi erano la soluzione intermedia fino ad allora.

Answer

Ricordo che la JVM abbandonava i thread verdi e si spostava a thread nativi. Questo per due semplici ragioni: i thread verdi erano francamente spazzatura e cera la necessità di supportare processori multi-core con lo sforzo limitato dello sviluppatore disponibile su Sun.

È stato un peccato: i thread verdi forniscono un astrazione di gran lunga migliore, consentendo alla concorrenza di essere uno strumento utile e non un ostacolo. Ma i thread verdi non servono se non è possibile superare diversi ostacoli:

  • devono utilizzare tutti i core della cpu a loro disposizione

  • il cambio di contesto deve essere economico

  • LI / O può bloccare qualsiasi thread in esso coinvolto, ma non nessun altro thread e certamente non tutti gli altri thread , che era il caso di alcune delle prime implementazioni.

Mi sono spesso chiesto perché il multi-threading è così difficile in Java, ma ora sta diventando più chiaro: alla fine è stato ha a che fare con il passaggio ai thread nativi, che sono:

  • bravi a usare tutti i core della cpu

  • bravi ad essere veramente simultaneo, fornendo I / O indipendente, ecc.

  • lento nel cambio di contesto (rispetto alle migliori implementazioni del thread verde)

  • orribilmente avido di memoria, limitandone quindi il numero massimo utilizzabile

  • una scarsa astrazione per qualsiasi base per esprimere il mondo reale, che è ovviamente altamente concorrente.

Oggigiorno, a molto del tempo del programmatore ora è dedicato alla codifica di I / O non bloccanti, futures ecc. È “un grande peccato che non abbiamo un livello migliore di astrazione.

Per confronto, oltre a Erlang il nuovo linguaggio Go fa un buon lavoro di enorme concorrenza. Il nonno di tutti loro rimane Occam , ancora un progetto di ricerca in corso.

Commenti

  • quanto siamo andati avanti da quando hai postato: O
  • Ahimè, Rust è un altro linguaggio che ha abbandonato le migliori astrazioni della concorrenza. Anche loro hanno deciso di passare da thread cooperativi a thread nativi.
  • @ Rick-777 Rust è di livello troppo basso per farlo.

Risposta

Un singolo processo che simula più thread ha molti problemi. Uno di questi è che tutti i thread falsi si bloccano su qualsiasi errore di pagina.

Lalternativa che suggerisci, un insieme di processi, ha alcuni vantaggi e alcuni svantaggi. Il vantaggio più grande, lisolamento dei “thread”, non ti porterebbe davvero molto qui. Il grande svantaggio, lestrema difficoltà di implementazione e la sincronizzazione meno efficiente, è il killer qui.

Tuttavia, io sono daccordo sul fatto che esistono alcune applicazioni (non Java) in cui un pool di processi che potresti usare come un pool di thread (ma con più isolamento) sarebbe unottima cosa da avere. I thread condividono praticamente tutto. Con i processi, puoi scegliere specificamente cosa condividere. Per quanto ne so, nessuno si è ancora impegnato per implementarlo.

Commenti

  • Occam afferma di offrire questo. Era un linguaggio significativo negli ‘ anni 80, ma soffriva di mancanza di fondi per lo sviluppo e di conseguenza divenne solo una nicchia di ricerca. Ma le sue idee sulla concorrenza sono solide ora come lo erano allora e devono ancora essere migliorati.
  • Se sei ” multi thread ” al un golang (” M: N ” type scheduling) quindi teoricamente solo un thread verde è bloccato da un errore di pagina perché gli altri thread possono ” riprendi il gioco ” (altri thread verdi) sembra … softwareengineering.stackexchange.com/questions/222642/…

Risposta

Non ci sarà alcun vantaggio per un codice Java medio. Java non è Erlang e i programmatori Java non hanno la stessa mentalità dei programmatori Erlang. La lingua non è mai stata concepita per essere usata in questo modo.

Se vuoi il vero processo leggero, usa Erlang e crea migliaia di thread che comunicano tramite messaggi. In Java avrai una dozzina di thread che condividono una memoria comune con mutex e semafori. È solo un modello di programmazione diverso, progettato per un diverso insieme di problemi.

Commenti

  • Quindi, per chiarire, è un approccio utile a Erlang. E, ignorando i problemi della mentalità Java, potrebbe effettivamente aiutare?
  • @redjamjar, è improbabile per essere utile in Java, il linguaggio stesso non è del tutto adatto a tale uso, e il suo principale (e unico) vantaggio – il vasto corpo di librerie pronte per luso – ha vinto ‘ bene in un approccio di programmazione così alieno.
  • Sì, se vuoi quel modello, usa Erlang, sarà un ordine di grandezza più facile
  • Java! = JVM, solo dicendo 🙂
  • @Bane, questi ” vantaggi ” esistono solo se ‘ non ho niente da confrontare

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *