Hilos verdes

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 24 de diciembre de 2014; las comprobaciones requieren 18 ediciones .

En programación , los subprocesos verdes son subprocesos de  ejecución que  son administrados por una máquina virtual (VM) en lugar del sistema operativo . Los subprocesos verdes emulan un entorno de subprocesos múltiples sin depender de la capacidad del sistema operativo para implementar subprocesos ligeros. Se administran en el espacio del usuario , no en el espacio del kernel , lo que les permite operar en ausencia de soporte de subprocesos nativos. [una]

Ejecución

En los procesadores multinúcleo, la implementación nativa de subprocesos nativos puede asignar trabajo automáticamente a múltiples procesadores, mientras que la implementación de subprocesos verdes generalmente no puede [1] [2] . Los subprocesos verdes pueden ejecutarse mucho más rápido en algunas máquinas virtuales. Sin embargo, en las computadoras de un solo procesador, aún no se ha determinado el modelo más eficiente. Las pruebas en computadoras que ejecutan (antiguo) Linux en el kernel 2.2 mostraron [3] :

Cuando un subproceso verde ejecuta una llamada al sistema de bloqueo, no solo se bloquea ese subproceso, sino que también se bloquean todos los subprocesos dentro del proceso [4] . Para evitar este problema, los subprocesos verdes deben usar E/S asíncrona, aunque esta complejidad se puede ocultar generando subprocesos por E/S que están ocultos para el usuario y se fusionan con el subproceso verde.

También hay mecanismos que le permiten usar sus propios subprocesos y reducir la sobrecarga de activar y sincronizar subprocesos:

Hilos verdes en la JVM

En Java 1.1, los subprocesos verdes eran el único modelo de subprocesos utilizado en JVM [7] , al menos en Solaris . Debido al hecho de que los subprocesos verdes tienen limitaciones en comparación con los subprocesos nativos, en versiones posteriores de Java, el énfasis principal está en los subprocesos nativos.

La excepción es la máquina virtual Squawk , que es una combinación de un sistema operativo de bajo consumo y JVM. Utiliza subprocesos verdes para mantener el código nativo en un mínimo absoluto y para admitir la migración de sus aislamientos.

Hilos verdes en otros idiomas

Hay otros lenguajes de programación que todavía usan hilos verdes en lugar de hilos nativos. Ejemplos:

La máquina virtual de Erlang tiene lo que se puede llamar "procesos verdes": son como los procesos de trabajo del sistema, aunque no declaran un estado, como lo hacen los subprocesos, sino que se implementan dentro del Sistema de tiempo de ejecución de Erlang (ERTS). A veces se los denomina "hilos verdes", pero tienen diferencias significativas con los hilos verdes estándar.

En el caso de GHC Haskell, el cambio de contexto ocurre en la primera asignación después del tiempo de espera especificado. Los subprocesos de GHC también se ejecutan potencialmente en uno o más subprocesos del sistema operativo durante su ciclo de vida (se establece una relación de muchos a muchos entre los subprocesos de GHC y los subprocesos del sistema operativo), lo que permite lograr el paralelismo en máquinas multiprocesador simétricas sin crear constantemente subprocesos de sistema operativo más costosos. , además de la cantidad requerida de dichos subprocesos, para realizar el trabajo en la cantidad disponible de núcleos.

Occam se destaca en esta lista porque su implementación original estaba ligada a Transputer y, por lo tanto, no había necesidad de una máquina virtual. Más tarde, las copias de él portadas a otros procesadores tenían una máquina virtual construida sobre la base de Transputer, que era una solución razonable en términos de eficiencia, debido a la baja sobrecarga requerida para la portabilidad.

La mayoría de las máquinas virtuales de Smalltalk no calculan estimaciones de pasos; sin embargo, la máquina virtual puede asignar un subproceso en ejecución a señales externas (por ejemplo, un temporizador de caducidad o un cambio en la disponibilidad de E/S). Por lo general , la programación por turnos se utiliza para garantizar que un proceso de alta prioridad que debe ejecutarse regularmente pueda realizar interrupciones de tiempo compartido de manera eficiente (implementar multitarea preventiva):

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

Otras implementaciones, como QKS Smalltalk, usan la división de tiempo todo el tiempo. A diferencia de la mayoría de las implementaciones de subprocesos verdes, QKS Smalltalk tiene soporte para la prevención de inversión de prioridad.

Notas

  1. 12 Cuatro para las edades . Archivado desde el original el 6 de febrero de 2013.
  2. ¿Cuál es la diferencia entre hilos "verdes" y hilos "nativos"? . Archivado desde el original el 6 de febrero de 2013.
  3. Evaluación comparativa del rendimiento de subprocesos de Java para aplicaciones integradas: Linux Thread vs. Hilo verde [1] Archivado el 16 de octubre de 2012 en Wayback Machine .
  4. Stallings, Guillermo. Sistemas Operativos , Internos y Principios de Diseño  . - Nueva Jersey: Prentice Hall , 2008. - Pág  . 171 . — ISBN 9780136006329 .
  5. Concurrencia en JRuby (enlace descendente) . Fecha de acceso: 29 de enero de 2013. Archivado desde el original el 30 de enero de 2014. 
  6. Teoría y práctica de Java: optimizaciones de sincronización en Mustang . Archivado desde el original el 6 de febrero de 2013.
  7. Enhebrado . Archivado desde el original el 6 de febrero de 2013.
  8. Stackless.com: Acerca de Stackless . Archivado desde el original el 6 de febrero de 2013.

Enlaces