Ответ 1
Мы можем видеть операцию спящего режима с более абстрактной точки зрения: это операция, которая позволяет подождать события.
Событие, о котором идет речь, запускается, когда время, прошедшее от вызова sleep
, превышает параметр sleep.
Когда процесс активен (т.е. он владеет процессором), он может ждать события активным или пассивным образом:
-
Активное ожидание - это когда процесс активно/явно ждет события:
sleep( t ): while not [event: elapsedTime > t ]: NOP // no operatior - do nothing
Это тривиальный алгоритм и может быть реализован везде, где это переносится, но имеет проблему, что, пока ваш процесс активно ждет, он все еще владеет процессором, тратя его впустую (так как вашему процессу действительно не нужен процессор, тогда как другие задачи могут понадобиться).
Обычно это должно выполняться только тем процессом, который не может пассивно ждать (см. пункт ниже).
-
Вместо этого происходит пассивное ожидание, прося что-то еще, чтобы разбудить вас, когда произойдет событие, и приостановить себя (то есть: освободить процессор):
sleep( t ): system.wakeMeUpWhen( [event: elapsedTime > t ] ) release CPU
Чтобы реализовать пассивное ожидание, вам нужна внешняя поддержка: вы должны иметь возможность выпускать свой процессор и просить кого-то еще разбудить вас, когда произойдет событие.
Это невозможно для однозадачных устройств (например, для многих встроенных устройств), если аппаратное обеспечение не выполняет операцию
ПроцессорыwakeMeUpWhen
, так как никто не может выпустить CPU или попросить пробудиться.x86 (и большинство других) предлагают операцию HLT, которая позволяет процессору спящий режим, пока не будет вызвано внешнее прерывание. Таким образом, ядра операционной системы могут спать, чтобы поддерживать охлаждение процессора.