Планирование процессов
Задача планировщика
Готовых к выполнению потоков обычно больше, чем процессоров. Планировщик решает, кто будет выполняться и как долго.
Цели (часто противоречат друг другу):
| Критерий | Смысл |
|---|---|
| Загрузка процессора | процессор не простаивает |
| Пропускная способность | больше задач в единицу времени |
| Время ожидания | меньше времени в очереди готовых |
| Время отклика | интерактивные программы реагируют быстро |
| Справедливость | каждый получает свою долю |
Когда вызывается планировщик
- процесс блокируется (ввод-вывод,
wait,sleep); - процесс завершается;
- прерывание таймера — истёк квант времени;
- проснулся процесс с более высоким приоритетом.
Невытесняющее планирование: процесс работает, пока сам не отдаст процессор. Вытесняющее: ядро может отобрать процессор по таймеру. Все современные ОС общего назначения — вытесняющие.
Классические алгоритмы
FCFS (First Come, First Served)
Очередь в порядке прихода. Просто, но один длинный процесс задерживает всех («эффект конвоя»).
SJF (Shortest Job First)
Первым — самый короткий. Минимальное среднее время ожидания, но длительность заранее неизвестна (её прогнозируют по прошлым запускам).
Round Robin (карусель)
Каждый получает квант (например, 10 мс), затем уходит в конец очереди.
Слишком маленький квант — много переключений контекста; слишком большой — превращается в FCFS.
Приоритеты
Каждому процессу — приоритет, выбирается самый приоритетный. Проблема голодания низкоприоритетных решают старением: приоритет растёт со временем ожидания.
Многоуровневые очереди с обратной связью
Несколько очередей с разными приоритетами и квантами. Процесс, израсходовавший квант целиком (счётный), опускается ниже; часто блокирующийся (интерактивный) остаётся наверху. Так работал планировщик классического Unix.
Планирование в Linux
CFS (Completely Fair Scheduler, ядра 2.6.23–6.5) и пришедший ему на смену EEVDF (с 6.6) стремятся дать каждому потоку справедливую долю процессора:
- для каждого потока считается виртуальное время выполнения (
vruntime) — сколько он проработал, взвешенно по приоритету; - выбирается поток с наименьшим
vruntime(CFS хранит их в красно-чёрном дереве); - вес зависит от значения nice (−20…19): разница в 1 по nice ≈ 10% процессорного времени.
nice -n 10 ./long_job # запустить «уступчиво»
renice -n 5 -p 4242 # изменить для работающего
top / htop # столбцы PR и NI
Политики реального времени
| Политика | Поведение |
|---|---|
SCHED_OTHER (SCHED_NORMAL) |
обычная, CFS/EEVDF |
SCHED_FIFO |
реального времени: работает, пока не заблокируется или не появится более приоритетный |
SCHED_RR |
реального времени с квантом |
SCHED_IDLE, SCHED_BATCH |
фоновые задачи |
Потоки реального времени (приоритет 1–99) всегда вытесняют обычные.
Итог
- Планировщик выбирает следующий поток; вытесняющее планирование использует прерывания таймера.
- FCFS — просто, SJF — минимум ожидания, Round Robin — справедливо и отзывчиво, приоритеты требуют защиты от голодания.
- Linux: справедливое планирование по
vruntimeс весами по nice; отдельные политики реального времени.
Практика решено 0 из 5
Три процесса пришли одновременно в порядке P1, P2, P3 с временами выполнения 24, 3 и 3 мс. Каково среднее время ожидания при планировании FCFS (в порядке прихода)? Введите число в мс.
Те же процессы (24, 3 и 3 мс) планируются по SJF (сначала самые короткие). Каково среднее время ожидания в мс?
Что происходит при Round Robin, когда у процесса истекает квант времени?
Вытесняющий или невытесняющий алгоритм?
| Вытесняющий | Невытесняющий | |
|---|---|---|
| FCFS (первым пришёл — первым обслужен) | ||
| Round Robin | ||
| SJF без вытеснения | ||
| CFS в Linux |
Что делает команда nice -n 10 ./prog?
Войдите, чтобы отмечать пройденные уроки.