Perché non fili verdi?


33

Mentre so che le domande su questo sono già state trattate (ad es. Https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), non mi sento di avere una risposta soddisfacente .

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

Lo dice nelle FAQ Java in stile codice :

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

E questo su java.sun.com :

Il rovescio della medaglia è che l'uso 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 su di esso. Ciò potrebbe offrire alcuni grandi vantaggi quando si dispone di un numero molto elevato di thread che si bloccano spesso (principalmente perché l'attuale numero di thread è limitato a JVM).

Pensieri?


5
A me la domanda sembra: perché i fili verdi? Perché reintrodurre il multithreading emulandolo a livello JVM attraverso più processi? È un sacco di dolore e spese generali per apparentemente nessun guadagno se non quello di consentire ai programmatori di essere più generosi con i thread di generazione (e non sono convinto che sia un vantaggio).

4
Bene, si tratta di avere un modello di programmazione concorrente che si ridimensiona. Attualmente, in Java, se si desidera la scalabilità, si passa a NIO con il proprio pool di thread. Almeno, questa è la mia comprensione.
Redjamjar,

3
La presenza di cose come < akka.io > che supporta fili leggeri mi fa pensare che sia necessario. In realtà, appena trovato piuttosto una buona discussione qui < stackoverflow.com/questions/7458782/... >
redjamjar

2
@delnan Perché il cambio di contesto per i costi dei thread nativi. I thread verdi hanno un sovraccarico molto minore per i cambi di contesto e le sincronizzazioni tra processi. Inoltre, la quantità di thread verdi è praticamente illimitata (può essere centinaia di migliaia di essi senza troppa sollecitazione per il processo VM), mentre la quantità di thread nativi è limitata dal sistema operativo e dall'overhead di memoria.
permeakra,

Ci è voluto molto tempo prima che JVM supportasse direttamente i thread nativi. I fili verdi erano la soluzione intermedia fino ad allora.
Thorbjørn Ravn Andersen,

Risposte:


29

Ricordo la JVM che abbandonava i thread verdi e si spostava sui thread nativi. Questo per due semplici motivi: i fili verdi erano francamente spazzatura e c'era la necessità di supportare processori multi-core con il limitato impegno degli sviluppatori disponibile su Sun.

È stato un peccato: i fili verdi forniscono un'astrazione molto migliore, consentendo alla concorrenza di essere uno strumento utile non un ostacolo. Ma i fili verdi non servono se non si possono superare diversi ostacoli:

  • devono usare tutti i core della CPU a loro disposizione

  • il cambio di contesto deve essere economico

  • L'I / O può bloccare qualsiasi thread impegnato in esso, ma non qualsiasi altro thread e certamente non tutti gli altri thread, come in alcune prime implementazioni.

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

  • bravo a usare tutti i core della CPU

  • bravo ad essere veramente concorrente, fornendo I / O indipendente ecc

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

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

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

Al giorno d'oggi, un sacco di tempo del programmatore ora passa alla codifica di I / O non bloccanti, futures ecc. È un vero peccato non avere un migliore livello di astrazione.

Per fare un confronto, oltre a Erlang la nuova lingua Go fa un buon lavoro di enorme concorrenza. Il nonno di loro rimane Occam , ancora un progetto di ricerca in corso.


fino a che punto siamo andati dal momento in cui hai pubblicato: O
Dmitry

3
Purtroppo, Rust è un'altra lingua che ha abbandonato le astrazioni di concorrenza migliore. Anche loro decisero di passare da fili cooperativi a fili nativi.
Rick-777,

2
@ Rick-777 Rust è troppo basso livello per farlo.
Malcolm,

15

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

L'alternativa che suggerisci, un pool di processi, presenta alcuni vantaggi e alcuni svantaggi. Il più grande vantaggio, l'isolamento dei "thread", in realtà non ti farebbe guadagnare molto qui. Il grande svantaggio, l'estrema difficoltà di implementazione e la sincronizzazione meno efficiente, è il killer qui.

Tuttavia, sono d'accordo sul fatto che esistano alcune applicazioni (non Java) in cui un pool di processi che è possibile utilizzare come un pool di thread (ma con maggiore isolamento) sarebbe un'ottima cosa da avere. Le discussioni condividono praticamente tutto. Con i processi, puoi scegliere in modo specifico cosa condividere. Per quanto ne sappia, nessuno ha ancora tentato di implementarlo.


Occam afferma di offrire questo. Era un linguaggio significativo negli anni '80, ma soffriva della mancanza di finanziamenti 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 migliorate.
Rick-777,

Se si è "multi-thread" a la golang (programmazione di tipo "M: N"), in teoria solo un thread verde viene bloccato da un errore di pagina perché gli altri thread possono "captare il gioco" (altri thread verdi). .. softwareengineering.stackexchange.com/questions/222642/…
rogerdpack

13

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 pensata per essere utilizzata 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 diverso modello di programmazione, progettato per una diversa serie di problemi.


Quindi, per chiarire, è un approccio utile in Erlang. E, ignorando i problemi della mentalità Java, potrebbe davvero aiutare?
Redjamjar,

1
@redjamjar, è improbabile che sia utile in Java, il linguaggio stesso non è del tutto adatto a tale uso e il suo principale (e unico) vantaggio - il vasto corpus di librerie pronte all'uso - non si adatta bene a un tale alieno approccio di programmazione.
SK-logic,

Sì, se vuoi quel modello, usa solo Erlang, sarà un ordine di grandezza più semplice
Zachary K

1
Java! = JVM, sto solo dicendo :)
Kamil Tomšík,

1
@Bane, questi "vantaggi" esistono solo se non hai nulla da confrontare
SK-logic,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.