Caratteristiche di Erlang
Da Erlang Programming (2009):
La concorrenza di Erlang è veloce e scalabile. I suoi processi sono leggeri in quanto la macchina virtuale Erlang non crea un thread del sistema operativo per ogni processo creato. Vengono creati, pianificati e gestiti nella VM, indipendentemente dal sistema operativo sottostante. Di conseguenza, il tempo di creazione del processo è dell'ordine dei microsecondi e indipendente dal numero di processi esistenti contemporaneamente. Confronta questo con Java e C #, dove per ogni processo viene creato un thread del sistema operativo sottostante: otterrai alcuni confronti molto competitivi, con Erlang che supera notevolmente entrambe le lingue.
Dalla programmazione orientata alla concorrenza in Erlang (pdf) (diapositive) (2003):
Osserviamo che il tempo impiegato per creare un processo Erlang è costante 1µs fino a 2.500 processi; successivamente aumenta a circa 3µs per un massimo di 30.000 processi. Le prestazioni di Java e C # sono mostrate nella parte superiore della figura. Per un numero limitato di processi sono necessari circa 300 µs per creare un processo. La creazione di oltre duemila processi è impossibile.
Vediamo che per un massimo di 30.000 processi il tempo per inviare un messaggio tra due processi Erlang è di circa 0,8 µs. Per C # sono necessari circa 50 µs per messaggio, fino al numero massimo di processi (che era di circa 1800 processi). Java era anche peggio, per un massimo di 100 processi ci sono voluti circa 50 µs per messaggio, successivamente è aumentato rapidamente a 10 ms per messaggio quando c'erano circa 1000 processi Java.
I miei pensieri
Tecnicamente non capisco perfettamente perché i processi Erlang siano molto più efficienti nel generare nuovi processi e abbiano impronte di memoria molto più piccole per processo. Sia il sistema operativo che la VM Erlang devono eseguire la pianificazione, i cambi di contesto e tenere traccia dei valori nei registri e così via ...
Semplicemente perché i thread del sistema operativo non sono implementati allo stesso modo dei processi in Erlang? Devono supportare qualcosa in più? E perché hanno bisogno di un footprint di memoria maggiore? E perché hanno una generazione e una comunicazione più lente?
Tecnicamente, perché i processi in Erlang sono più efficienti dei thread del sistema operativo quando si tratta di spawn e comunicazione? E perché i thread nel sistema operativo non possono essere implementati e gestiti nello stesso modo efficiente? E perché i thread del sistema operativo hanno un footprint di memoria maggiore, oltre a una generazione e una comunicazione più lente?
Più lettura
erl +P 1000100 +hms 100
e quindi digita {_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
e quindi attendi circa tre minuti per il risultato. È così semplice Richiede 140us per processo e 1 GB di RAM intera sul mio laptop. Ma è direttamente dalla shell, dovrebbe essere migliore dal codice compilato.