Pergunta

Apenas curioso. Como é realmente a função Sleep () trabalho (declarado em windows.h)? Talvez não apenas que a implementação, mas qualquer um. Com isso, quero dizer - como é implementado? Como é que pode tornar o código "stop" para um momento específico? Também curioso sobre como cin >> e aqueles realmente trabalho . O que eles fazem exatamente?

A única maneira que eu sei como algo "bloco" de continuar a corrida é com um loop while, mas considerando que que leva uma enorme quantidade de poder de processamento em comparação com o que está acontecendo quando você está invocando métodos para ler de stdin (basta comparar um tempo (true) para uma leitura de stdin), eu estou supondo que não é o que eles fazem.

Foi útil?

Solução

O sistema operacional usa um mecanismo chamado de um programador para manter todos os segmentos ou processos é gerir comportando muito bem juntos.

várias vezes por segundo, interrupções relógio de hardware do computador da CPU, o que provoca programador do sistema operacional para tornar-se activado. O programador, então, olhar para todos os processos que estão tentando executar e decide que um começa a correr para a próxima fatia de tempo.

As coisas diferentes que ele usa para decidir depender de cada estado processos, e quanto tempo ele teve antes. Então, se o atual processo tem vindo a utilizar a CPU fortemente, impedindo que outros processos de progredir, ele vai fazer a espera do processo atual e swaps em outro processo para que ele possa fazer algum trabalho.

Muitas vezes, porém, a maioria dos processos está indo para estar em um estado de espera. Por exemplo, se um processo está aguardando entrada do console, o sistema operacional pode olhar para a informação de processos e ver qual io portas a sua espera para. Pode verificar as portas para ver se eles têm quaisquer dados para o processo de trabalhar. Se o fizerem, ele pode iniciar o processo novamente, mas se não houver dados, então esse processo fica pulado para a fatia de tempo atual.

como para sleep(), qualquer processo pode notificar o sistema operacional que ele gostaria de esperar por um tempo. O programador será ativada mesmo antes de uma interrupção de hardware (que é também o que acontece quando um processo tenta fazer uma leitura de blocos de um riacho que não tem dados pronto para ser lido), e o sistema operacional faz uma nota do que o processo é esperando por. Para um sono, o processo está à espera de um alarme para disparar, ou pode simplesmente deu de novo cada vez que for reiniciado até que o temporizador é para cima.

Uma vez que o sistema operacional única retoma processos depois algo faz com que ele antecipar um processo em execução, tais como o processo rendendo ou o temporizador de interrupção de hardware eu mencionei, sleep() não é muito preciso, como exato depende do sistema operacional ou hardware, mas é normalmente na ordem de um ou mais milissegundos.

Se mais precisão é necessário, ou espera muito curtos, a única opção é usar a construção de loop ocupado que você mencionou.

Outras dicas

Os horários do sistema operacional como os processos funcionam (que processos são elegíveis para rodar, em que ordem, ...). Sleep() provavelmente emite uma chamada de sistema que informa o kernel “não me deixe usar o processador para x milissegundos”.

Em suma, Sleep () diz ao sistema operacional para ignorar o processo / thread por um tempo.

'cin' usa uma tonelada de operadores sobrecarregados. O '>>', que normalmente é pouco shift direita, está sobrecarregado para praticamente todo o tipo de operando à direita em C ++. A função separada é fornecido para cada um, que lê a partir do console e converte a entrada em qualquer tipo de variável que você deu. Por exemplo:

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

Isso não é real C ++ - Eu não tenho trabalhado com riachos e sobrecarga em um tempo, então eu não me lembro o tipo de retorno ou a ordem exata dos argumentos. No entanto, esta função é chamada quando você executar cin >> uma variável inteira.

A implementação exata subjacentes depende do sistema operacional.

A resposta depende do sistema operacional, mas de um modo geral, o sistema operacional, quer horários algum outro código para ser executado em outro lugar em outro segmento, ou se ele tem literalmente nada a fazer, ele começa o CPU que esperar até que um evento de hardware ocorre , o que faz com que a CPU para saltar para algum código chamado um manipulador de interrupção, o que pode então decidir o código seja executado.

Se você está procurando uma maneira mais controlada de bloquear uma thread / processo em um programa multi-threaded, ter um olhar para semáforos, exclusões mútuas, CriticalSections e Eventos. Estas são todas as técnicas utilizadas para bloquear um processo ou de fios (sem carregar a CPU através de um tempo construo).

Eles essencialmente trabalhar fora de um Wait idioma / Signal onde a bloqueou thread está esperando e mais sinais de processo que dizer a ele para começar de novo. Estes (pelo menos no Windows) também pode ter limites de tempo, proporcionando assim uma funcionalidade semelhante à Sleep ().

Em um nível baixo, o sistema tem uma rotina chamado de "programador" que envia as instruções de todos os programas em execução a (s) da CPU, o que realmente executá-los. chamadas de sistema como "Sleep" e combinar "usleep" para instruções que dizem o programador ignorar que thread ou processo por um período fixo de tempo.

Como para fluxos de C ++, o "cin" esconde o identificador de arquivo real (stdin e stdout são realmente essas alças) que você está acessando, e ">>" operador para ele esconde as chamadas subjacentes a ler e escrever. Desde a sua interface a implementação pode ser específica do sistema operacional, mas conceitualmente ele ainda está fazendo coisas como printf e scanf sob o capô.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top