Компьютерная программа ( процесс , задача или поток ) может заснуть , что переводит ее в неактивное состояние на определенный период времени. В конечном итоге истечение интервального таймера или получение сигнала или прерывания заставляют программу возобновить выполнение.
Типичный системный вызов sleep принимает значение времени в качестве параметра, определяя минимальное время, в течение которого процесс должен находиться в спящем режиме перед возобновлением выполнения. Параметр обычно указывает секунды, хотя некоторые операционные системы предоставляют более точное разрешение, например миллисекунды или микросекунды.
В Windows Sleep()
функция принимает один параметр — количество миллисекунд для сна. Функция Sleep()
включена в kernel32.dll . [1]
Функция Sleep()
имеет разрешение не выше текущего разрешения таймера, обычно 16 мс, но не менее 1 мс, регулируемое через timeBeginPeriod()
семейство API "медиа-таймеров". Для более высокой точности необходимо использовать занятый цикл по QueryPerformanceCounter()
, такой как тот, который используется в gnulib . [2]
В Unix-подобных и других POSIX- операционных системах sleep()
функция вызывается с предоставлением одного параметра типа беззнакового целого числа секунд для сна. [3] Более точная версия — это nanosleep()
функция и теперь устарела usleep
. [4] POSIX также позволяет выбирать источники синхронизации с помощью расширенной версии clock_nanosleep()
. [5]
Версия clock_nanosleep()
была предложена как часть языка программирования C , но была отклонена. Часть того же предложения, касающаяся времени UTC, была добавлена в C11 . [6]
В API Windows :
Сон ( 2 * 1000 ); // Спим 2 секунды
В системных вызовах Unix или POSIX:
sleep ( 2 ); // Спим 2 секунды
Sleep заставляет поток или процесс отказаться от остатка своего временного среза и оставаться в состоянии Not Runnable в течение указанного времени. Хотя обычно есть гарантия на минимальный период времени, нет строгой гарантии, что поток будет запущен немедленно или вскоре, или вообще, по истечении указанного времени. Это остается на усмотрение планировщика и зависит от приоритетов потоков и деталей реализации, таких как разрешения таймера, когда спящий поток будет запущен снова.
В системах POSIX nanosleep и связанные с ним системные вызовы прерываются сигналами, возвращая оставшееся время сна. С другой стороны, функция библиотеки sleep реализована через системный вызов alarm во многих старых системах, поэтому она работает только путем доставки сигнала . Функция Windows Sleep не прерывается из-за отсутствия сигналов (кроме завершения потока или его процесса), хотя связанная с ней функция SleepEx может использоваться для перевода потока в состояние оповещения, позволяя выполнять вызовы APC, пока поток спит. Кроме того, поток может быть технически «прерван» в случае, например, если процесс завершается из-за исключения в другом потоке.
Некоторые системные программы , которые никогда не завершаются, выполняют цикл событий , засыпая в начале каждого цикла и ожидая некоторого события, которое их разбудит. После получения события программа обслуживает его, а затем возвращается к началу следующего цикла ожидания.
Другие программы периодически опрашивают события, переходя в спящий режим и возобновляя выполнение через определенный интервал времени. После возобновления выполнения программа опрашивает события или изменения статуса, а затем обслуживает все, что произошло, пока она спала. После обслуживания событий программа снова переходит в спящий режим на следующий интервал времени. Определенные виды событий сердцебиения или сигналов keep-alive могут генерироваться такими программами.
Вызов функции sleep()
может быть многократно вызван в течение коротких промежутков времени, чтобы замедлить выполнение работающей программы или кода. Регулирование кода таким образом обеспечивает грубый механизм для смягчения последствий перегрева оборудования [7] или облегчения проблем синхронизации для устаревших программ. Недостатком циклического сна и состояний выполнения вместо использования эмуляции цикла (через эмулятор) для управления скоростью выполнения программного обеспечения является то, что интерактивное программное обеспечение приобретет заметное заикание, если слишком мало времени проводится в состоянии бодрствования, слишком много времени проводится в состоянии сна или происходит комбинация того и другого. [8]
Непрерываемое состояние сна — это состояние сна, которое не будет обрабатывать сигнал немедленно. Оно проснется только в результате того, что ожидаемый ресурс станет доступным или после того, как во время этого ожидания произойдет тайм-аут (если указано при переводе в режим сна). Оно в основном используется драйверами устройств, ожидающими дискового или сетевого ввода-вывода (ввода/вывода). Когда процесс находится в состоянии непрерывного сна, сигналы, накопленные во время сна, будут замечены, когда процесс вернется из системного вызова или ловушки.
В Unix-подобных системах команда ' ps -l
' использует код " D
" для непрерывного спящего состояния процесса. [9] Такие процессы не могут быть завершены даже с помощью SIGKILL
, и единственный простой способ избавиться от них — перезагрузить систему. [10] [11]