Sleep()
is implemented at the OS level. The processor doesn’t spin when a task/thread/process is sleeping. That particular thread is put on a pending queue (the thread isn’t ready to run) until the time has expired at which point the thread will be placed on the ready to run queue.
In the meantime, other threads that are ready to run will be run.
Only if no threads are ready to run will the OS go into the idle thread, which in generally issues instructions to shutdown (or put into a low-power state anyway) the processor until an hardware interrupt occurs.
Only for a very simple system (like the most simple of embedded systems), might Sleep()
actually be implemented as nothing more than a busy wait loop.
Any operating system textbook, such as “Modern Operating Systems” by Tanenbaum will cover this in great detail – pretty much any of them (even an old, cheap, used one).