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

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

19 голосов
/ 06 февраля 2011

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

Ответы [ 3 ]

22 голосов
/ 06 февраля 2011

Мы можем увидеть спящую операцию с более абстрактной точки зрения: это операция, которая позволяет вам ждать события.
Данное событие запускается, когда время, прошедшее с вызова sleep, превышает сонпараметр.

Когда процесс активен (то есть: он владеет процессором), он может ожидать событие в активном или пассивном режиме:

  • АктивОжидание - это когда процесс активно / явно ожидает события:

    sleep( t ):
        while not [event: elapsedTime > t ]:
            NOP // no operatior - do nothing
    

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

    Обычно это должны делать только те процессы, которые не могут пассивно ждать (см. пункт ниже).).

  • Вместо этого делается пассивное ожидание, когда вы просите кого-то другого разбудить вас, когда происходит событие, и приостанавливаете себя (т.е.asing CPU):

    sleep( t ):
        system.wakeMeUpWhen( [event: elapsedTime > t ] )
        release CPU
    

    Чтобы реализовать пассивное ожидание, вам нужна внешняя поддержка: вы должны быть в состоянии освободить ваш CPU и попросить кого-то еще разбудить вас, когда произойдет событие.

    Это может быть невозможно на устройствах с одной задачей (например, на многих встроенных устройствах), если аппаратное обеспечение не обеспечивает операцию wakeMeUpWhen, поскольку нет никого, кто мог бы освободить ЦП или попросить его разбудить.

    Процессоры

    x86 (и большинство других) предлагают операцию HLT , которая позволяет процессору бездействовать до тех пор, пока не сработает внешнее прерывание.Таким образом, ядра операционной системы также могут спать, чтобы процессор остыл.

4 голосов
/ 06 февраля 2011

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

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

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

1 голос
/ 06 февраля 2011

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

...