¿Por qué no hilos verdes?

33

Si bien sé que las preguntas sobre esto ya se han cubierto (por ejemplo, https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), no creo que tenga una respuesta satisfactoria .

La pregunta es: ¿por qué JVM ya no admite hilos verdes?

Dice esto en las preguntas frecuentes de Java de estilo de código :

Un subproceso verde se refiere a un modo de operación para la Máquina virtual Java (JVM) en el que todo el código se ejecuta en un solo subproceso del sistema operativo.

Y esto terminó en java.sun.com :

La desventaja es que el uso de hilos verdes significa que no se aprovechan los hilos del sistema en Linux, por lo que la máquina virtual Java no es escalable cuando se agregan CPU adicionales.

Me parece que la JVM podría tener un grupo de procesos del sistema igual al número de núcleos, y luego ejecutar hilos verdes además de eso. Esto podría ofrecer grandes ventajas cuando tiene una gran cantidad de subprocesos que se bloquean con frecuencia (principalmente porque la JVM actual limita el número de subprocesos).

Pensamientos?

redjamjar
fuente
55
Para mí, la pregunta parece: ¿por qué hilos verdes? ¿Por qué reintroducir el subprocesamiento múltiple emulándolo a nivel JVM a través de múltiples procesos? Es mucho dolor y sobrecarga por aparentemente no tener otra ganancia que no sea permitir que los programadores sean más generosos con los hilos de desove (y no estoy convencido de que sea una ventaja).
44
Bueno, se trata de tener un modelo de programación concurrente que escala. Actualmente, en Java, si desea escalabilidad, cambie a NIO con su propio grupo de subprocesos. Al menos, eso entiendo.
redjamjar
3
La presencia de cosas como < akka.io > que admite hilos ligeros también me hace pensar que es necesario. En realidad, acabo de encontrar una buena discusión aquí < stackoverflow.com/questions/7458782/… >
redjamjar
2
@delnan Porque el cambio de contexto para los hilos nativos cuesta. Los subprocesos verdes tienen mucha menos sobrecarga para el cambio de contexto y las sincronizaciones entre procesos. Además, la cantidad de subprocesos verdes es prácticamente ilimitada (pueden ser cientos de miles de ellos sin demasiado estrés para el proceso de VM), mientras que la cantidad de subprocesos nativos está restringida por el SO y la sobrecarga de memoria.
permeakra
Pasó mucho tiempo antes de que la JVM admitiera subprocesos nativos directamente. Hilos verdes fue la solución intermedia hasta entonces.
Thorbjørn Ravn Andersen

Respuestas:

29

Recuerdo que la JVM abandonó los hilos verdes y se mudó a los hilos nativos. Esto fue por dos razones simples: los hilos verdes eran francamente basura, y había una necesidad de soportar procesadores de múltiples núcleos con el esfuerzo limitado del desarrollador disponible en Sun.

Esto fue una lástima: los hilos verdes proporcionan una abstracción mucho mejor, permitiendo que la concurrencia sea una herramienta útil, no un obstáculo. Pero los hilos verdes no sirven de nada si no se pueden superar varios obstáculos:

  • deben usar todos los núcleos de CPU disponibles para ellos

  • el cambio de contexto debe ser barato

  • I / O puede bloquear cualquier subproceso involucrado en él, pero no cualquier otro subproceso y ciertamente no todos los demás subprocesos, que fue el caso en algunas implementaciones tempranas.

A menudo me he preguntado por qué el subprocesamiento múltiple es tan difícil en Java, pero ahora se está volviendo más claro: en última instancia, tuvo que ver con el cambio a hilos nativos, que son:

  • bueno en el uso de todos los núcleos de la CPU

  • bueno para ser verdaderamente concurrente, proporcionar E / S independientes, etc.

  • lento en el cambio de contexto (en comparación con las mejores implementaciones de hilo verde)

  • horriblemente codicioso con la memoria, lo que limita el número máximo utilizable de ellos

  • Una pobre abstracción para cualquier base para expresar el mundo real, que es muy concurrente, por supuesto.

Hoy en día, se dedica mucho tiempo al programador a codificar E / S sin bloqueo, futuros, etc. Es una lástima que no tengamos un mejor nivel de abstracción.

A modo de comparación, además de Erlang, el nuevo lenguaje Go hace un buen trabajo de gran concurrencia. El abuelo de todos ellos sigue siendo Occam , todavía un proyecto de investigación en curso.

Rick-777
fuente
hasta dónde hemos llegado desde el momento en que publicaste: O
Dmitry
3
Por desgracia, Rust es otro idioma que abandonó las mejores abstracciones de concurrencia. También decidieron pasar de hilos cooperativos a hilos nativos.
Rick-777
2
@ Rick-777 Rust tiene un nivel demasiado bajo para hacerlo.
Malcolm
15

Un solo proceso que simula múltiples hilos tiene muchos problemas. Una de ellas es que todos los hilos falsos se bloquean en cualquier falla de página.

La alternativa que sugiere, un conjunto de procesos, tiene algunas ventajas y algunas desventajas. La mayor ventaja, el aislamiento de los 'hilos', realmente no te traería mucho aquí. La gran desventaja, la extrema dificultad de implementación y la sincronización menos eficiente, es el factor decisivo aquí.

Sin embargo, estoy de acuerdo en que existen algunas aplicaciones (no Java) donde un conjunto de procesos que podría usar como un conjunto de subprocesos (pero con más aislamiento) sería algo genial. Los hilos comparten casi todo. Con los procesos, puede elegir específicamente qué compartir. Que yo sepa, nadie se ha esforzado por implementarlo todavía.

David Schwartz
fuente
Occam dice ofrecer esto. Era un lenguaje importante en los años 80, pero sufría de falta de fondos para el desarrollo y, en consecuencia, se convirtió en un nicho de investigación solamente. Pero sus ideas sobre la concurrencia son tan sólidas ahora como lo eran entonces y aún no se han mejorado.
Rick-777
Si usted es "multihilo" a la golang (programación tipo "M: N"), teóricamente, solo un hilo verde está bloqueado por un fallo de página porque los otros hilos pueden "recoger la holgura" (otros hilos verdes) parece. .. softwareengineering.stackexchange.com/questions/222642/…
rogerdpack
13

No habrá ningún beneficio para un código Java promedio. Java no es Erlang, y los programadores de Java no tienen la misma mentalidad que los programadores de Erlang. El lenguaje nunca fue pensado para ser usado de esta manera.

Si desea los verdaderos procesos livianos, use Erlang y cree miles de hilos que se comuniquen a través de mensajes. En Java, tendrá una docena de hilos que comparten una memoria común con mutexes y semáforos. Es solo un modelo de programación diferente, diseñado para un conjunto diferente de problemas.

SK-logic
fuente
Sin embargo, para aclarar, es un enfoque útil en Erlang. Y, ignorando los problemas de la mentalidad de Java, ¿podría realmente ayudar?
redjamjar
1
@redjamjar, es poco probable que sea útil en Java, el lenguaje en sí mismo no es muy adecuado para tal uso, y su principal (y única) ventaja, el vasto cuerpo de bibliotecas listas para usar, no encajará bien en un entorno tan extraño enfoque de programación
SK-logic
Sí, si quieres ese modelo, solo usa Erlang, será un orden de magnitud más fácil
Zachary K
1
Java! = JVM, solo diciendo :)
Kamil Tomšík
1
@Bane, estas "ventajas" solo existen si no tienes nada para comparar
SK-logic