Si bien sé que las preguntas sobre este tema ya se han tratado (por ejemplo, https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), no siento que tenga una respuesta satisfactoria.
La pregunta es: ¿por qué las JVM ya no son compatibles con los hilos verdes?
Dice esto en las preguntas frecuentes sobre Java de estilo de código :
Un hilo verde se refiere a un modo de funcionamiento de la máquina virtual Java (JVM) en el que todo el código se ejecuta en un único hilo del sistema operativo.
Y esto en java.sun.com :
La desventaja es que el uso de subprocesos verdes significa que los subprocesos del sistema en Linux no se aprovechan y, por lo tanto, 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 encima de eso. Esto podría ofrecer grandes ventajas cuando tiene una gran cantidad de subprocesos que se bloquean con frecuencia (principalmente porque las JVM actuales limitan el número de subprocesos).
¿Qué piensa?
Comentarios
- Para mí, la pregunta parece: ¿Por qué los hilos verdes? ¿Por qué reintroducir el multihilo emulándolo a nivel de JVM a través de múltiples procesos? Es ‘ es una gran cantidad de dolor y gastos generales aparentemente sin otra ganancia que permitir que los programadores sean más generosos con los hilos de generación (y yo ‘ no estoy convencido de que ‘ es una ventaja).
- Bueno, es ‘ tener un modelo de programación concurrente que escala. Actualmente, en Java, si quieres escalabilidad cambia a NIO con su propio grupo de subprocesos. Al menos, eso ‘ es mi entendimiento.
- La presencia de cosas como < akka.io > que suppo rts livianos hilos también me hace pensar que hay una necesidad. En realidad, acabo de encontrar una buena discusión aquí < stackoverflow.com/questions/7458782/… >
- @delnan Porque el cambio de contexto para subprocesos nativos cuesta. Los hilos 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 sin demasiado estrés para el proceso de VM), mientras que la cantidad de subprocesos nativos está restringida por el sistema operativo y la sobrecarga de memoria.
- Pasó mucho tiempo antes de que la JVM admitiera subprocesos nativos directamente. Los hilos verdes eran la solución intermedia hasta entonces.
Respuesta
Recuerdo que la JVM abandonó los hilos verdes y se movió a hilos nativos. Esto fue por dos razones simples: los hilos verdes eran francamente basura, y existía la necesidad de admitir procesadores de múltiples núcleos con el esfuerzo de desarrollador limitado disponible en Sun.
Esto fue una pena – los hilos verdes proporcionan una una abstracción mucho mejor, lo que permite que la concurrencia sea una herramienta útil y 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
-
el cambio de contexto debe ser barato
-
La E / S puede bloquear cualquier hilo involucrado en él, pero no ningún otro hilo y ciertamente no todos los demás hilos , que fue el caso en algunas implementaciones tempranas.
A menudo me he preguntado por qué el multihilo es tan difícil en Java, pero ahora se está volviendo más claro – finalmente fue que ver con el cambio a subprocesos nativos, que son:
-
buenos para usar todos los núcleos de la CPU
-
buenos para ser realmente concurrente, proporcionando E / S independiente, etc.
-
lento en el cambio de contexto (en comparación con las mejores implementaciones de hilo verde)
-
horriblemente codiciosos de memoria, por lo que se limita el número máximo utilizable de ellos
-
una abstracción pobre para cualquier base para expresar el mundo real, que es muy concurrente por supuesto.
Hoy en día, un Mucho del tiempo del programador ahora se dedica a codificar E / S sin bloqueo, futuros, etc. Es una gran lástima que no tengamos un mejor nivel de abstracción.
Para En 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.
Comentarios
- hasta dónde hemos llegado desde el momento en que publicaste: O
- Por desgracia, Rust es otro lenguaje que abandonó las mejores abstracciones de concurrencia. Ellos también decidieron pasar de los hilos cooperativos a los hilos nativos.
- @ Rick-777 Rust tiene un nivel demasiado bajo para hacer eso.
Responder
Un solo proceso que falsifica varios subprocesos tiene muchos problemas. Una de ellas es que todos los hilos falsificados se bloquean en cualquier página con fallas.
La alternativa que sugieres, un conjunto de procesos, tiene algunas ventajas y algunas desventajas. La mayor ventaja, el aislamiento de los «subprocesos», realmente no le proporcionarí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, yo Estoy de acuerdo en que existen algunas aplicaciones (no Java) donde un grupo de procesos que podría usar como un grupo de subprocesos (pero con más aislamiento) sería una gran cosa para tener. Los subprocesos comparten prácticamente todo. Con los procesos, puede elegir específicamente qué compartir. Que yo sepa, nadie se ha esforzado por implementarlo todavía.
Comentarios
- Occam afirma ofrecer esto. Era un lenguaje importante en los ‘ 80, pero adolecía de falta de financiación para el desarrollo y, en consecuencia, se convirtió en un nicho de investigación únicamente. Pero sus ideas sobre la concurrencia son tan sólidas ahora como lo eran entonces y aún no se han mejorado.
- Si es » multihilo » al una programación de tipo golang (» M: N «) entonces, teóricamente, solo un hilo verde está bloqueado por un error de página porque los otros hilos pueden » toma el relevo » (otros hilos verdes) parece … softwareengineering.stackexchange.com/questions/222642/…
Respuesta
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 tuvo la intención de usarse de esta manera.
Si desea los verdaderos procesos ligeros, use Erlang y cree miles de hilos que se comuniquen a través de mensajes. En Java, tendrá una docena de subprocesos que comparten una memoria común con mutex y semáforos. Es solo un modelo de programación diferente, diseñado para un conjunto diferente de problemas.
Comentarios
- Entonces, para aclarar, es un enfoque útil en Erlang. E, ignorando los problemas de la mentalidad de Java, ¿podría ayudar realmente?
- @redjamjar, es poco probable para ser útil en Java, el lenguaje en sí no es del todo adecuado para tal uso, y su principal (y única) ventaja – el vasto cuerpo de bibliotecas listas para usar – no ‘ encaja bien en un enfoque de programación tan extraño.
- Sí, si quieres ese modelo, solo usa Erlang, será un orden de magnitud más fácil
- Java! = JVM, solo digo 🙂
- @Bane, estas » ventajas » solo existen si ‘ no tengo nada que comparar