Подтвердить что ты не робот

Как выполняется сна на уровне ОС?

Мне просто интересно, как sleep(time in ms) реализован в библиотеке C или в основном на уровне ОС...

Я угадываю...

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

Любые подсказки? Возможно, исходный код библиотеки C может объяснить? Я не слишком подробно расскажу о том, как "C" реализует его... Мне просто интересно, как реализована функция "sleep()".

4b9b3361

Ответ 1

Sleep() реализуется на уровне ОС. Процессор не вращается, когда задача/поток/процесс спят. Этот конкретный поток помещается в ожидающую очередь (поток не готов к запуску) до тех пор, пока время не истечет, и в этот момент поток будет помещен в очередь готовности к запуску.

Тем временем будут запущены другие потоки, готовые к запуску.

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

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

Любой учебник по операционной системе, такой как "Современные операционные системы" от Tanenbaum, расскажет об этом очень подробно - почти любой из них (даже старый, дешевый, используемый).

Ответ 2

Ответ на ваш вопрос полностью зависит от операционной системы и реализации.

Простой способ подумать об этом: когда вы вызываете sleep(), операционная система вычисляет время пробуждения, а затем приостанавливает процесс в очереди приоритетов. Затем он просто не планирует ваш процесс получить какое-либо время выполнения, пока не пройдет достаточно реального времени для его выхода из очереди.

Ответ 3

В типичной операционной системе вызовы спящего режима в ядро, что заставляет процесс ждать, пока не истечет заданное время, а затем отправится и найдет другой процесс для запуска. Отсутствие чего-то лучше сделать, оно запустит "простой процесс". Как только время истечет, планировщик заметит, что спящий процесс хорош, и он будет планировать его снова.

Ответ 4

Вы не выполняете никаких циклов, иначе система не сможет ничего сделать - не реагировать на мышь, клавиатуру, сеть и т.д.

Обычно, что делают большинство операционных систем, вы добавляете задержку в текущую временную метку, чтобы получить отметку времени, когда задача, запрашивающая задержку, будет возобновлена ​​(при условии, что в то время не было задачи с более высоким приоритетом) и добавьте [wakeupTimestamp, указатель задачи] в список, который сортируется по возрастанию по метке времени. После этого ОС выполняет контекстный переключатель и запускает следующую доступную задачу. Периодически система сравнивает самую раннюю временную метку в сонном списке с текущей временной меткой, и если крайний срок прошел, он перемещает спящую задачу в "готовую" очередь задач.

Ответ 5

Сон блокирует вашу задачу/поток для переданного значения времени. Ваша задача становится недействительной за этот период или до тех пор, пока не произойдет что-то интересное (например, сигнал), в зависимости от того, что наступит раньше.

Для сна нередко вызывается select() и не передаются дескрипторы для ожидания, а значение тайм-аута равно вашему периоду ожидания.

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