¿Cómo funciona dormir un hilo?

7

Cuando duerme un hilo, ¿qué está pasando realmente?

Veo que el hilo en espera "hace una pausa en el hilo actual durante un período de tiempo dado" . Pero, ¿cómo funciona?

Según Cómo funciona Thread.sleep () internamente y ¿Cómo funciona realmente Thread.sleep? :

  • la duración del sueño estará sujeta a cierta granularidad específica del sistema
  • el sueño está bloqueando
  • el hilo abandona la CPU y detiene su ejecución
  • el subproceso no consume tiempo de CPU mientras duerme

Simplemente no puedo entender la mecánica interna y fundamental de lo que significa todo esto.

Entiendo que hay algo llamado el planificador que es responsable de cambiar entre los subprocesos.

Las fuentes parecen indicar que esto varía según el sistema operativo (¿o el hardware?) y la mayoría de los subprocesos reciben 1 ms - 60 ms o más para realizar algunas acciones antes de que la CPU cambie a otro subproceso.

Pero cuando un hilo duerme (por ejemplo, muchos segundos), ¿cómo se reanuda? Supongo que hay un temporizador involucrado, ¿es el reloj de la placa base? ¿Está relacionado con la velocidad de reloj de la CPU?

E incluso si se trata de un temporizador, ¿cómo sabe la CPU cuándo es el momento de volver a prestar atención al subproceso? ¿No tendría que revisar constantemente el hilo para ver si está listo? ¿No es eso efectivamente sondeo y por lo tanto un poco de está consumiendo tiempo de CPU?

¿Está durmiendo un subproceso específico del idioma o es el sistema operativo responsable de ello o es algo específico de la CPU?

¿Alguien por favor me explique esto con explicaciones básicas de cosas como el programador y lo que hace la CPU durante todo esto?

    
pregunta Rowan Freeman 17.08.2016 - 08:16

2 respuestas

7

Hay mucho más involucrado en la ejecución de un programa que solo el código dentro de ese programa.

Cualquier programa que se ejecute en un sistema operativo multiproceso está bajo el control del planificador del sistema operativo, y el planificador mantiene una tabla explícita que indica qué proceso se está ejecutando, cuáles esperan para ejecutarse cuando Los ciclos de CPU están disponibles, y que ni siquiera están intentando ejecutarse (durmiendo). El programador generalmente asigna segmentos de tiempo de tamaño uniforme a los procesos en función de su prioridad y su historial de ejecución. En última instancia, este bucle es controlado por interrupciones de hardware, generalmente generadas por un oscilador en la placa principal.

Dormir siempre es una característica que un lenguaje de programación puede admitir solo porque el entorno de ejecución donde se ejecutará lo admite. Un programa normal no puede suspender en sí mismo , solo puede decirle al programador cómo le gustaría a querer ser tratado, y el programador no está obligado ni es capaz de satisfacerlo. deseo. Piense en una computadora portátil que se cierra y entra en hibernación; el oscilador de la placa principal sigue pulsando, pero como el programador no se está ejecutando, ningún proceso puede ejecutarse, no importa cuán alta sea su prioridad.

    
respondido por el Kilian Foth 17.08.2016 - 08:26
5

Como se menciona en un comentario Doc Brown , las interrupciones son la clave, y no solo para dormir.

Una interrupción es una señal de hardware que indica que el procesador debe detener lo que está haciendo y ejecutar un fragmento de código. Los dispositivos externos provocan interrupciones cuando necesitan la atención del procesador: por ejemplo, cuando un disco ha terminado de leer los datos, o se ha presionado una tecla, o cuando el temporizador de cuenta regresiva en la placa base ha llegado a cero.

El código de manejo de interrupciones es generalmente muy pequeño y muy rápido. Por ejemplo, cuando el disco indica que se ha copiado un bloque a la memoria, el sistema operativo simplemente puede registrar ese hecho en una lista de "bloques listos" en algún lugar y luego regresar a cualquier otra cosa que esté haciendo. No desea que la CPU pase todo su tiempo en el código de manejo de interrupciones y no en ejecutar el código de usuario.

Una parte del código impulsado por interrupciones que no es necesariamente pequeño es el programador. Se activa mediante una señal de un temporizador de cuenta regresiva y examina el estado del sistema cada vez que se ejecuta. Normalmente, esto incluirá los procesos de identificación que están listos para ejecutarse (por ejemplo, porque el bloque que estaban esperando llegó a la memoria), así como los que han agotado su intervalo de tiempo.

Entonces, cuando ejecutas una suspensión de subprocesos, lo que estás haciendo es decirle al sistema operativo que (1) estás renunciando a tu parte del tiempo, y (2) no debes volver a despertarte hasta que haya transcurrido un tiempo determinado. transcurrido

Siempre que se ejecute el programador, verá su hilo y solo lo marcará como "listo para ejecutarse" si ese tiempo ha transcurrido. Esto es un sondeo, en cierto modo, pero no es un sondeo de "bucle de ocupado", ya que se desencadena por una interrupción. Tampoco es tan caro: por lo general, solo hay un millar de subprocesos que se ejecutan a la vez.

Esto también debería darle una idea de por qué los tiempos de suspensión no son exactos: cuando su hilo esté listo para ejecutarse, es posible que haya otros hilos que aún se estén ejecutando y que no hayan agotado su intervalo de tiempo. O puede haber subprocesos de mayor prioridad que estén listos para ejecutarse.

    
respondido por el kdgregory 17.08.2016 - 13:20

Lea otras preguntas en las etiquetas