Articulo de referencia

Hilo verde

En programación informática , un subproceso verde es un subproceso que está programado por una biblioteca de tiempo de ejecución o una máquina virtual (VM) en lugar de hacerlo d...

En programación informática , un subproceso verde es un subproceso que está programado por una biblioteca de tiempo de ejecución o una máquina virtual (VM) en lugar de hacerlo de forma nativa por el sistema operativo (OS) subyacente. Los subprocesos verdes emulan entornos multiproceso sin depender de ninguna capacidad nativa del SO y se administran en el espacio del usuario en lugar del espacio del núcleo , lo que les permite funcionar en entornos que no tienen soporte nativo para subprocesos. [1]

Etimología

Green threads hace referencia al nombre de la biblioteca de subprocesos original del lenguaje de programación Java (que se lanzó en la versión 1.1 y luego se abandonó en la versión 1.3 para convertirla en subprocesos nativos). Fue diseñada por The Green Team en Sun Microsystems . [2]

Historia

Los hilos verdes estuvieron disponibles brevemente en Java entre 1997 y 2000.

Los subprocesos verdes comparten un único subproceso del sistema operativo a través de la concurrencia cooperativa y, por lo tanto, no pueden lograr mejoras en el rendimiento del paralelismo como los subprocesos del sistema operativo. El principal beneficio de las corrutinas y los subprocesos verdes es la facilidad de implementación.

Actuación

En un procesador multinúcleo , las implementaciones de subprocesos nativos pueden asignar trabajo automáticamente a varios procesadores, mientras que las implementaciones de subprocesos verdes normalmente no pueden hacerlo. [1] [3] Los subprocesos verdes se pueden iniciar mucho más rápido en algunas máquinas virtuales. Sin embargo, en computadoras con un solo procesador, aún no se ha determinado claramente el modelo más eficiente.

Los análisis comparativos realizados en ordenadores que ejecutan la versión 2.2 del núcleo Linux (publicada en 1999) han demostrado que: [4]

  • Los subprocesos verdes superan significativamente a los subprocesos nativos de Linux en la activación y sincronización de subprocesos .
  • Los subprocesos nativos de Linux tienen un rendimiento ligeramente mejor en operaciones de entrada/salida (E/S) y de cambio de contexto .

Cuando un hilo verde ejecuta una llamada al sistema que genera bloqueo, no solo se bloquea ese hilo, sino que también se bloquean todos los hilos dentro del proceso. [5] Para evitar ese problema, los hilos verdes deben utilizar operaciones de E/S no bloqueantes o de E/S asincrónicas , aunque la mayor complejidad del lado del usuario se puede reducir si la máquina virtual que implementa los hilos verdes genera procesos de E/S específicos (ocultos para el usuario) para cada operación de E/S. [ cita requerida ]

También existen mecanismos que permiten el uso de subprocesos nativos y reducen la sobrecarga de activación y sincronización de subprocesos:

  • Los grupos de subprocesos reducen el costo de generar un nuevo subproceso al reutilizar una cantidad limitada de subprocesos. [6]
  • Los lenguajes que utilizan máquinas virtuales y subprocesos nativos pueden utilizar el análisis de escape para evitar sincronizar bloques de código cuando no es necesario. [7]

Hilos verdes en la máquina virtual de Java

En Java 1.1 , los subprocesos verdes eran el único modelo de subprocesos utilizado por la máquina virtual Java (JVM), [8] al menos en Solaris . Como los subprocesos verdes tienen algunas limitaciones en comparación con los subprocesos nativos, las versiones posteriores de Java los abandonaron en favor de los subprocesos nativos. [9] [10]

Una excepción a esto es la máquina virtual Squawk , que es una mezcla entre un sistema operativo para dispositivos de bajo consumo y una máquina virtual Java. Utiliza hilos verdes para minimizar el uso de código nativo y para soportar la migración de sus aislamientos.

Kilim [11] [12] y Quasar [13] [14] son ​​proyectos de código abierto que implementan subprocesos verdes en versiones posteriores de la JVM modificando el código de bytes de Java producido por el compilador de Java (Quasar también admite Kotlin y Clojure ).

Hilos verdes en otros idiomas

Existen otros lenguajes de programación que implementan equivalentes de subprocesos verdes en lugar de subprocesos nativos. Ejemplos:

  • Chicken Scheme utiliza subprocesos livianos a nivel de usuario basados ​​en continuaciones de primera clase [15]
  • Ceceo común [16]
  • CPython soporta de forma nativa asyncio desde la versión 3.4, existen implementaciones alternativas como greenlet, eventlet y gevent, PyPy [17]
  • Crystal ofrece fibras [18]
  • D ofrece fibras , utilizadas para E/S asíncronas [19]
  • Los nombres APL de Dyalog son subprocesos [20]
  • Erlang [21]
  • Go implementa las llamadas gorutinas [22]
  • Haskell [22]
  • Julia utiliza hilos verdes para sus tareas.
  • Limbo [23]
  • Lua utiliza corrutinas para la concurrencia. Lua 5.2 también ofrece semántica de corrutina C real a través de las funciones lua_yieldk, lua_callk y lua_pcallk. La extensión CoCo permite una semántica de corrutina C real para Lua 5.1.
  • Nim proporciona E/S asincrónicas y corrutinas
  • OCaml , desde la versión 5.0, admite subprocesos verdes a través del módulo Domainslib.Task
  • Occam , que prefiere el término proceso en lugar de hilo debido a sus orígenes en la comunicación de procesos secuenciales.
  • Perl admite subprocesos verdes a través de corrutinas
  • PHP admite subprocesos verdes a través de fibras y corrutinas
  • Ruby antes de la versión 1.9 [24]
  • Racket (los hilos nativos también están disponibles a través de Places [25] )
  • Rust admite subprocesos del sistema de forma nativa [26] y admite E/S asincrónica a través de bibliotecas de terceros como Tokio
  • Implementación de ML concurrente en SML/NJ
  • Smalltalk (la mayoría de los dialectos: Squeak , VisualWorks, GNU Smalltalk , etc.)
  • Python sin pila admite multitarea preventiva o multitarea cooperativa a través de microhilos (denominados tasklets ). [27]
  • Tcl tiene corrutinas y un bucle de eventos [28]

La máquina virtual Erlang tiene lo que se podría llamar procesos verdes : son como procesos del sistema operativo (no comparten el estado como lo hacen los subprocesos), pero se implementan dentro del sistema de tiempo de ejecución Erlang (erts). A veces se los denomina subprocesos verdes , pero tienen diferencias significativas [ aclaración necesaria ] con respecto a los subprocesos verdes estándar. [ cita requerida ]

En el caso de GHC Haskell, se produce un cambio de contexto en la primera asignación después de un tiempo de espera configurable. Los subprocesos GHC también se ejecutan potencialmente en uno o más subprocesos del sistema operativo durante su vida útil (existe una relación de muchos a muchos entre los subprocesos GHC y los subprocesos del sistema operativo), lo que permite el paralelismo en máquinas multiprocesadoras simétricas , sin crear subprocesos del sistema operativo más costosos de los necesarios para ejecutarse en la cantidad de núcleos disponibles. [ cita requerida ]

La mayoría de las máquinas virtuales de Smalltalk no cuentan los pasos de evaluación; sin embargo, la máquina virtual puede adelantarse al subproceso en ejecución en caso de señales externas (como temporizadores que expiran o E/S que se vuelven disponibles). Por lo general, se utiliza la programación por turnos para que un proceso de alta prioridad que se activa regularmente implemente de manera efectiva la adelantamiento de tiempo compartido :

[
    [( Retraso de  milisegundos:  50 ) esperar ] repetir 
 ] forkAt:  Procesador  highIOPriority

Otras implementaciones, por ejemplo, QKS Smalltalk, siempre comparten el tiempo. A diferencia de la mayoría de las implementaciones de subprocesos verdes, QKS también permite evitar la inversión de prioridad .

Diferencias entre los subprocesos virtuales en la máquina virtual de Java

Los hilos virtuales se introdujeron como una característica de vista previa en Java 19 [29] y se estabilizaron en Java 21. [30] Las diferencias importantes entre los hilos virtuales y los hilos verdes son:

  • Los subprocesos virtuales coexisten con subprocesos y grupos de subprocesos de plataforma (no virtuales) existentes.
  • Los hilos virtuales protegen su abstracción:
    • A diferencia de lo que ocurre con los hilos verdes, dormir en un hilo virtual no bloquea el hilo portador subyacente.
    • Se deja de lado el trabajo con variables locales del hilo y se sugieren valores con alcance como un reemplazo más liviano. [31]
  • Los hilos virtuales se pueden suspender y reanudar de forma económica, haciendo uso del soporte de JVM para la jdk.internal.vm.Continuationclase especial.
  • Los subprocesos virtuales manejan las llamadas de bloqueo desmontándose de forma transparente del subproceso portador cuando es posible; de ​​lo contrario, lo compensan aumentando la cantidad de subprocesos de la plataforma.

Véase también

Referencias

  1. ^ ab Sintes, Tony (13 de abril de 2001). "Cuatro para la posteridad". JavaWorld . Archivado desde el original el 15 de julio de 2020 . Consultado el 14 de julio de 2020 . Los subprocesos verdes, los subprocesos proporcionados por la JVM, se ejecutan a nivel de usuario, lo que significa que la JVM crea y programa los subprocesos por sí misma. Por lo tanto, el núcleo del sistema operativo no los crea ni los programa. En cambio, el sistema operativo subyacente ve a la JVM solo como un subproceso. Los subprocesos verdes resultan ineficientes por varias razones. En primer lugar, los subprocesos verdes no pueden aprovechar un sistema multiprocesador (...) Por lo tanto, los subprocesos de la JVM están destinados a ejecutarse dentro de ese único subproceso de la JVM que se ejecuta dentro de un solo procesador.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  2. ^ "Tecnología Java: Los primeros años". java.sun.com . 22 de diciembre de 2014. Archivado desde el original el 30 de mayo de 2008.
  3. ^ "¿Cuál es la diferencia entre subprocesos "verdes" e subprocesos "nativos"?". jguru.com . 2000-09-06 . Consultado el 2009-06-01 . En máquinas con múltiples CPU, los subprocesos nativos pueden ejecutar más de un subproceso simultáneamente asignando diferentes subprocesos a diferentes CPU. Los subprocesos verdes se ejecutan solo en una CPU.
  4. ^ "Evaluación comparativa del rendimiento de subprocesos Java para aplicaciones integradas: Linux Thread vs. Green Thread". CiteSeerX 10.1.1.8.9238 . 
  5. ^ Stallings, William (2008). Sistemas operativos, principios internos y de diseño . Nueva Jersey: Prentice Hall. p. 171. ISBN 9780136006329.
  6. ^ Sieger, Nick (22 de julio de 2011). "Concurrencia en JRuby". Engine Yard . Archivado desde el original el 30 de enero de 2014. Consultado el 26 de enero de 2013. Para sistemas con grandes volúmenes de correo electrónico, este enfoque ingenuo puede no funcionar bien. Los subprocesos nativos conllevan un mayor costo de inicialización y sobrecarga de memoria que los subprocesos verdes, por lo que JRuby normalmente no puede admitir más de aproximadamente 10 000 subprocesos. Para solucionar esto, podemos usar un grupo de subprocesos.
  7. ^ Goetz, Brian (18 de octubre de 2005). "Teoría y práctica de Java: optimizaciones de sincronización en Mustang". IBM . Consultado el 26 de enero de 2013 .
  8. ^ "Hilos Java en el entorno Solaris: versiones anteriores". Oracle Corporation . Consultado el 26 de enero de 2013 . Como resultado, surgieron varios problemas: las aplicaciones Java no podían interoperar con las aplicaciones MT existentes en el entorno Solaris, los hilos Java no podían ejecutarse en paralelo en multiprocesadores, una aplicación Java MT no podía aprovechar la verdadera concurrencia del SO para aplicaciones más rápidas en monoprocesadores o multiprocesadores. Para aumentar sustancialmente el rendimiento de la aplicación, la biblioteca de hilos verdes se reemplazó con hilos nativos de Solaris para Java en la plataforma Solaris 2.6; esto se mantiene en las plataformas Solaris 7 y Solaris 8.
  9. ^ "Hilos: ecológicos o nativos". SCO Group . Consultado el 26 de enero de 2013. El beneficio de rendimiento que se obtiene al usar hilos nativos en una máquina MP puede ser espectacular. Por ejemplo, si se utiliza un punto de referencia artificial en el que los hilos de Java realizan el procesamiento de forma independiente entre sí, puede haber una mejora de velocidad general de tres veces en una máquina MP de 4 CPU.
  10. ^ "Hilos: verdes o nativos". codestyle.org. Archivado desde el original el 16 de enero de 2013. Consultado el 26 de enero de 2013. Existe una sobrecarga de procesamiento significativa para que la JVM realice un seguimiento de los estados de los hilos y los intercambie, por lo que el modo de hilo verde ha quedado obsoleto y se ha eliminado de las implementaciones de Java más recientes.
  11. ^ "kilim". GitHub . Consultado el 9 de junio de 2016 .
  12. ^ "Kilim". www.malhar.net . Consultado el 9 de junio de 2016 .
  13. ^ "Código Quasar en GitHub". GitHub .
  14. ^ "Universo paralelo". Archivado desde el original el 22 de diciembre de 2015 . Consultado el 6 de diciembre de 2015 .
  15. ^ "Chicken Scheme" . Consultado el 5 de noviembre de 2017 .
  16. ^ "thezerobit/green-threads". GitHub . Consultado el 8 de abril de 2016 .
  17. ^ "Características de Stackless a nivel de aplicación: documentación de PyPy 4.0.0" . Consultado el 6 de diciembre de 2015 .
  18. ^ "Concurrencia: GitBook". crystal-lang.org . Consultado el 3 de abril de 2018 .
  19. ^ "Fibras - Dlang Tour". tour.dlang.org . Consultado el 2 de mayo de 2022 .
  20. ^ "Hilos: descripción general". Ayuda de Dyalog APL 17.0 . Consultado el 14 de diciembre de 2018. Un hilo es una cadena de ejecución en el espacio de trabajo de APL .
  21. ^ @joeerl (23 de junio de 2018). "Los procesos de Erlang se emulan en la máquina virtual de Erlang, como los subprocesos verdes. Nos gustan porque simplifican muchos problemas..." ( Tweet ) – vía Twitter .
  22. ^ ab "Go y Dogma". research!rsc . Consultado el 14 de enero de 2017 . Por ejemplo, tanto Go como Haskell necesitan algún tipo de "hilos verdes", por lo que hay más desafíos de ejecución compartidos de lo que podría esperarse.
  23. ^ "El lenguaje de programación Limbo". www.vitanuova.com . Consultado el 1 de abril de 2019 .
  24. ^ "Multithreading en el intérprete Ruby de MRI | BugFactory" . Consultado el 18 de junio de 2024 .
  25. ^ "Lugares de Racket" . Consultado el 13 de octubre de 2011. Los lugares permiten el desarrollo de programas paralelos que aprovechan las máquinas con múltiples procesadores, núcleos o subprocesos de hardware. Un lugar es una tarea paralela que es, en efecto, una instancia independiente de la máquina virtual Racket.
  26. ^ "Uso de subprocesos para ejecutar código simultáneamente: el lenguaje de programación Rust". doc.rust-lang.org . Consultado el 24 de septiembre de 2021 .
  27. ^ "Stackless.com: Acerca de Stackless". Archivado desde el original el 27 de febrero de 2012. Consultado el 27 de agosto de 2008. Se incluye un programador de turnos rotativos. Se puede utilizar para programar tareas de forma cooperativa o preventiva .
  28. ^ "Bucle de eventos Tcl" . Consultado el 6 de diciembre de 2015 .
  29. ^ "JEP 425: Hilos virtuales (versión preliminar)" . Consultado el 25 de enero de 2024 .
  30. ^ "JEP 444: Hilos virtuales" . Consultado el 25 de enero de 2024 .
  31. ^ "JEP 464: Valores con alcance (segunda versión preliminar)" . Consultado el 25 de enero de 2024 .
  • "Cuatro para la posteridad", artículo de JavaWorld sobre los hilos verdes
  • Hilos verdes en las preguntas frecuentes sobre hilos de Java
Retrieved from "https://en.wikipedia.org/w/index.php?title=Green_thread&oldid=1242986889"