2009-11-12 24 views
17

sólo estoy interesado cómo sleep(time in ms) se implementa en una biblioteca C o básicamente a nivel de sistema operativo ...¿Cómo se implementa sleep en el nivel del sistema operativo?

estoy adivinando ...

  1. puede ser el basado en la velocidad del procesador haces una while loop of nop's (no estoy seguro de si el tiempo de suspensión será preciso) ...
  2. Cualquier registro especial en el procesador, donde se escribe algún valor y el procesador simplemente se detiene durante un tiempo específico (esto sería muy ineficiente ya que el procesador no puede ejecutar incluso otros programas).

¿Alguna pista? Probablemente el código fuente de la biblioteca C puede explicar? No soy demasiado particular acerca de cómo "C" lo está implementando ... Me pregunto en general cómo se implementa la función "dormir()".

Respuesta

14

Sleep() se implementa en el nivel del sistema operativo. El procesador no gira cuando una tarea/hilo/proceso está durmiendo. Ese hilo en particular se pone en una cola pendiente (el hilo no está listo para ejecutarse) hasta que haya expirado el tiempo en el que el hilo se colocará en la cola lista para ejecutarse.

Mientras tanto, se ejecutarán otros subprocesos que están listos para ejecutarse.

Solo si no hay subprocesos listos para ejecutarse, el sistema operativo entra en el hilo inactivo, que en general emite instrucciones para apagar (o poner en un estado de bajo consumo de todos modos) el procesador hasta que se produce una interrupción de hardware.

Solo para un sistema muy simple (como el más simple de los sistemas integrados), podría Sleep() realmente implementarse como nada más que un ciclo de espera ocupado.

Cualquier libro de texto del sistema operativo, como "Modern Operating Systems" by Tanenbaum cubrirá esto en gran detalle, casi cualquiera de ellos (incluso uno viejo, barato, usado).

+0

ahhh .. así que no se garantiza que se despierte después del tiempo de espera ... ¿depende del planificador o básicamente de otras tareas del sistema ...? – FatDaemon

+3

Qué tan pronto después de expirar el tiempo de espera, la tarea volverá a ejecutarse depende del planificador. El sistema puede garantizar que se ejecutará tan pronto como expire el tiempo de espera, pero creo que la mayoría simplemente lo colocará en el lugar apropiado de la cola lista para ejecutar (que podría estar en la parte delantera si la prioridad del hilo es mayor que cualquier otro), y se ejecutará cuando esté programado. –

+0

Muchos procesadores integrados tienen una instrucción sleep dedicada – mocj

2

La respuesta a su pregunta es totalmente dependiente del sistema operativo y de la implementación.

Una manera simple de pensarlo: cuando llamas al sleep(), el sistema operativo calcula el tiempo de activación y luego coloca tu proceso en una cola de prioridad en alguna parte. Entonces, simplemente no programa su proceso para obtener ningún tiempo de ejecución hasta que haya transcurrido suficiente real para que salga de la cola.

1

No se hace ninguna bucles while, de lo contrario el sistema no será capaz de hacer cualquier cosa - no responde al ratón, teclado, red, etc.

Por lo general, lo que la mayoría de los sistemas operativos hacen es agregar la demora en la marca de tiempo actual para obtener la marca de tiempo cuando se reanudará la tarea que solicitó el retraso (suponiendo que no hay una tarea de mayor prioridad ejecutándose en ese momento) y agregar el [wakeupTimestamp, puntero de tarea] a una lista clasificada por ascendente por la marca de tiempo Después de eso, el sistema operativo realiza un cambio de contexto y ejecuta la siguiente tarea disponible. Periódicamente, el sistema compara la marca de tiempo más temprana en la lista de sueño con la marca de tiempo actual, y si la fecha límite ha pasado, mueve la tarea de dormir a la cola de tareas "lista".

+0

¿Por qué dices algo inteligente en la segunda parte y, sin embargo, eres tan estúpido en la primera parte? un ciclo while es preemptable y no interrumpirá ningún evento de mouse en absoluto. –

2

En un sistema operativo típico, las llamadas al reposo suenan en el kernel, lo que establece que el proceso espere hasta que transcurra el tiempo especificado y luego va y encuentra otro proceso para ejecutar. Si falta algo mejor que hacer, ejecutará el 'proceso inactivo'.Una vez que el tiempo transcurra, el planificador observará que el proceso de dormir está listo para continuar y lo programará de nuevo.

+0

Absolutamente y debe tenerse en cuenta que el proceso de inactividad es un proceso que ejecuta la instrucción HLT. En las CPU modernas se vuelve muy complejo y, según el período de inactividad, pasará a los modos CN. (C0 despierto, C1 sueño corto, ... C7 sueño largo) –

1

Sleep bloquea su tarea/hilo por el valor de tiempo pasado. Su tarea no podrá ejecutarse durante ese período o hasta que ocurra algo más interesante (como una señal), lo que ocurra primero.

No es raro que Sleep invoque select() y no pase descriptores para esperar y un valor de tiempo de espera igual a su período de espera.

El sistema puede implementar esto configurando un temporizador para que caduque después de transcurrido el tiempo y luego esperando en un semáforo que se señalizará cuando expire ese temporizador. Por lo tanto, está bloqueado en ese semáforo.

Cuestiones relacionadas