multithreading - ¿Qué hilos del sistema operativo se utilizan en la máquina abstracta de Erlang, BEAM?
(2)
Empecé a estudiar Erlang y descubro que el entorno de tiempo de ejecución de BEAM es fascinante. Comúnmente se afirma que en Erlang, los procesos pertenecen al lenguaje en lugar del sistema operativo (es decir, el tiempo de ejecución, es decir, BEAM en este caso). Estos son los "procesos verdes" livianos por los que Erlang se está haciendo famoso. Se afirma además (en la página 5 de este documento ) que BEAM usa una (1) hebra de sistema operativo por núcleo de CPU para la programación y otra hebra de sistema operativo para i / o. Entonces me pregunto: ¿de qué hilo provienen los ciclos de CPU necesarios para ejecutar realmente el código de Erlang?
Además, si estoy ejecutando en una máquina de doble núcleo esperaría, de acuerdo con lo que he leído hasta ahora, ver tres (3) subprocesos ejecutándose bajo el proceso BEAM: dos programadores (uno para cada núcleo) y un hilo de E / S. Pero veo 10. Algunas veces 11. A veces comienza a las 13 y, como los amplificadores de alta calidad, va a 11.
Estoy confundido. Cualquier idea será apreciada.
Los procesos de Erlang no son ''verdes'' ya que los hilos son verdes en Java. Los procesos de Erlang son estructuras que no comparten memoria y son mantenidas por Erlang VM.
Puede sonar extraño, pero este documento podría ser "viejo" (aunque bio desde 2007). Todo cambió en torno a la versión R13 cuando obtuvimos un nuevo manejo de las colas de tiempo de ejecución (con material de equilibrio dinámico y otras cosas). Aquí hay una presentación de Ulf Wiger al respecto http://ulf.wiger.net/weblog/2009/01/23/erlang-programming-for-multicore/
En resumen, los procesos son completamente transparentes y puede ajustar el número de colas y planificadores de tiempo de ejecución, pero la realización del sistema operativo no está intacta. No quiero especular por qué hay como 11 de hilos ...
EDITAR: Estoy un poco equivocado sobre OS un poco:
+S Schedulers:SchedulerOnline
Establece la cantidad de subprocesos del planificador para crear y los subprocesos del planificador para establecer en línea cuando se ha habilitado la compatibilidad con SMP.
El rango válido para ambos valores es 1-1024. Si el sistema de tiempo de ejecución de Erlang puede determinar la cantidad de procesadores lógicos configurados y los procesadores lógicos disponibles, los planificadores configurarán por defecto los procesadores lógicos configurados, y
SchedulersOnline
tendrá por defecto procesadores lógicos disponibles; de lo contrario, los valores predeterminados serán 1. Los planificadores pueden omitirse si:SchedulerOnline
no es y viceversa. La cantidad de planificadores en línea se puede cambiar en tiempo de ejecución a través deerlang:system_flag(schedulers_online, SchedulersOnline)
....
Este indicador se ignorará si el emulador no tiene habilitada la compatibilidad SMP (consulte el indicador
-smp
).
desde aquí: http://www.erlang.org/doc/man/erl.html
EDIT2: discusión interesante sobre la lista de correo erlang-question sobre los pros y los contras de muchas máquinas virtuales frente a muchos planificadores. Desafortunadamente también es de 2008 y puede no ser válido con grandes mejoras en las nuevas versiones de OTP. http://www.erlang.org/cgi-bin/ezmlm-cgi?4:mss:38165:200809:nbihpkepgjcfnffkoobf
Siguiendo el consejo de @ user425720, hice mi pregunta sobre las preguntas erlang LISTSERV. También está disponible como un grupo de Google . Kresten Krab Thorup de Trifork me respondió casi de inmediato. Mi agradecimiento por ir a Kreston. Aquí está su respuesta. (Entre paréntesis y énfasis son míos).
Aquí está AFAIK, el escenario básico:
El código de Erlang se ejecutará en tantos "hilos verdes" como procesos; el límite del proceso está controlado por el indicador + P (línea de comando).
Los subprocesos verdes se asignan a subprocesos S, donde S es la cantidad de núcleos / CPU. El hecho de que estos hilos también se denominen programadores puede parecer algo confuso, pero desde el punto de vista de las máquinas virtuales lo son. Desde el punto de vista del desarrollador, son los hilos que ejecutan su código de erlang . El número S se puede controlar con la opción + S a la línea de comando erl.
Además de esto, hay una serie de llamados "hilos de asincronización". Se trata de un grupo de subprocesos que utilizan los procesos de E / S llamados vinculados en controladores para reaccionar a select / poll, etc. El número de subprocesos asynch es dinámico, pero está limitado por el indicador + A.
Entonces, los 11 hilos que ve en un doble núcleo pueden ser 2 programadores y 9 hilos asincrónicos. Por ejemplo.
Lea más sobre las banderas aquí .