Pregunta

Sólo por curiosidad. ¿Cómo funciona realmente la función Sleep () Trabajo (declarada en windows.h)? Tal vez no sólo que la aplicación, pero cualquier persona. Con esto quiero decir - ¿Cómo se implementa? ¿Cómo puede hacer que el código "stop" para un tiempo específico? También curioso sobre cómo cin >> y los realmente trabajo . ¿Qué hacen exactamente?

La única forma que conozco para "bloquear" algo de continuar para funcionar es con un bucle while, pero teniendo en cuenta que el que toma una gran cantidad de potencia de procesamiento en comparación con lo que sucede cuando se está invocando métodos para leer de la entrada estándar (justo comparar un while (true) para una lectura de la entrada estándar), que supongo que no es lo que hacen.

¿Fue útil?

Solución

El sistema operativo utiliza un mecanismo llamado un programador para mantener todos los hilos o procesos de gestión que está comportando muy bien juntos.

varias veces por segundo, reloj de hardware del ordenador interrumpe la CPU, lo que hace que el planificador del sistema operativo para activarse. El planificador continuación, busque en todos los procesos que están tratando de correr y decide qué se llega a ejecutar para el próximo segmento de tiempo.

Las diferentes cosas que utiliza para decidir dependerá de cada estado procesos, y la cantidad de tiempo que ha tenido antes. Así que si el proceso actual ha sido el uso de la CPU en gran medida, evitando que otros procesos de progresar, que hará que la espera proceso actual y permutas en otro proceso para que se pueda hacer algún trabajo.

Más a menudo, sin embargo, la mayoría de los procesos se van a estar en un estado de espera. Por ejemplo, si un proceso está esperando la entrada de la consola, el sistema operativo puede mirar la información de procesos y ver qué puertos io su esperando. Se puede comprobar los puertos para ver si tienen datos para que el proceso funcione en. Si lo hacen, se puede iniciar el proceso de nuevo, pero si no hay datos, entonces ese proceso se pasó por alto para la porción de tiempo actual.

En cuanto a sleep(), cualquier proceso puede notificar al sistema operativo que le gustaría que esperar por un tiempo. El programador se activará incluso antes de una interrupción de hardware (que es también lo que sucede cuando un proceso intenta hacer un bloqueo de lectura de una corriente que no tiene datos listos para ser leído,) y el sistema operativo hace que una nota de lo que el proceso es esperando. Para un sueño, el proceso está esperando una alarma que se apaga, o simplemente puede dió de nuevo cada vez que se reinicia hasta que el temporizador está arriba.

Dado que el sistema operativo sólo se reanuda procesos después de que algo hace que anticiparse a un proceso en ejecución, tales como el proceso de rendimiento o la interrupción de temporizador de hardware que he mencionado, sleep() no es muy preciso, la forma exacta depende del sistema operativo o de hardware, pero es por lo general del orden de uno o más milisegundos.

Si se necesita más precisión, o espera muy cortos, la única opción es utilizar el bucle ocupado construir usted ha mencionado.

Otros consejos

Los horarios sistema operativo cómo los procesos se ejecutan los procesos (que son elegibles para ejecutar, en qué orden, ...). Sleep() probablemente emite una llamada al sistema, que le dice al núcleo “no me deja usar el procesador de x milisegundos”.

En resumen, Sleep () indica al sistema operativo para ignorar el proceso / hilo por un tiempo.

'cin' utiliza un montón de operadores sobrecargados. El '>>', que suele ser la derecha poco de cambio, está sobrecargado para casi todos los tipos de operando de la derecha en C ++. Se proporciona una función separada para cada uno, que se lee de la consola y convierte la entrada en cualquier tipo de variable que has dado. Por ejemplo:

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

Eso no es real, C ++ - No he trabajado con las corrientes y la sobrecarga por un tiempo, así que no recuerdo el tipo de retorno o el orden exacto de los argumentos. Sin embargo, esta función se llama cuando se ejecuta cin >> una variable entera.

La aplicación subyacente exacta depende del sistema operativo.

La respuesta depende del sistema operativo, pero en términos generales, el sistema operativo ya sea horarios algún otro código para funcionar en otro lugar en otro hilo, o si, literalmente, no tiene nada que hacer, se pone la CPU que esperar hasta que se produzca un evento de hardware , lo que hace que la CPU para saltar a algún código llamado un controlador de interrupciones, que puede entonces decidir qué código se ejecute.

Si usted está buscando una manera más controlada de bloquear un tema / proceso en un programa multi-hilo, echar un vistazo a semáforos, mutex, CriticalSections y eventos. Estas son todas las técnicas utilizadas para bloquear un proceso o hilo (sin cargar la CPU a través de una construcción de tiempo).

En esencia, trabajan fuera de un lenguaje / señal Esperar donde el hilo bloqueado está esperando y otro señales de proceso a Decirle que comience de nuevo. Estos (al menos en las ventanas) también pueden tener tiempos de espera, lo que proporciona una funcionalidad similar a la del sueño ().

A un nivel bajo, el sistema tiene una rutina llamada el "planificador" que envía las instrucciones de todos los programas en ejecución en la CPU (s), que en realidad se ejecutan ellos. Las llamadas al sistema como "Sleep" y combinar "usleep" a las instrucciones que le indican al programador ignorar que el hilo o proceso para una cantidad fija de tiempo.

En cuanto a los flujos de C ++, el "cin" oculta el identificador de archivo real (entrada y salida estándar de hecho son tales asas) que está accediendo, y el ">>" para el operador que oculta las llamadas subyacentes a leer y escribir. Desde su interfaz de la aplicación puede ser específica del SO, pero conceptualmente se sigue haciendo cosas como printf y scanf bajo el capó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top