Сон (системный вызов)
( Компьютерная программа процесс , задача или поток ) может перейти в режим сна , что переводит ее в неактивное состояние на определенный период времени. В конечном итоге истечение интервала таймера или получение сигнала или прерывания приводит к возобновлению выполнения программы.
Использование
[ редактировать ]Типичный сна системный вызов принимает значение времени в качестве параметра, определяющего минимальное количество времени, в течение которого процесс должен находиться в режиме ожидания, прежде чем возобновить выполнение. Параметр обычно указывает секунды, хотя некоторые операционные системы обеспечивают более точное разрешение, например миллисекунды или микросекунды.
Окна
[ редактировать ]В Windows Sleep()
Функция принимает единственный параметр количества миллисекунд сна. Sleep()
функция включена в kernel32.dll .
[1]
The 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]
Примеры языка C
[ редактировать ]В Windows API :
Sleep(2 * 1000); // Sleep for 2 seconds
В системных вызовах Unix или POSIX:
sleep(2); // Sleep for 2 seconds
Низкоуровневая функциональность
[ редактировать ]Сон приводит к тому, что поток или процесс отказывается от оставшейся части своего интервала времени и остается в состоянии «Не выполняется» в течение указанного времени. Хотя обычно существует гарантия на минимальный период времени, не существует строгой гарантии того, что поток запустится немедленно, в ближайшее время или даже вообще по истечении указанного времени. Когда спящий поток снова запустится, это остается на усмотрение планировщика и зависит от приоритетов потоков и деталей реализации, таких как разрешение таймера.
В системах POSIX nanosleep и связанные с ним системные вызовы прерываются сигналами, возвращая оставшееся время сна. С другой стороны, функция библиотеки сна реализована через системный вызов сигнализации во многих старых системах, поэтому она работает только путем доставки сигнала . Функция Windows Sleep не прерывается из-за отсутствия сигналов (кроме завершения потока или его процесса), хотя соответствующая функция SleepEx может использоваться для перевода потока в состояние оповещения, позволяя выполнять вызовы APC, пока поток спит. Кроме того, поток технически может быть «прерван», например, в случае, если процесс завершается из-за исключения в другом потоке.
Использование
[ редактировать ]Некоторые системные программы , которые никогда не завершают работу, выполняют цикл обработки событий , переходя в режим сна в начале каждого цикла и ожидая, пока какое-нибудь событие их разбудит. После получения события программа обслуживает его, а затем возвращается к началу следующего цикла ожидания.
Другие программы периодически опрашивают события, переходя в режим сна и возобновляя выполнение через определенный интервал времени. После возобновления выполнения программа опрашивает события или изменения состояния, а затем обслуживает все, что произошло, пока она находилась в режиме ожидания. После обслуживания событий программа снова переходит в режим сна на следующий временной интервал. определенные виды событий сердцебиения или сигналов поддержания активности Программы такого типа могут генерировать .
The sleep()
вызов функции можно вызывать повторно в течение коротких периодов времени, чтобы замедлить выполнение работающей программы или кода. Код регулирования таким образом обеспечивает грубый механизм смягчения последствий перегрева оборудования. [7] или облегчение проблем со сроками для устаревших программ. Обратной стороной циклического переключения состояний сна и работы вместо использования эмуляции цикла (через эмулятор) для управления скоростью выполнения программного обеспечения является то, что интерактивное программное обеспечение будет заметно заикаться, если слишком мало времени проводится в режиме бодрствования, слишком много времени тратится на сон или сочетание того и другого. [8]
Бесперебойный сон
[ редактировать ]Состояние непрерывного сна — это состояние сна, в котором сигнал не обрабатывается сразу. Он просыпается только в результате того, что ожидаемый ресурс становится доступным или после истечения времени ожидания во время этого ожидания (если это указано при переводе в спящий режим). В основном он используется драйверами устройств, ожидающими дискового или сетевого ввода-вывода (ввода/вывода). Когда процесс находится в непрерывном режиме сна, сигналы, накопленные во время сна, будут замечены, когда процесс вернется из системного вызова или ловушки.
В Unix-подобных системах команда ' ps -l
'использует код' D
"для непрерывного сна процесса. [9] Такие процессы невозможно остановить даже с помощью SIGKILL
и единственный нехитрый способ избавиться от них – перезагрузить систему. [10] [11]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Справочник по библиотеке MSDN — Sleep()
- ^ «winapi — существует ли эквивалент nanosleep для Windows?» . Переполнение стека .
- ^ по Linux Руководство —
- ^ по Linux Руководство —
- ^ по Linux Руководство —
- ^ Кун, Маркус. «Модернизированный API для ISO C» . www.cl.cam.ac.uk.
- ^ мион (06.12.2016). «BES – Battle Encoder Shirase 1.6.3 (стабильная) и 1.7.4 для Windows 7/XP/2000» . mion.faireal.net . Проверено 9 февраля 2017 г.
- ^ Марлетта, Анджело (12 марта 2015 г.). «ЦПУЛИМИТ» . Гитхаб . Проверено 9 февраля 2017 г.
- ^ «top(1) — страница руководства Linux» . man7.org . 12 декабря 2016 г. Проверено 9 февраля 2017 г.
- ^ «Процессы в состоянии непрерывного сна (D)» . Новелл . 21 февраля 2009 г. Проверено 9 февраля 2017 г.
- ^ Фуско, Джон (6 марта 2007 г.). Инструментарий программиста Linux . Пирсон Образование. ISBN 9780132703048 .