stringtranslate.com

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 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 kernel de Linux (publicada en 1999) han demostrado que: [4]

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:

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:

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:

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 sistema operativo 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 supone utilizar 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 producirse 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 .

Enlaces externos