Un programa de computadora ( proceso , tarea o hilo ) puede dormir , lo que la sitúa en un estado inactivo durante un período de tiempo. Finalmente, la expiración de un temporizador de intervalos , o la recepción de una señal o interrupción hace que el programa reanude la ejecución.
Uso
Una llamada típica al sistema de suspensión toma un valor de tiempo como parámetro, especificando la cantidad mínima de tiempo que el proceso debe permanecer en suspensión antes de reanudar la ejecución. El parámetro normalmente especifica segundos, aunque algunos sistemas operativos proporcionan una resolución más fina, como milisegundos o microsegundos.
Ventanas
En Windows, la Sleep()
función toma un solo parámetro de la cantidad de milisegundos para dormir. La Sleep()
función está incluida en kernel32.dll . [1]
La Sleep()
función tiene una resolución no superior a la resolución actual del temporizador, normalmente 16 ms pero como mínimo 1 ms, ajustable a través de la timeBeginPeriod()
familia de API de "temporizador de medios". Para precisiones más altas, es necesario utilizar un bucle ocupado más QueryPerformanceCounter()
, tal como la utilizada en gnulib . [2]
Unix
En Unix y otros sistemas operativos POSIX , la sleep()
función se llama proporcionando un único parámetro de tipo entero sin signo de la cantidad de segundos para dormir. [3] Una versión de mayor precisión es la nanosleep()
función y ahora está en desuso usleep
. [4] POSIX también permite elegir fuentes de reloj a través de la versión extendida clock_nanosleep()
. [5]
Se clock_nanosleep()
propuso una versión de para ser parte del lenguaje de programación C , pero fue rechazada. La parte de la hora UTC de la misma propuesta se agregó a C11 . [6]
C ejemplos
En la API de Windows :
Sueño ( 2 * 1000 ); // Duerme 2 segundos
En llamadas al sistema Unix o POSIX:
dormir ( 2 ); // Duerme 2 segundos
Funcionalidad de bajo nivel
La suspensión hace que el subproceso o proceso abandone el resto de su intervalo de tiempo y permanezca en el estado No ejecutable durante el tiempo especificado. Si bien generalmente existe una garantía por el período de tiempo mínimo, no existe una garantía estricta de que el hilo se ejecute inmediatamente o pronto, o incluso en absoluto, una vez transcurrido el tiempo especificado. Depende de la discreción del planificador y depende de las prioridades del hilo y los detalles de implementación, como las resoluciones del temporizador, cuándo se ejecutará de nuevo el hilo inactivo.
En los sistemas POSIX, el nanosueño y las llamadas al sistema relacionadas son interrumpibles por señales, devolviendo el tiempo de sueño restante. La función de biblioteca de sueño , por otro lado, se implementa a través de la llamada al sistema de alarma en muchos sistemas más antiguos, por lo que solo funciona enviando una señal . La función de suspensión de Windows no se puede interrumpir debido a la ausencia de señales (que no sean el hilo o su proceso finalizado), aunque la función SleepEx relacionada se puede utilizar para poner el hilo en un estado de alerta, lo que permite que se realicen llamadas APC mientras el hilo está durmiendo. Además, un hilo puede ser técnicamente "interrumpido" en caso de que, por ejemplo, el proceso finalice debido a una excepción en un hilo diferente.
Usos
Algunos programas del sistema que nunca terminan ejecutan un bucle de eventos , se duermen al comienzo de cada ciclo y esperan que algún evento los despierte. Una vez que se recibe un evento, el programa lo atiende y luego regresa al comienzo del siguiente ciclo de espera.
Otros programas sondean periódicamente eventos al irse a dormir y reanudar la ejecución después de un intervalo de tiempo específico. Una vez que se reanuda la ejecución, el programa sondea los eventos o cambios de estado, y luego atiende los que ocurrieron mientras estaba inactivo. Después de reparar los eventos, el programa vuelve a dormir para el siguiente intervalo de tiempo. Este tipo de programas pueden generar ciertos tipos de eventos de latidos del corazón o señales de mantener vivo .
La sleep()
llamada a la función se puede llamar repetidamente durante cortos períodos de tiempo para ralentizar la ejecución de un programa o código en ejecución. La limitación del código de esta manera proporciona un mecanismo burdo para mitigar los efectos del sobrecalentamiento del hardware [7] o aliviar los problemas de sincronización de los programas heredados. La desventaja de los estados de inactividad y ejecución en bicicleta en lugar de aprovechar la emulación de ciclo (a través de un emulador) para controlar la velocidad de ejecución del software es que el software interactivo adquirirá un tartamudeo notable si se pasa muy poco tiempo despierto, demasiado tiempo durmiendo o una combinación de ambos. [8]
Sueño ininterrumpido
Un estado de suspensión ininterrumpida es un estado de suspensión que no maneja una señal de inmediato. Se activará solo como resultado de que un recurso esperado esté disponible o después de que ocurra un tiempo de espera durante esa espera (si se especifica cuando se pone en suspensión). Lo utilizan principalmente los controladores de dispositivos que esperan una E / S de disco o de red (entrada / salida). Cuando el proceso está durmiendo ininterrumpidamente, las señales acumuladas durante el sueño se notarán cuando el proceso regrese de la llamada o trampa del sistema.
En sistemas similares a Unix, el comando ' ps -l
' usa código " D
" para el estado de suspensión ininterrumpida de un proceso. [9] Estos procesos no se pueden matar ni siquiera con SIGKILL
y la única forma no sofisticada de deshacerse de ellos es reiniciar el sistema. [10] [11]
Ver también
Referencias
- ^ Referencia de la biblioteca de MSDN: suspensión ()
- ^ "winapi - ¿Existe un equivalente de Windows a nanosleep?" . Desbordamiento de pila .
- ^ Manual de Linux -
- ^ - Manual de Linux
- ^ - Manual de Linux
- ^ Kuhn, Markus. "API modernizada para ISO C" . www.cl.cam.ac.uk .
- ^ mion (6 de diciembre de 2016). "BES - Battle Encoder Shirase 1.6.3 (estable) y 1.7.4 para Windows 7 / XP / 2000" . mion.faireal.net . Consultado el 9 de febrero de 2017 .
- ^ Marletta, Angelo (12 de marzo de 2015). "CPULIMIT" . GitHub . Consultado el 9 de febrero de 2017 .
- ^ "top (1) - Página de manual de Linux" . man7.org . 2016-12-12 . Consultado el 9 de febrero de 2017 .
- ^ "Procesos en un estado de suspensión ininterrumpida (D)" . Novell . 2009-02-21 . Consultado el 9 de febrero de 2017 .
- ^ Fusco, John (6 de marzo de 2007). Caja de herramientas del programador de Linux . Educación Pearson. ISBN 9780132703048.