Как работает спящий системный вызов?

917
yanpas

Приложение может попросить ОС приостановить процесс на 0,5 секунды, но как это работает?

Процессор не просто перестает работать в течение этих 0,5 секунды, так как другие программы работают хорошо одновременно, так как же нам приостановить запуск приложения на некоторое время?

Я думаю, что, однако, это будет сделано для всех ОС.

1
Пауза в языке программирования приводит к тому, что на ассемблере (`NOOP` или` NOP`) нет инструкции по работе. Какую проблему ты пытаешься решить? Ramhound 9 лет назад 0
@Ramhound Мне интересно, почему, когда программа приостановлена, она не потребляет ресурсы (время процессора). Процессор должен считать наносекунды, пока пауза не закончится. Или в процессоре есть механизм таймера? yanpas 9 лет назад 0
Он не потребляет ресурсы, потому что, как я уже сказал. Он выполняет операцию NOOP. Возможно, вы захотите провести исследование о том, что это на самом деле означает. Это также означает, что операционная система просто переключается на другую задачу, пока не прервется, чтобы вернуться к другой задаче. Ramhound 9 лет назад 1

1 ответ на вопрос

4
Mokubai

In a multitasking operating system the OS does not have to do anything as extreme as outright stopping the processor from running at all or filling the time that that process was going to be using with other instructions. It can do something infinitely simpler. It can simply not schedule the task to be run at all.

This is the whole point of a multitasking operating system. If multiple tasks all need to run at the same time then the OS swaps one onto the processor, lets it run for a period of time, then swaps the next task in and carries on until all the tasks that need to run have done their jobs.

When a task signals that it wants to sleep for a period of time or to wait for a keypress what it is effectively telling the operating system is don't bother swapping me onto the processor unless time X has passed or don't bother running me unless you have event X waiting for me to action it.

Basically the OS has a long list of tasks that need to run, and against each one would be a "waiting for event" descriptor. Any tasks that are ready to run would be able to be scheduled and any that are not would simply be skipped, simple as that.

If there are literally no tasks at all to run on the processor in a particular time slice then the operating system schedules an "Idle" task which will actually HaLT the CPU and tell it not to execute instructions until it gets woken up, usually by an interrupt of some sort. Using this method of scheduling time to "do no work" fits in well with the paradigm of a multitasking operating system as well.

In order to wake up again the CPU gets interrupt "ticks" via the RTC (real-time clock) and additionally can set up the HPET (High Precision Event Timer) to fire an interrupt at a specific time interval. This allows the OS to halt the CPU for very precise lengths of time and then kick the CPU out of sleep to begin processing tasks again.

Когда я упоминаю инструкцию NOOP, я имею в виду буквальный блок кода, который приостанавливает работу программы. Но ваш ответ, конечно, правильный Ramhound 9 лет назад 0
@Ramhound Я не хотел, чтобы мой ответ был сосредоточен на этом вопросе, и я не хотел, чтобы это звучало так, будто я пытаюсь исправить вас. Я имел в виду то же самое, что и вы, что нет необходимости делать что-либо настолько экстремальное, как заполнение времени кодом или просто остановка процессора. Я видел NOOP в комментариях, и он почему-то застрял в моей голове. Я уточню первый абзац в ближайшее время. Mokubai 9 лет назад 0
Мы говорим похожие, если не идентичные вещи. Вам не нужно ничего исправлять на самом деле. Вы сделали то, что я не смог ответить на вопрос, предоставив дополнительную информацию. Ramhound 9 лет назад 0