Jump to content

Сон (системный вызов)

(Перенаправлено из Sleep() )

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

Использование

[ редактировать ]

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

В 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]

См. также

[ редактировать ]
  1. ^ Справочник по библиотеке MSDN — Sleep()
  2. ^ «winapi — существует ли эквивалент nanosleep для Windows?» . Переполнение стека .
  3. ^ sleep(3p) по Linux Руководство
  4. ^ nanosleep(3p) по Linux Руководство
  5. ^ clock_nanosleep(3p) по Linux Руководство
  6. ^ Кун, Маркус. «Модернизированный API для ISO C» . www.cl.cam.ac.uk.
  7. ^ мион (06.12.2016). «BES – Battle Encoder Shirase 1.6.3 (стабильная) и 1.7.4 для Windows 7/XP/2000» . mion.faireal.net . Проверено 9 февраля 2017 г.
  8. ^ Марлетта, Анджело (12 марта 2015 г.). «ЦПУЛИМИТ» . Гитхаб . Проверено 9 февраля 2017 г.
  9. ^ «top(1) — страница руководства Linux» . man7.org . 12 декабря 2016 г. Проверено 9 февраля 2017 г.
  10. ^ «Процессы в состоянии непрерывного сна (D)» . Новелл . 21 февраля 2009 г. Проверено 9 февраля 2017 г.
  11. ^ Фуско, Джон (6 марта 2007 г.). Инструментарий программиста Linux . Пирсон Образование. ISBN  9780132703048 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 149e14aa60f8b0b0279340b2293e59cd__1689595620
URL1:https://arc.ask3.ru/arc/aa/14/cd/149e14aa60f8b0b0279340b2293e59cd.html
Заголовок, (Title) документа по адресу, URL1:
Sleep (system call) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)