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

Как планировщик ОС восстанавливает управление процессором?

Недавно я начал изучать, как работает процессор и операционная система, и я немного запутался в работе однопроцессорной машины с операционной системой, которая обеспечивает многозадачность.

Таким образом, если моя машина имеет один процессор, это означает, что в любой момент времени может работать только один процесс.

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

Таким образом, на этом компьютере либо пользовательский процесс, либо системный процесс планирования работают в любой момент времени, но не оба.

Итак, вот вопрос:

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

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

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

Предположим, что планирование по временному разрезу я не знаю, как планировщик может нарезать время для выполнения другого процесса, когда он еще не запущен?

Я был бы очень признателен за любое понимание или ссылки, которые вы можете предоставить в этом отношении.

4b9b3361

Ответ 1

ОС настраивает аппаратный таймер (Программируемый таймер интервала или PIT), которые генерируют прерывание каждые N миллисекунд. Это прерывание доставляется в ядро, и пользовательский код прерывается.

Он работает как любое другое аппаратное прерывание. Например, ваш диск заставит переключиться на ядро, когда он завершит IO.

Ответ 2

Google "прерывает". Прерывания находятся в центре многопоточности, вытесняющих ядер, таких как Linux/Windows. Без прерываний ОС никогда ничего не сделает.

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

Прерывания, с точки зрения ОС, бывают двух видов:

  • Аппаратные прерывания - те, которые инициированы фактическим аппаратным сигналом от периферийного устройства. Это может произойти (почти) в любое время и переключить выполнение с любого потока, который может быть запущен, на код в драйвере.

  • Программные прерывания - те, которые инициируются вызовами ОС из текущих запущенных потоков.

Любое прерывание может потребовать, чтобы планировщик сделал потоки, которые ожидали, были готовы/запущены или вызвали прерывание потоков, которые ожидали/работали.

Наиболее важными прерываниями являются те аппаратные прерывания от драйверов периферийных устройств - те, которые готовят потоки, ожидающие ввода-вывода с дисков, сетевых карт, мышей, клавиатур, USB и т.д. Основная причина использования вытесняющих ядер и все проблемы блокировки, синхронизация, сигнализация и т.д. заключается в том, что такие системы имеют очень хорошую производительность ввода-вывода, поскольку аппаратные периферийные устройства могут быстро подготовить/запустить потоки, ожидающие данных от этого оборудования, без каких-либо задержек, возникающих из-за потоков, которые не выдаются, или ожидания периодического таймер перенести.

Аппаратное прерывание таймера, которое вызывает периодические прогоны планирования, важно, потому что у многих системных вызовов есть тайм-ауты, например, в случае, если ответ от периферийного устройства занимает больше времени, чем следует.

В многоядерных системах ОС имеет межпроцессорный драйвер, который может вызывать аппаратное прерывание на других ядрах, что позволяет ОС прерывать/планировать/отправлять потоки на несколько ядер.

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

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

Ответ 3

В дополнение к ответу @usr, приведем цитату из Понимания ядра Linux:

Расписание() Функция

schedule() реализует планировщик. Его цель - найти процесс в списке очереди выполнения, а затем назначить ему процессор. Он вызывается, прямо или лениво, несколькими процедурами ядра. [...]

Ленивый вызов

Планировщик также можно вызывать ленивым способом, установив в поле need_resched current [process] значение 1. Поскольку проверка значения этого поля всегда выполняется перед возобновлением выполнения процесса пользовательского режима (см. Раздел "Возврат"). Из Прерываний и Исключений "в Главе 4) schedule() определенно будет вызван в ближайшее время.