2011-03-23 10 views
8

Últimamente he estado pensando: ¿Cómo implementan varios 'hilos' en un solo hilo?Cómo implementar varios 'hilos' que se ejecutan en un solo hilo

Es decir, ¿cómo implementan varios códigos de ejecución paralela en un solo hilo? ¿Cómo guardan el estado del 'hilo', crean una interrupción y pasan la CPU al siguiente?

Creo que los Scala-actores implementan esto. ¿Pero cómo?

Esto se puede responder para JVM o C, no importa. Realmente quiero aprender la teoría de eso.

+1

Coroutines, ¿eh? –

Respuesta

1

Una forma de hacer esto es hacer que el paquete de subprocesamiento en el código de usuario se registre a sí mismo para algún tipo de interrupción de temporizador del kernel. Cada vez que recibe una interrupción de este tipo, puede decirle al kernel que detenga la ejecución de todos los hilos del núcleo que están ejecutando varios hilos diferentes. Para cada uno de esos hilos, el código de interrupción del temporizador puede inspeccionar la pila para esos hilos, registrar información importante (registros, puntero de pila, contador de programa, etc.) en una ubicación auxiliar, y luego cargar la información almacenada para otra de las simulaciones hilos que se ejecutan en ese hilo real. Luego puede reanudar el hilo del kernel ejecutando el hilo simulado. De esta forma, puede simular el cambio de contexto entre los múltiples hilos que se ejecutan en una única cadena del kernel.

Para implementar algo así como el bloqueo, puede realizar un seguimiento de toda la información de bloqueo localmente en su espacio de usuario. Cada vez que un subproceso simulado intenta adquirir un bloqueo, puede verificar si el subproceso puede obtener el bloqueo correctamente. Si es así, simplemente dale la cerradura. De lo contrario, simula un cambio de contexto intercambiando el hilo simulado que se está ejecutando en ese hilo real, luego marcando el hilo simulado como bloqueado hasta que el bloqueo vuelva a estar libre.

Esto es solo un comienzo: hay muchos otros detalles aquí (¿qué pasa si uno de los hilos simulados intenta hacer una operación de E/S de bloqueo? No se puede simplemente bloquear el hilo del kernel, ya que eso detendría todo ¡los hilos simulados!), pero esta es la esencia de la idea.

3

¿Quiere decir tareas en un ExecutorService o ScheduledExecutorService en Java?

Estas tareas se agregan a una cola y se completan para completarse. Cuando uno termina, comienza otro. Si tiene un bucle con un retraso, puede usar una tarea programada repetitiva. Se completa para cada iteración y permite que se ejecuten otras tareas.

Si desea conocer más detalles, puede encontrar que leer el código es interesante.

+0

Estaba pensando algo con más justicia, como cortar el tiempo y así ... –

+0

@Jose Leal, ¿te refieres a los hilos? Cuando tiene tareas ligeras en un grupo de subprocesos/subprocesos y subprocesos que ya pueden compartir una CPU, ¿qué subprocesos dentro de un subproceso le ganarán? –

2
+0

Creo que la pregunta es más acerca de cómo se puede implementar el subprocesamiento preventivo de n hilos en 1 hilo del núcleo. – templatetypedef

6

Creo que está confundiendo coroutines y green threads aquí.

Coroutines ceden el control cuando están listos para hacerlo, sin ninguna interrupción, por lo que la pregunta sobre la interrupción es irrelevante aquí. Los actores de Scala se implementan como corutinas.

Los subprocesos verdes son subprocesos en modo de usuario implementados por una máquina virtual sin el uso de las capacidades nativas del sistema operativo. Obviamente, la máquina virtual puede insertar instrucciones en el código que se está ejecutando para verificar si es necesario cambiar a otro hilo.

4

Con actores es simple, en lugar de usar un hilo por actor, utiliza el mismo hilo para ejecutar mensajes para múltiples actores. Sin embargo, si un actor realiza una llamada de bloqueo o un cómputo pesado, se debe usar otro hilo para ejecutar mensajes en otros actores.

Los hilos verdes son hilos livianos que se pueden implementar a nivel de máquina virtual. Los subprocesos verdes siempre se asignan a uno o más subprocesos del sistema operativo. La VM controla la sincronización y la conmutación de subprocesos en el espacio de usuario, lo que puede reducir significativamente la sobrecarga. Sin embargo, existen inconvenientes para los hilos verdes, por ejemplo, las llamadas IO pueden hacer que el hilo se bloquee y luego la VM no puede "reutilizar" el hilo del sistema operativo para otro hilo verde y debe usar un hilo adicional del sistema operativo.

Otra solución es utilizar continuaciones, como se implementa en el compilador de Scala. La interrupción y reanudación de la ejecución se maneja en el nivel de código byte de JVM donde se guarda y restaura el estado local. No se necesita soporte de VM.

Cuestiones relacionadas