library c++ windows multithreading blocking scheduler

library - C++-¿Cómo funciona Sleep() y cin?



usleep c++ (7)

Sólo curioso. ¿Cómo funciona realmente la función Sleep () (declarada en windows.h)? Tal vez no solo esa implementación, sino cualquiera. Con eso quiero decir, ¿cómo se implementa? ¿Cómo puede hacer que el código se detenga durante un tiempo específico? También tengo curiosidad por saber cómo funcionan las películas y las que realmente funcionan . ¿Qué hacen exactamente?

La única forma en que sé cómo "bloquear" algo para que no se siga ejecutando es con un bucle while, pero teniendo en cuenta que eso requiere una gran cantidad de potencia de procesamiento en comparación con lo que está sucediendo cuando invocas métodos para leer desde stdin (solo compara un tiempo (verdadero) a una lectura de stdin), supongo que no es lo que hacen.


''cin'' usa una tonelada de operadores sobrecargados. El ''>>'', que generalmente es correcto en el cambio de bits, está sobrecargado para casi todos los tipos de operandos de la derecha en C ++. Se proporciona una función separada para cada una, que lee desde la consola y convierte la entrada en cualquier tipo de variable que haya dado. Por ejemplo:

std::cin::operator>> (int &rhs);

Eso no es C ++ real. No he trabajado con transmisiones y sobrecargas en un tiempo, así que no recuerdo el tipo de retorno ni el orden exacto de los argumentos. Sin embargo, esta función es llamada cuando ejecutas cin >> una variable entera.

La implementación subyacente exacta depende del sistema operativo.


El sistema operativo programa cómo se ejecutan los procesos (qué procesos son elegibles para ejecutarse, en qué orden, ...). Sleep() probablemente emite una llamada al sistema que le dice al kernel "no me dejes usar el procesador durante x milisegundos".


El sistema operativo utiliza un mecanismo llamado planificador para mantener todos los subprocesos o procesos que administra y se comportan muy bien juntos.

varias veces por segundo, el reloj del hardware de la computadora interrumpe la CPU, lo que hace que el programador del sistema operativo se active. Luego, el programador analizará todos los procesos que intentan ejecutarse y decidirá cuál se ejecutará para el siguiente segmento de tiempo.

Las diferentes cosas que utiliza para decidir dependen del estado de cada proceso y de cuánto tiempo ha tenido antes. Entonces, si el proceso actual ha estado usando la CPU en gran medida, evitando que otros procesos progresen, hará que el proceso actual espere e intercambie en otro proceso para que pueda hacer algo de trabajo.

Sin embargo, con más frecuencia, la mayoría de los procesos estarán en estado de espera. Por ejemplo, si un proceso está esperando la entrada de la consola, el sistema operativo puede ver la información de los procesos y ver qué puertos están esperando. Puede verificar esos puertos para ver si tienen algún dato para que el proceso funcione. Si lo hacen, puede iniciar el proceso nuevamente, pero si no hay datos, entonces ese proceso se omite para el intervalo de tiempo actual.

En cuanto a sleep() , cualquier proceso puede notificar al sistema operativo que le gustaría esperar un momento. El programador se activará incluso antes de una interrupción de hardware (que también es lo que sucede cuando un proceso intenta realizar una lectura de bloqueo de una secuencia que no tiene datos listos para ser leídos) y el sistema operativo toma nota de lo que es el proceso. esperando. En el modo de espera, el proceso está esperando a que se active una alarma, o puede volver a aparecer cada vez que se reinicia hasta que se apague el temporizador.

Dado que el sistema operativo solo reanuda los procesos después de que algo lo hace adelantarse a un proceso en ejecución, como el rendimiento del proceso o la interrupción del temporizador del hardware que mencioné, el modo de sleep() no es muy preciso, la precisión depende del sistema operativo o del hardware, pero generalmente está activado El orden de uno o más milisegundos.

Si se necesita más precisión, o esperas muy cortas, la única opción es usar la construcción de bucle ocupado que mencionó.


En resumen, Sleep () le dice al sistema operativo que ignore el proceso / hilo por un tiempo.


En un nivel bajo, el sistema tiene una rutina llamada "programador" que distribuye las instrucciones de todos los programas en ejecución a la (s) CPU (s), que realmente las ejecutan. Las llamadas del sistema como "Suspensión" y "inactividad" coinciden con las instrucciones que le indican al programador que IGNORE ese hilo o proceso durante un período de tiempo fijo.

En cuanto a las transmisiones en C ++, el "cin" oculta el identificador del archivo real (stdin y stdout en realidad son tales identificadores) a los que está accediendo, y el operador ">>" para ello oculta las llamadas subyacentes para leer y escribir. Debido a que es una interfaz, la implementación puede ser específica del sistema operativo, pero conceptualmente todavía está haciendo cosas como printf y scanf bajo el capó.


La respuesta depende del sistema operativo, pero en general, el sistema operativo programa algún otro código para que se ejecute en otra parte de otro hilo, o si literalmente no tiene nada que hacer, la CPU espera a que ocurra un evento de hardware, lo que provoca La CPU para saltar a un código llamado controlador de interrupciones, que luego puede decidir qué código ejecutar.


Si está buscando una forma más controlada de bloquear un subproceso / proceso en un programa de subprocesos múltiples, eche un vistazo a Semáforos, Mutexes, Secciones críticas y Eventos. Estas son todas las técnicas utilizadas para bloquear un proceso o subproceso (sin cargar la CPU a través de un constructo while).

Básicamente trabajan con un lenguaje de espera / señal donde el hilo bloqueado está esperando y otro proceso lo señala para que comience de nuevo. Estos (al menos en Windows) también pueden tener tiempos de espera, lo que proporciona una funcionalidad similar a Sleep ().