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){
}
}
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.