Un programa informático ( proceso , tarea o hilo ) puede entrar en estado de suspensión , lo que lo coloca en un estado inactivo durante un período mínimo de tiempo. Finalmente, la expiración de un temporizador de intervalo , o la recepción de una señal o interrupción, provoca que el programa reanude su ejecución.
Uso
Una llamada típica al sistema de suspensión recibe un valor de tiempo como parámetro, que especifica el tiempo mínimo que el proceso debe permanecer inactivo antes de reanudar su ejecución. El parámetro suele especificarse en segundos, aunque algunos sistemas operativos ofrecen una resolución más precisa, como milisegundos o microsegundos.
Windows
En Windows, la Sleep()función toma un único parámetro: el número de milisegundos de espera. 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 mediante la timeBeginPeriod()familia de API de "temporizadores multimedia". Para obtener mayor precisión, es necesario utilizar un bucle de espera , 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 que indica el número de segundos de espera. [ 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 mediante la versión extendida clock_nanosleep(). [ 5 ]
clock_nanosleep()Se propuso una versión para que formara parte del lenguaje de programación C , pero fue rechazada. La parte de la hora UTC de la misma propuesta se añadió a C11 . [ 6 ]
Ejemplos en C
En la API de Windows :
Dormir ( 2 * 1000 ); // Dormir durante 2 segundosEn llamadas al sistema Unix o POSIX:
dormir ( 2 ); // Dormir durante 2 segundosFuncionalidad de bajo nivel
El estado de suspensión hace que el hilo o proceso renuncie al tiempo restante asignado y permanezca en estado "No ejecutable" durante el tiempo especificado. Si bien generalmente se garantiza un período mínimo, no hay garantía absoluta de que el hilo se ejecute de inmediato, pronto o incluso en absoluto, una vez transcurrido dicho tiempo. El momento en que el hilo suspendido se vuelva a ejecutar queda a discreción del planificador y depende de las prioridades de los hilos y de detalles de implementación, como la resolución de temporizadores.
En los sistemas POSIX, la función nanosleep y las llamadas al sistema relacionadas se pueden interrumpir mediante señales, devolviendo 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 antiguos, por lo que solo funciona al enviar 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 usar para poner el hilo en un estado de alerta, lo que permite realizar llamadas APC mientras el hilo está en suspensión. Además, un hilo puede ser técnicamente "interrumpido" en caso de que, por ejemplo, el proceso termine debido a una excepción en otro hilo.
Usos
Algunos programas del sistema que nunca finalizan ejecutan un bucle de eventos , entrando en estado de reposo al inicio de cada ciclo y esperando que algún evento los despierte. Una vez recibido el evento, el programa lo procesa y luego regresa al inicio del siguiente ciclo de espera.
Otros programas sondean periódicamente la actividad entrando en modo de suspensión y reanudando su ejecución tras un intervalo de tiempo específico. Una vez reanudada la ejecución, el programa sondea la actividad en busca de eventos o cambios de estado y, a continuación, procesa los que se hayan producido durante su suspensión. Tras procesar 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 señales de actividad o de mantenimiento de conexión .
La sleep()llamada a la función puede repetirse durante cortos periodos 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 rudimentario para mitigar los efectos del sobrecalentamiento del hardware [ 7 ] o aliviar los problemas de sincronización en programas heredados. La desventaja de alternar entre los estados de suspensión y ejecución en lugar de aprovechar la emulación de ciclos (mediante un emulador) para controlar la velocidad de ejecución del software es que el software interactivo presentará un tartamudeo notable si se pasa muy poco tiempo activo, demasiado tiempo en suspensión o una combinación de ambos. [ 8 ]
sueño ininterrumpido
El estado de suspensión ininterrumpible es aquel que no procesa una señal de inmediato. Solo se activa cuando un recurso en espera queda disponible o tras un tiempo de espera (si se especificó al activarlo). Lo utilizan principalmente los controladores de dispositivos que esperan operaciones de entrada/salida (E/S) de disco o red. Cuando un proceso se encuentra en suspensión ininterrumpible, las señales acumuladas durante la misma se detectan al finalizar la llamada al sistema o la interrupción.
En sistemas tipo Unix, el comando ' ps -l' utiliza el código ' D' para el estado de suspensión ininterrumpible de un proceso. [ 9 ] Estos procesos no se pueden terminar ni siquiera con SIGKILLy la única forma no sofisticada de deshacerse de ellos es reiniciar el sistema. [ 10 ] [ 11 ]
Véase también
Referencias
- ↑ Referencia de la biblioteca MSDN - Sleep()
- ↑ "winapi - ¿Existe un equivalente de nanosleep en Windows?" . Stack Overflow .
- ↑ – Manual de Linux de Manned.org
- ↑ – Manual de Linux de Manned.org
- ↑ – Manual de Linux de Manned.org
- ↑ Kuhn, Markus. " API modernizada para ISO C" . www.cl.cam.ac.uk.
- ↑ mion (06-12-2016). "BES – Battle Encoder Shirase 1.6.3 (estable) y 1.7.4 para Windows 7/XP/2000" . mion.faireal.net . Consultado el 09-02-2017 .
- ^ Marletta, Angelo (12 de marzo de 2015). "CPULÍMITE" . GitHub . Consultado el 9 de febrero de 2017 .
- ↑ "top(1) - Página del manual de Linux" . man7.org . 12/12/2016 . Consultado el 09/02/2017 .
- ↑ "Procesos en un estado de sueño ininterrumpible (D)" . Novell . 21 de febrero de 2009. Consultado el 9 de febrero de 2017 .
- ↑ Fusco, John (6 de marzo de 2007). The Linux Programmer's Toolbox . Pearson Education. ISBN 9780132703048.
- Proceso (informática)
- Hilos (informática)