Função sleep (): Como ela funciona, tecnicamente?
Talvez eu sejo um bobão, mas não consegui encontrar algo satisfatório. Minha duvida é: como se constroi uma função que faz o computador esperar, no mais baixo nível da coisa. Como humano, se te digo "espera 10 segundos", você entende o que quero dizer, mas e o computador, ele claramente não entende o que significa esperar 10 segundos. Como isso funciona?
Observando de um ponto de vista mais abstrato: a operação sleep
é uma operação que permite esperar por um evento.
O método sleep
aceita o número de segundos como argumento e suspende a execução do thread pela quantidade de segundos que está sendo passada como parâmetro.
Quando um processo está ativo ele pode esperar por um evento de forma ativa ou passiva:
Espera Ativa
Uma espera ativa é quando um processo espera ativamente/explicitamente pelo evento:
sleep(time){
while(elapsedTime < time){
// do nothing
}
}
Este é um algoritmo trivial e pode ser implementado em qualquer lugar, mas tem o problema de que, enquanto seu processo está esperando ativamente, ele ainda usa a CPU, desperdiçando-a (já que seu processo realmente não precisa da CPU, enquanto outras tarefas podem precisar dela).
Normalmente, isso deve ser feito apenas por processos que não podem esperar passivamente.
Espera Passiva
Ao contrário de uma espera ativa, uma passiva é feita pedindo a outra coisa para acordá-lo quando o evento acontecer e suspendendo-se (ou seja: liberando a CPU):
sleep(time){
system.wakeMeUpWhen(elapsedTime > time)
releaseCpu()
}
Para implementar uma espera passiva, você precisa de algum suporte externo. Você deve ser capaz de liberar sua CPU e pedir a alguém para acordá-lo quando o evento acontecer.
Isso pode não ser possível em dispositivos de tarefa única (como muitos dispositivos embarcados) a menos que o hardware forneça uma operação wakeMeUpWhen
, já que não há ninguém para liberar a CPU ou pedir para ser ativado.
Os processadores x86 (e a maioria dos outros) oferecem uma operação HLT que permite que a CPU durma até que uma interrupção externa seja acionada. Dessa forma, os kernels do sistema operacional também podem "dormir" para manter a CPU resfriada.
eu tenho a teoria que usa a hora:minuto : segundo: milissegundo
pegando a do momento que o comanda inicia e contando ate ser a igual a do sleep exemplo :
as 8 da manha inicio o sleep() com 20 segundo , ele vai pegar o horario atual e salvar numa variavel como 08 : 00 : 00:00 , depois vai rodando o mesmo comando em loop ate a hora ser 08:00:20:00 e quando for dar um break
os computadores sabem a hora porque na bios ja tem um sistema que conta os segundos