Как работает sleep()?

Это может быть глупый вопрос, но как работают функции sleep(), wait(), pause()?

Ответы

Ответ 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, которая позволяет процессору спящий режим, пока не будет вызвано внешнее прерывание. Таким образом, ядра операционной системы могут спать, чтобы поддерживать охлаждение процессора.

Ответ 2

Современные операционные системы являются многозадачными, что означает, что он запускает несколько программ одновременно. Фактически, ваш компьютер (по крайней мере, традиционно) имеет только один процессор, поэтому он может одновременно выполнять только одну команду из одной программы.

То, как ОС показывает, что несколько вещей (вы просматриваете Интернет, слушаете музыку и загружаете файлы), происходит сразу, выполняя каждую задачу за очень короткое время (допустим, 10 мс). Это быстрое переключение позволяет предположить, что материал происходит одновременно, когда все происходит последовательно. (с очевидными отличиями для многоядерной системы).

Что касается ответа на вопрос: со сном или ждущим или синхронным IO, программа в основном говорит ОС о выполнении других задач и не запускает меня снова до тех пор, пока не истечет X ms, событие или данные готовы.

Ответ 3

Это системные вызовы. Просмотрите реализацию в коде с открытым исходным кодом, например, в Linux или Open BSD.