Планировщик Linux: как он работает с процессами?

Планировщик процессов — часть ядра системы, которая назначает процессорное время процессам. Именно он решает, в какой последовательности они будут выполняться. Если не знаете, что такое процесс, лучше прочитайте этот материал.

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

Как работает планировщик процессов?

На бумаге всё просто: есть готовые к выполнению (runnable) процессы, есть процессоры. Чтобы всё работало оптимально, какой-то процесс всегда должен выполняться. Но если процессоров меньше, чем процессов, то квантов времени на всех сразу не хватит.

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

Особенности процессов и многозадачности

Если на компьютере один процессор, операционные системы делают нужное количество виртуальных процессоров. А если есть несколько физических, то процессы выполняются параллельно на них.

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

Многозадачность в таких системах бывает двух видов:

  • кооперативная
  • преемптивная (вытесняющая)

Преемптивная многозадачность

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

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

Кооперативная многозадачность

А в кооперативной системе многозадачности процесс будет выполняться до момента, пока он сам не решит прекратить выполнение. Когда процесс произвольно замораживается, это называется передачей управления (yielding — буквально “уступление”).

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

Хорошая новость в том, что почти все современные операционные системы работают по преемптивной системе, поэтому таких проблем у них нет.

Чем процесс может быть ограничен?

Процессы могут быть ограничены скоростью ввода-вывода (I/O-bound) и скоростью процессора (processor-bound).

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

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

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

Квант времени

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

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

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

Самый малый квант времени в Linux — 5 мс, по умолчанию — 100 мс, а максимальный — 800 мс.

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

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

Стратегия планирования

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

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

Приоритеты процессов

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

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

Стратегия планирования в Unix-подобных системах работает так, чтобы ограниченные скоростью ввода-вывода процессы были более приоритетными. Чаще всего именно интерактивные программы ограничены скоростью ввода-вывода, поэтому при такой стратегии они начинают реагировать быстрее.

Планировщик процессов Linux динамически управляет приоритетами. По умолчанию он выставляет определённый приоритет процессу, но если нужно поднимает или опускает это значение. 

Диапазоны приоритетов

Ядро Linux использует два диапазона приоритетов: параметр nice и приоритет  реального времени. Первый может иметь значение между -20 и 19, но по умолчанию стоит 0. Чем выше nice, тем ниже приоритет: процесс “вежливо пропускает” не такие “вежливые” процессы вперёд. Ещё этот параметр определяет размер кванта времени для процесса. У -20 будет самый длинный квант, а у 19 — самый короткий.

Второй диапазон приоритетности — приоритеты реального времени, значение которого может быть между 0 и 99. Приоритет процессов реального времени всегда выше, чем у обычных процессов. В Linux приоритеты реального времени сделаны по стандарту POSIX, как и в большинстве Unix.

Итог

Планировщик процессов Linux — это тот парень, который запускает и выгоняет детей с батута. Он делает это так, чтобы всё было в порядке и максимально эффективно. Дети не должны прыгать дольше запланированного времени, их не должно быть слишком много, а сына хозяина батута он пропустит вне очереди.

Если серьёзно, то планировщик — критически важная часть ядра Linux. Система работает с процессами именно так благодаря ему. Из-за преемптивной многозадачности и приоритетной стратегии планирования этот элемент в Linux делает ОС продуктивной и невероятно гибкой. Пользуйтесь этим.

Добавить комментарий

Спасибо, что поделились