Некоторые задачи алгоритмов планирования
-
Все системы Справедливость — предоставление каждому процессу справедливой доли процессорного времени Принудительное применение политики — контроль за выполнением принятой политики Баланс — поддержка занятости всех частей системы Системы пакетной обработки данных Пропускная способность — максимальное количество задач в час Оборотное время — минимизация времени, затрачиваемого на ожидание обслуживания и обработку задачи Использование процессора — поддержка постоянной занятости процессора Интерактивные системы Время отклика — быстрая реакция на запросы Соразмерность — выполнение пожеланий пользователя Системы реального времени Окончание работы к сроку — предотвращение потери данных Предсказуемость — предотвращение деградации качества в мультимедийных системах
Планирование процессов построено на определенном наборе правил, исходя из которых планировщик выбирает, когда и какому процессу предоставить вычислительные ресурсы системы.
При этом желательным является удовлетворение нескольких требований, например, минимальное время отклика для интерактивных приложений, высокая производительность для фоновых задач и т. п.
Принципы планирования процессов
Традиционные алгоритмы планирования UNIX обеспечивают возможность одновременного выполнения интерактивных и фоновых приложений.
Эти алгоритмы обеспечивают малое время реакции для интерактивных приложений, следя в то же время, чтобы фоновым громоздким задачам справедливо предоставлялись ресурсы системы.
Планирование процессов в UNIX основано на приоритете процесса, который не является фиксированным и динамически изменяется системой
Традиционно ядро UNIX является "непрерываемым" (nonpreemptive). Это означает, что процесс, находящийся в режиме ядра (в результате системного вызова или прерывания) и выполняющий системные инструкции, не м.б. прерван системой, а вычислительные ресурсы переданы другому, более высокоприоритетному процессу.
В этом состоянии выполняющийся процесс может освободить процессор "по собственному желанию", в результате недоступности какого-либо ресурса перейдя в состояние сна.
система может прервать выполнение процесса только при переходе из режима ядра в режим задачи.
Такой подход значительно упрощает решение задач синхронизации и поддержания целостности структур данных ядра.
Каждый процесс имеет два атрибута приоритета: текущий приоритет, на основании которого происходит планирование, и заказанный относительный приоритет, называемый nice number (или просто nice), который задается при порождении процесса и влияет на текущий приоритет.
Текущий приоритет варьируется в диапазоне от 0 (низкий приоритет) до 127 (наивысший приоритет). Процессы, выполняющиеся в режиме задачи, имеют более низкий приоритет, чем в режиме ядра.
Для режима задачи приоритет меняется в диапазоне 0—65, для режима ядра — 66—95 (системный диапазон).
Процессы, приоритеты которых лежат в диапазоне 96—127, являются процессами с фиксированным приоритетом, не изменяемым ОС, и предназначены для поддержки приложений реального времени.
Процессу, ожидающему недоступного в данный момент ресурса, система определяет значение приоритета сна, выбираемое ядром из диапазона системных приоритетов и связанное с событием, вызвавшее это состояние.
Таблица 3.3. Системные приоритеты сна
-
Событие
Приоритет 4.3BSD UNIX
Приоритет SCO UNIX |
Ожидание загрузки в память сегмента/страницы (свопинг/страничное замещение)
0
95
Ожидание индексного дескриптора
10
88
Ожидание ввода/вывода
20
81
Ожидание буфера
30
80
Ожидание терминального ввода
75
Ожидание терминального вывода
74
Ожидание завершения выполнения
73
Ожидание события — низкоприоритетное состояние сна
40
66
Разделение между приоритетами режима ядра и задачи также зависит от версии.
Когда процесс пробуждается, ядро устанавливает значение текущего приоритета процесса равным приоритету сна.
Поскольку приоритет такого процесса находится в системном диапазоне и выше, чем приоритет режима задачи, вероятность предоставления процессу вычислительных ресурсов весьма велика.
Такой подход позволяет быстро завершить системный вызов, выполнение которого, в свою очередь, может блокировать некоторые системные ресурсы.
После завершения системного вызова перед возвращением в режим задачи ядро восстанавливает приоритет режима задачи, сохраненный перед выполнением системного вызова. Это может привести к понижению приоритета
Текущий приоритет процесса в режиме задачи p_priuser зависит от двух факторов: значения nice number и степени использования вычислительных ресурсов р_срu:
p_priuser=a*p_nice - b*p_cpu,
где p_nice — постоянная составляющая, зависящая от параметра nice.
Здесь выбрана схема, при которой большему значению р_срu соответствует больший приоритет. Поэтому в простейшем случае коэффициент а является отрицательным, a p_nice равно значению параметра (nice number).
Задача планировщика разделения времени — справедливо распределить вычислительный ресурс между конкурирующими процессами.
Для принятия решения о выборе следующего запускаемого процесса планировщику необходима информация об использовании процессора.
Эта составляющая приоритета уменьшается обработчиком прерываний таймера каждый тик. Т.о., пока процесс выполняется в режиме задачи, его текущий приоритет линейно уменьшается.
Каждую секунду ядро пересчитывает текущие приоритеты процессов, готовых к запуску (приоритеты которых меньше 65), последовательно увеличивая их.
Это перемещает процессы в более приоритетные очереди и повышает вероятность их последующего запуска.
Например, UNIX версии SVR3, использует следующую формулу:
p_cpu = p_cpu/2
Эта простая схема проявляет недостаток нивелирования приоритетов при повышении загрузки системы.
В результате степень использования процессора перестает оказывать заметное влияние на приоритет, и низкоприоритетные процессы (т. е. процессы с высоким nice number) практически "отлучаются" от вычислительных ресурсов системы.
В 4.3BSD UNIX для пересчета р_срu используется другая формула:
p_cpu = p_cpu*(2*load)/(2*load+l)
Здесь параметр load равен среднему числу процессов, находившихся в очереди на выполнение за последнюю секунду, и характеризует среднюю загрузку системы за этот период времени.
Этот алгоритм позволяет частично избавиться от недостатка планирования SVR3, т.к. при значительной загрузке системы уменьшение р_срu при пересчете будет происходить медленнее.
Описанные алгоритмы планирования позволяют:
- учесть интересы низкоприоритетных процессов;
- обеспечивать более вероятный выбор планировщиком интерактивных процессов по отношению к вычислительным (фоновым).
Фоновые процессы, потребляющие значительные ресурсы процессора, имеют высокую составляющую р_срu и, как следствие, более низкий приоритет.
Как правило, очередь на выполнение не одна.
Например, SCO UNIX имеет 127 очередей — по одной на каждый приоритет. BSD UNIX использует 32 очереди, каждая из которых обслуживает диапазон приоритетов, например 0—3, 4—7 и т. д.
При выборе следующего процесса на выполнение из одной очереди, т. е. из нескольких процессов с одинаковым текущим приоритетом, используется механизм кругового чередования (round robin).
Этот механизм запускается ядром через каждый временной квант для наиболее приоритетной очереди.
Если все процессы, готовые к запуску, находятся в низкоприоритетных по отношению к текущему процессу очередях, последний будет продолжать выполняться и в течение следующего временного кванта.
Алгоритмы планирования