Las características de Erlang
De Erlang Programming (2009):
La concurrencia de Erlang es rápida y escalable. Sus procesos son livianos, ya que la máquina virtual Erlang no crea un subproceso de sistema operativo para cada proceso creado. Se crean, programan y manejan en la VM, independientemente del sistema operativo subyacente. Como resultado, el tiempo de creación del proceso es del orden de microsegundos e independiente del número de procesos concurrentes existentes. Compare esto con Java y C #, donde para cada proceso se crea un subproceso subyacente del sistema operativo: obtendrá algunas comparaciones muy competitivas, con Erlang superando en gran medida ambos idiomas.
De la programación orientada a la concurrencia en Erlang (pdf) (diapositivas) (2003):
Observamos que el tiempo necesario para crear un proceso Erlang es constante de 1 µs hasta 2.500 procesos; a partir de entonces aumenta a aproximadamente 3 µs para hasta 30,000 procesos. El rendimiento de Java y C # se muestra en la parte superior de la figura. Para un pequeño número de procesos, se necesitan unos 300 µs para crear un proceso. Crear más de dos mil procesos es imposible.
Vemos que para hasta 30,000 procesos, el tiempo para enviar un mensaje entre dos procesos Erlang es de aproximadamente 0.8 µs. Para C #, se necesitan aproximadamente 50 µs por mensaje, hasta el número máximo de procesos (que fue aproximadamente 1800 procesos). Java fue aún peor, para hasta 100 procesos, tardó aproximadamente 50 µs por mensaje a partir de entonces aumentó rápidamente a 10 ms por mensaje cuando hubo aproximadamente 1000 procesos Java.
Mis pensamientos
Técnicamente, no entiendo completamente por qué los procesos de Erlang son mucho más eficientes para generar nuevos procesos y tienen huellas de memoria mucho más pequeñas por proceso. Tanto el sistema operativo como la máquina virtual Erlang tienen que hacer programación, cambios de contexto y realizar un seguimiento de los valores en los registros, etc.
Simplemente, ¿por qué los hilos del sistema operativo no se implementan de la misma manera que los procesos en Erlang? ¿Tienen que apoyar algo más? ¿Y por qué necesitan una mayor huella de memoria? ¿Y por qué tienen un desove y una comunicación más lentos?
Técnicamente, ¿por qué los procesos en Erlang son más eficientes que los hilos del sistema operativo cuando se trata de desove y comunicación? ¿Y por qué no se pueden implementar y administrar subprocesos en el sistema operativo de la misma manera eficiente? ¿Y por qué los subprocesos del sistema operativo tienen una mayor huella de memoria, además de una reproducción y comunicación más lenta?
Más lectura
erl +P 1000100 +hms 100
y luego escriba {_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
y espere unos tres minutos para obtener el resultado. Eso es muy simple. Se necesitan 140us por proceso y 1GB de RAM completa en la computadora portátil mía. Pero es directamente de shell, debería ser mejor a partir del código compilado.