2011-02-06 31 views
15

Esto podría ser una pregunta estúpida, pero ¿cómo funcionan las funciones sleep(), wait(), pause()?¿Cómo funciona sleep()?

+13

Depende del idioma y del sistema operativo. –

+1

implica una copa de dormir – kelloti

+2

¡No es una pregunta estúpida en absoluto! –

Respuesta

20

Podemos ver la operación de dormir desde un punto de vista más abstracto: es una operación que le permite esperar un evento.
El evento en cuestión se desencadena cuando el tiempo transcurrido desde la invocación sleep supera el parámetro de suspensión.

Cuando un proceso está activo (es decir: posee una CPU) se puede esperar para un evento en una activo o de una manera pasiva:

  • una espera activa es cuando un proceso activamente/espera explícitamente para el evento:

    sleep(t): 
        while not [event: elapsedTime > t ]: 
         NOP // no operatior - do nothing 
    

    Este es un algoritmo trivial y puede ser implementado en cualquier parte una manera portátil, pero tiene el problema de que, si bien el proceso está esperando activamente todavía es propietario de la CPU, desperdiciando (ya que su proceso de doesn Realmente necesita la CPU, mientras que otras tareas podrían necesitarla).

    Por lo general, esto debe hacerse solo por aquellos procesos que no pueden esperar de forma pasiva (consulte el punto siguiente).

  • Una espera pasiva en cambio se hace preguntando a otra cosa para que te despierte cuando ocurra el evento, y la suspensión de sí mismo (es decir: la liberación de la CPU):

    sleep(t): 
        system.wakeMeUpWhen([event: elapsedTime > t ]) 
        release CPU 
    

    Con el fin de poner en práctica una espera pasiva necesita algo de soporte externo: debe poder liberar su CPU y pedirle a alguien que lo despierte cuando ocurra el evento.

    Esto podría no ser posible en dispositivos de una sola tarea (como muchos dispositivos integrados) a menos que el hardware proporcione una operación wakeMeUpWhen, ya que no hay nadie para liberar la CPU o pedir que se despertara.

    x86 procesadores (y la mayoría de los demás) ofrecen una operación HLT que permite que la CPU duerma hasta que se active una interrupción externa. De esta forma también los núcleos del sistema operativo pueden dormir para mantener la CPU fresca.

+1

Gracias. No sabía que diferentes CPU y sistemas operativos lo manejaban de manera diferente ... – Blender

1

Se trata de llamadas al sistema. Busque la implementación en código de código abierto como en Linux o Open BSD.

+2

Los ejemplos son ['nanosleep (2)'] (http://linux.die.net/man/2/ nanosleep) y ['sleep (3)'] (http://linux.die.net/man/3/sleep) documentación para Linux –

+0

+1 gracias por los enlaces ... :-) –

4

Los sistemas operativos modernos son multitarea, lo que significa que parece ejecutar múltiples programas simultáneamente. De hecho, su computadora solamente (tradicionalmente, al menos) solo tiene una CPU, por lo que solo puede ejecutar una instrucción de un programa al mismo tiempo.

La forma en que el sistema operativo hace que parezca que varias cosas (estás navegando en la web, escuchando música y descargando archivos) está sucediendo a la vez es ejecutando cada tarea por un tiempo muy corto (digamos 10 ms). Este cambio rápido hace que parezca que las cosas suceden simultáneamente cuando todo está sucediendo secuencialmente. (con diferencias obvias para el sistema multi-core).

En cuanto a la respuesta a la pregunta: con sleep o wait o IO sincrónico, el programa básicamente le dice al SO que ejecute otras tareas, y no me ejecute hasta que: X ms haya transcurrido, el evento haya sido señalado, o los datos están listos.