Зачем нужен планировщик и его критерии
Кто решает, какому процессу отдать процессор прямо сейчас, и как понять, хорошо ли он это делает.
Планировщик (scheduler) — это часть ОС, которая решает, какой из готовых процессов получит процессор следующим и на какое время.
Зачем вообще планировать
Готовых к работе процессов обычно больше, чем ядер процессора. Кому отдать процессор первым? От ответа зависит, насколько отзывчивой кажется система и эффективно ли используется железо. Плохой планировщик — и интерфейс «лагает», а сервер еле тянет нагрузку. Хороший — и всё летает на том же железе.
Аналогия: касса в супермаркете
Очередь к кассе — это процессы, кассир — процессор. Как обслуживать? Строго по порядку прихода? Сначала тех, у кого пара товаров? Дать каждому ровно минуту и переходить к следующему? Это и есть разные стратегии планирования, и у каждой свои плюсы и минусы. Например, «по порядку прихода» справедливо, но человек с одним товаром будет долго ждать за тем, у кого полная тележка.
Критерии качества планирования
Чтобы сравнивать алгоритмы, нужны метрики. Вот ключевые:
| Метрика | Что измеряет | Хотим |
| Загрузка CPU | доля времени, когда процессор занят | выше (ближе к 100%) |
| Пропускная способность | сколько процессов завершается в единицу времени | выше |
| Время оборота (turnaround) | от прихода до завершения процесса | ниже |
| Время ожидания (waiting) | сколько процесс простоял в очереди готовых | ниже |
| Время отклика (response) | от прихода до первого запуска | ниже (важно для интерактива) |
Как считаются ключевые времена
Запомните три формулы — они понадобятся во всех симуляциях этого раздела:
- Время оборота = время завершения − время прихода.
- Время ожидания = время оборота − время выполнения (burst).
- Время отклика = первый запуск − время прихода.
Считают обычно среднее по всем процессам — по нему и сравнивают алгоритмы.
Конфликт целей
Невозможно оптимизировать всё сразу. Хотим минимальное среднее ожидание — пострадает отзывчивость длинных задач. Хотим максимальную загрузку CPU — может вырасти время отклика. Хотим справедливости — потеряем в пропускной способности. Выбор алгоритма — это всегда компромисс под конкретную задачу: для сервера важна пропускная способность, для настольной ОС — отзывчивость.
Считаем метрики на примере
Дано три процесса, выполняемых по порядку прихода. Посчитаем оборот и ожидание для каждого и средние значения.
# (имя, время прихода, время выполнения)
procs = [("P1", 0, 5), ("P2", 0, 3), ("P3", 0, 8)]
t = 0
total_wait = total_turn = 0
for name, arrival, burst in procs:
start = t
completion = t + burst
turnaround = completion - arrival
waiting = turnaround - burst
total_turn += turnaround
total_wait += waiting
print(f"{name}: старт={start}, завершение={completion}, "
f"оборот={turnaround}, ожидание={waiting}")
t = completion
n = len(procs)
print(f"Среднее ожидание: {total_wait/n:.2f}")
print(f"Средний оборот: {total_turn/n:.2f}")
Вывод:
P1: старт=0, завершение=5, оборот=5, ожидание=0 P2: старт=5, завершение=8, оборот=8, ожидание=5 P3: старт=8, завершение=16, оборот=16, ожидание=8 Среднее ожидание: 4.33 Средний оборот: 9.67
Итог
- Планировщик решает, какой готовый процесс получит процессор и насколько.
- Качество измеряют метриками: загрузка CPU, пропускная способность, оборот, ожидание, отклик.
- Оборот = завершение − приход; ожидание = оборот − выполнение.
- Цели конфликтуют: нельзя оптимизировать всё сразу — нужен компромисс.
- Сравнивают алгоритмы обычно по среднему времени ожидания и оборота.