stringtranslate.com

Dormir (llamada al sistema)

Un programa informático ( proceso , tarea o subproceso ) puede entrar en estado de suspensión , lo que lo coloca en un estado inactivo durante un período de tiempo. Finalmente, la expiración de un temporizador de intervalo o la recepción de una señal o interrupción hace que el programa reanude su ejecución.

Uso

Una llamada típica al sistema de suspensión toma un valor de tiempo como parámetro, que especifica 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 ofrecen una resolución más precisa, como milisegundos o microsegundos.

Ventanas

En Windows, la Sleep()función toma un único parámetro de la cantidad de milisegundos que se deben esperar para que el sistema entre en modo de suspensión. La Sleep()función está incluida en kernel32.dll . [1]

La Sleep()función tiene una resolución no mayor que 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 "temporizadores multimedia". Para obtener mayor precisión, es necesario utilizar un bucle ocupado sobre QueryPerformanceCounter(), como el que se utiliza en gnulib . [2]

Unix

En sistemas operativos tipo 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 que se debe suspender el reloj. [3] Una versión de mayor precisión es la nanosleep()función y la ahora obsoleta usleep. [4] POSIX también permite elegir fuentes de reloj a través de la versión extendida clock_nanosleep(). [5]

Se propuso una versión de clock_nanosleep()para que formara parte del lenguaje de programación C , pero fue rechazada. La parte de tiempo UTC de la misma propuesta se agregó a C11 . [6]

Ejemplos de C

En la API de Windows :

Dormir ( 2 * 1000 ); // Dormir durante 2 segundos   

En llamadas al sistema Unix o POSIX:

dormir ( 2 ); // Dormir durante 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 período especificado. Si bien, en general, existe una garantía por el período de tiempo mínimo, no existe una garantía estricta de que el subproceso se ejecutará de inmediato o pronto, o incluso en absoluto, una vez que haya transcurrido el tiempo especificado. Depende del criterio del programador y de las prioridades del subproceso y de los detalles de implementación, como las resoluciones del temporizador, cuándo se ejecutará nuevamente el subproceso en suspensión.

En los sistemas POSIX, nanosleep y las llamadas al sistema relacionadas se pueden interrumpir mediante señales, que devuelven el tiempo de suspensión restante. La función de la biblioteca sleep , por otro lado, se implementa mediante la llamada al sistema alarm en muchos sistemas más antiguos, por lo que solo funciona enviando una señal . La función Sleep de Windows no se puede interrumpir debido a la ausencia de señales (aparte de la terminación del hilo o su proceso), aunque la función SleepEx relacionada se puede utilizar para poner el hilo en un estado de alerta, lo que permite realizar llamadas APC mientras el hilo está inactivo. Además, un hilo se puede "interrumpir" técnicamente 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 finalizan ejecutan un bucle de eventos , se quedan dormidos al comienzo de cada ciclo y esperan a que algún evento los despierte. Una vez que se recibe un evento, el programa lo atiende y luego vuelve al comienzo del siguiente ciclo de espera.

Otros programas sondean periódicamente los eventos, entrando en modo de suspensión y reanudando 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 los cambios de estado y luego atiende los que ocurrieron mientras estaba en modo de suspensión. Después de atender los eventos, el programa vuelve a entrar en modo de suspensión durante el siguiente intervalo de tiempo. Este tipo de programas pueden generar ciertos tipos de eventos de latido o señales de mantenimiento de la actividad .

La sleep()llamada a la función se puede llamar repetidamente durante períodos cortos de tiempo para ralentizar la ejecución de un programa o código en ejecución. Limitar el código de esta manera proporciona un mecanismo básico para mitigar los efectos del sobrecalentamiento del hardware [7] o aliviar los problemas de sincronización de los programas heredados. La desventaja de alternar entre estados de suspensión y ejecución en lugar de aprovechar la emulación cíclica (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 pasa muy poco tiempo activo, demasiado tiempo en reposo o una combinación de ambos. [8]

Sueño ininterrumpido

Un estado de suspensión ininterrumpida es un estado de suspensión que no manejará una señal de inmediato. Se reactivará solo como resultado de que un recurso que se estaba esperando esté disponible o después de que se agote el tiempo de espera durante esa espera (si se especifica cuando se pone en suspensión). Lo utilizan principalmente los controladores de dispositivos que esperan E/S de disco o red (entrada/salida). Cuando el proceso está en suspensión de forma ininterrumpida, las señales acumuladas durante la suspensión se notarán cuando el proceso regrese de la llamada o trampa del sistema.

En sistemas tipo Unix, el comando ' ps -l' utiliza el código " D" para el estado de suspensión ininterrumpida de un proceso. [9] Dichos procesos no pueden ser eliminados ni siquiera con SIGKILLy la única forma no sofisticada de deshacerse de ellos es reiniciar el sistema. [10] [11]

Véase también

Referencias

  1. ^ Referencia de la biblioteca MSDN - Sleep()
  2. ^ "winapi - ¿Existe un equivalente de nanosleep para Windows?". Desbordamiento de pila .
  3. ^ sleep(3p)  –  Manual de Linux
  4. ^ nanosleep(3p)  –  Manual de Linux
  5. ^ clock_nanosleep(3p)  –  Manual de Linux
  6. ^ Kuhn, Markus. "API modernizada para ISO C". www.cl.cam.ac.uk .
  7. ^ 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 .
  8. ^ Marletta, Angelo (12 de marzo de 2015). "CPULÍMITE". GitHub . Consultado el 9 de febrero de 2017 .
  9. ^ "top(1) - Página del manual de Linux". man7.org . 2016-12-12 . Consultado el 2017-02-09 .
  10. ^ "Procesos en estado de suspensión ininterrumpida (D)". Novell . 2009-02-21 . Consultado el 2017-02-09 .
  11. ^ Fusco, John (6 de marzo de 2007). La caja de herramientas del programador de Linux . Pearson Education. ISBN 9780132703048.