Articulo de referencia

Hilo verde

En programación informática , un hilo verde es un hilo programado por una biblioteca de tiempo de ejecución o una máquina virtual (VM) en lugar de ser programado de forma nativa...

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

Etimología

Green Threads hace referencia al nombre de la biblioteca de hilos original para el lenguaje de programación Java (lanzada en la versión 1.1 y posteriormente reemplazada por hilos nativos en la versión 1.3 ). Fue diseñada por el Green Team de Sun Microsystems . [ 2 ]

Historia

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

Los hilos ligeros comparten un único hilo del sistema operativo mediante concurrencia cooperativa y, por lo tanto, no pueden lograr las mismas ventajas de rendimiento que los hilos del sistema operativo. La principal ventaja de las corrutinas y los hilos ligeros es la facilidad de implementación.

Actuación

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

Las pruebas de rendimiento en ordenadores que ejecutan la versión 2.2 del kernel de Linux (lanzada en 1999) han demostrado que: [ 4 ]

  • Los hilos verdes superan significativamente a los hilos nativos de Linux en cuanto a activación y sincronización de hilos .
  • Los subprocesos nativos de Linux ofrecen un rendimiento ligeramente superior en las operaciones de entrada/salida (E/S) y de cambio de contexto .

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

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

  • Los grupos de subprocesos reducen el costo de crear un nuevo subproceso al reutilizar un número limitado de subprocesos. [ 6 ]
  • Los lenguajes que utilizan máquinas virtuales e hilos nativos pueden usar análisis de escape para evitar la sincronización de bloques de código cuando no es necesario. [ 7 ]

Hilos verdes en la máquina virtual Java

En Java 1.1 , los hilos verdes eran el único modelo de subprocesos utilizado por la máquina virtual de Java (JVM), [ 8 ] al menos en Solaris . Dado que los hilos verdes tienen algunas limitaciones en comparación con los hilos nativos, las versiones posteriores de Java los abandonaron en favor de los hilos 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 ligeros para minimizar el uso de código nativo y para facilitar la migración de sus componentes aislados.

Kilim [ 11 ] [ 12 ] y Quasar [ 13 ] [ 14 ] son ​​proyectos de código abierto que implementan hilos verdes en versiones posteriores de la JVM modificando el bytecode 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 a los hilos ligeros en lugar de los hilos nativos. Ejemplos:

La máquina virtual de Erlang cuenta con lo que podríamos llamar procesos verdes : son similares a los procesos del sistema operativo (no comparten estado como los hilos), pero se implementan dentro del Sistema de Tiempo de Ejecución de Erlang (erts). A veces se les denomina hilos verdes , pero presentan diferencias significativas con respecto a los hilos verdes estándar.

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

La mayoría de las máquinas virtuales Smalltalk no contabilizan los pasos de evaluación; sin embargo, la máquina virtual aún puede interrumpir el hilo en ejecución ante señales externas (como la expiración de temporizadores o la disponibilidad de E/S). Normalmente se utiliza la planificación round-robin para que un proceso de alta prioridad que se activa regularmente implemente de forma efectiva la interrupción por tiempo compartido .

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

Otras implementaciones, por ejemplo, QKS Smalltalk, siempre utilizan el método de tiempo compartido. A diferencia de la mayoría de las implementaciones de hilos ligeros, QKS también admite la prevención de la inversión de prioridad .

Diferencias con 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 [ 28 ] y se estabilizaron en Java 21. [ 29 ] Las diferencias importantes entre los hilos virtuales y los hilos verdes son:

  • Los subprocesos virtuales coexisten con los subprocesos y grupos de subprocesos de la plataforma existentes (no virtuales).
  • Los hilos virtuales protegen su abstracción:
    • A diferencia de lo que ocurre con los hilos verdes, el estado de espera en un hilo virtual no bloquea el hilo portador subyacente.
    • Se resta importancia al trabajo con variables locales de hilo y se sugieren valores con ámbito como una alternativa más ligera. [ 30 ]
  • Los hilos virtuales se pueden suspender y reanudar de forma económica, aprovechando la compatibilidad de la JVM con la jdk.internal.vm.Continuationclase especial.
  • Los subprocesos virtuales gestionan las llamadas bloqueantes desmontándose de forma transparente del subproceso principal cuando es posible; de ​​lo contrario, compensan aumentando el número de subprocesos de la plataforma.

Véase también

Referencias

  1. 1 2 Sintes, Tony (13 de abril de 2001). "Cuatro para la historia" . JavaWorld . Archivado del original el 15 de julio de 2020. Recuperado el 14 de julio de 2020. Los hilos verdes, los hilos proporcionados por la JVM, se ejecutan a nivel de usuario, lo que significa que la JVM crea y programa los hilos 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 hilo. Los hilos verdes resultan ineficientes por varias razones. Principalmente, los hilos verdes no pueden aprovechar un sistema multiprocesador (...) Por lo tanto, los hilos de la JVM están obligados a ejecutarse dentro de ese único hilo de la JVM que se ejecuta dentro de un solo procesador.{{cite web}}: CS1 maint: bot: estado de la URL original desconocido ( enlace )
  2. "Tecnología Java: Los primeros años" . java.sun.com . 22 de diciembre de 2014. Archivado del original el 30 de mayo de 2008.
  3. "¿Cuál es la diferencia entre los hilos 'verdes' y los hilos 'nativos'?" . jguru.com . 6 de septiembre de 2000 . Consultado el 1 de junio de 2009 . En máquinas con múltiples CPU, los hilos nativos pueden ejecutar más de un hilo simultáneamente asignando diferentes hilos a diferentes CPU. Los hilos verdes se ejecutan en una sola CPU.
  4. "Evaluación comparativa del rendimiento de los subprocesos de Java para aplicaciones embebidas: Linux Thread frente a 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ág. 171. ISBN  9780136006329.
  6. Sieger, Nick (22 de julio de 2011). "Concurrencia en JRuby" . Engine Yard . Archivado del original el 30 de enero de 2014. Recuperado el 26 de enero de 2013. Para sistemas con grandes volúmenes de correo electrónico, este enfoque ingenuo puede no funcionar bien. Los hilos nativos conllevan un mayor costo de inicialización y sobrecarga de memoria que los hilos verdes, por lo que JRuby normalmente no puede admitir más de unos 10 000 hilos. Para solucionar esto, podemos usar un grupo de hilos.
  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. "Java Threads in the Solaris Environment – ​​Previous Releases" . 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 ni en uniprocesadores ni en multiprocesadores. Para aumentar sustancialmente el rendimiento de las aplicaciones, la biblioteca green threads fue reemplazada por 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: Verdes o Nativos" . SCO Group . Consultado el 26 de enero de 2013. La mejora en el rendimiento que se obtiene al usar hilos nativos en una máquina multiprocesador puede ser drástica. Por ejemplo, al usar una prueba de rendimiento artificial donde los hilos Java realizan el procesamiento de forma independiente, se puede lograr una mejora de velocidad general de tres veces en una máquina multiprocesador de 4 CPU.
  10. "Hilos: Verdes o Nativos" . codestyle.org. Archivado del original el 16/01/2013 . Consultado el 26/01/2013 . Existe una sobrecarga de procesamiento significativa para que la JVM realice un seguimiento de los estados de los hilos y cambie entre ellos, por lo que el modo de hilo verde ha sido obsoleto y eliminado de las implementaciones más recientes de Java.
  11. "kilim" . GitHub . Consultado el 9 de junio de 2016 .
  12. "Kilim" . www.malhar.net . Consultado el 9 de junio de 2016 .
  13. "Quasar Code en GitHub" . GitHub .
  14. "Universo paralelo" . Archivado del original el 22 de diciembre de 2015. Consultado el 6 de diciembre de 2015 .
  15. "Plan de pollos" . Consultado el 5 de noviembre de 2017 .
  16. "thezerobit/green-threads" . GitHub . Consultado el 8 de abril de 2016 .
  17. "Funcionalidades de Stackless a nivel de aplicación: documentación de PyPy 4.0.0" . Consultado el 6 de diciembre de 2015 .
  18. "Concurrency: GitBook" . crystal-lang.org . Consultado el 3 de abril de 2018 .
  19. "Fibras - Recorrido por Dlang" . 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 secuencia 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 hilos verdes; nos gustan porque esto simplifica muchos problemas..." ( Tweet ) vía Twitter .
  22. 1 2 "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 tiempo de ejecución compartidos de lo que cabría esperar.
  23. "El lenguaje de programación Limbo" . www.vitanuova.com . Consultado el 1 de abril de 2019 .
  24. "Racket Places" . Consultado el 13 de octubre de 2011. Los "places" permiten el desarrollo de programas paralelos que aprovechan máquinas con múltiples procesadores, núcleos o hilos de hardware. Un "place" es una tarea paralela que, en la práctica, constituye una instancia independiente de la máquina virtual Racket.
  25. "Multihilo en el intérprete Ruby de MRI | BugFactory" . Consultado el 18 de junio de 2024 .
  26. "Stackless.com: Acerca de Stackless" . Archivado del original el 27/02/2012 . Consultado el 27/08/2008 . Incluye un planificador round robin. Puede utilizarse para programar tareas de forma cooperativa o preventiva.
  27. "Bucle de eventos de Tcl" . Consultado el 6 de diciembre de 2015 .
  28. "JEP 425: Hilos virtuales (Vista previa)" . Consultado el 25 de enero de 2024 .
  29. "JEP 444: Hilos virtuales" . Consultado el 25 de enero de 2024 .
  30. "JEP 464: Valores con ámbito (Segunda vista previa)" . Consultado el 25 de enero de 2024 .
Obtenido de " https://en.wikipedia.org/w/index.php?title=Green_thread&oldid=1360100460 "