Приведён фрагмент планировщика процессов в ОС: while True: for p in ready: if p.time_slice>0: run(p); p.time_slice-=1; else: p.time_slice=DEFAULT; перейти к следующему; — проанализируйте возможные проблемы с приоритетами, интерактивностью и справедливостью планирования, предложите и обоснуйте альтернативную стратегию

6 Ноя в 07:22
2 +2
0
Ответы
1
Проблемы текущего фрагмента
- Нет приоритетов: алгоритм не учитывает приоритеты процессов — все равны. Нельзя выразить предпочтение CPU‑важным задачам или интерактивным.
- Плохая интерактивность: если в ready много процессов, задержка перед следующим запуском конкретного процесса ~ NNN циклов, т.е. худший отклик примерно latency≈N⋅DEFAULT\mathrm{latency}\approx N\cdot\mathrm{DEFAULT}latencyNDEFAULT. Интерактивный процесс может ждать полного прохода списка и своего восстановления с нулевого кванта.
- Несправедливость и «хрупкость» к поведению: CPU‑жадные процессы получают свои кванты подряд, короткие/блокирующие процессы теряют бонусы (после блокировки/пробуждения они получают тот же квант как и все). Доля CPU каждого процесса фактически ≈1/N\approx 1/N1/N, что не гибко.
- Неполная предсказуемость: когда time_slice становится 0, процесс сбрасывается в DEFAULT\mathrm{DEFAULT}DEFAULT и пропускает текущий проход — это создаёт лишние пропуски и усложняет гарантию задержек.
- Возможность голодания при добавлении новых процессов или отсутствии механизма старения; нет механизмов защиты от приоритетной инверсии (donation).
Альтернатива 1 — Многоуровневые очереди с обратной связью (MLFQ)
- Идея: несколько очередей уровней приоритетов; новая задача в верхней (высокий приоритет). Если процесс исчерпал квант — понижается на уровень; если блокируется (I/O) — повышается. Внутри уровня — Round‑Robin.
- Плюсы: хорошая интерактивность (I/O‑короткие процессы остаются в верхних уровнях), простая реализация, поведение близко к «favor short jobs».
- Параметры: базовый квант q0q_0q0 , уровни k=0..K−1k=0..K-1k=0..K1, quantumk=2kq0\text{quantum}_k = 2^k q_0quantumk =2kq0 — увеличивает долю для длительных задач.
- Минусы: подбор параметров и возможные «игры» со стороны процессов; потребует механизма отката/усиления по времени (aging).
Альтернатива 2 — Подход типа CFS (Completely Fair Scheduler)
- Идея: каждому процессу сопоставлять виртуальное время vruntimep\text{vruntime}_pvruntimep ; планировать процесс с минимальным vruntime\text{vruntime}vruntime. После выполнения на Δt\Delta tΔt: vruntimep+=Δt⋅1wp\text{vruntime}_p += \Delta t \cdot \frac{1}{w_p}vruntimep +=Δtwp 1 , где wpw_pwp — вес, зависящий от приоритета.
- Плюсы: пропорциональная справедливость (процессы получают CPU долями пропорционально весам), низкие и предсказуемые задержки при правильной настройке целевой латентности, простая поддержка приоритетов через веса.
- Интерактивность: кратковременные I/O‑процессы получают «сонное» ускорение (они не увеличивают vruntime во время сна), поэтому быстро возвращаются в исполнение.
- Минусы: чуть сложнее реализовать, требует структуры (например, rb‑дерево) для поиска min vruntime.
Рекомендация и обоснование (кратко)
- Для большинства ОС — рекомендую CFS‑подобный подход с весами для приоритетов и ограничением максимального времени выполнения (granularity). Он даёт формальную пропорциональную справедливость и хорошую интерактивность. Формула обновления: Δvruntime=Δt⋅1wp\Delta\text{vruntime}=\Delta t\cdot\frac{1}{w_p}Δvruntime=Δtwp 1 .
- Если нужна очень простая реализация с акцентом на интерактивность — MLFQ с повышением при пробуждении и экспоненциальными квантами: quantumk=2kq0\text{quantum}_k=2^k q_0quantumk =2kq0 .
- Добавьте механизмы: приоритетное восстановление после I/O (boost), старение (aging) для предотвращения голодания, и предельную длину квантов (granularity) для ограничения латентности.
Короткая реализация-плана (CFS‑вариант)
1) Хранить процессы по vruntime\text{vruntime}vruntime (min‑heap или rb‑tree).
2) На выбор брать процесс с минимальным vruntime\text{vruntime}vruntime.
3) Запускать до прерывания или до квант‑границы Δt\Delta tΔt.
4) Обновлять vruntimep+=Δt/wp\text{vruntime}_p += \Delta t / w_pvruntimep +=Δt/wp .
5) При пробуждении/блокировке корректировать vruntime (не увеличивать во сне); делать периодическое boosting при необходимости.
Этого достаточно для устранения перечисленных проблем: поддержка приоритетов через wpw_pwp , лучшая интерактивность и формальная справедливость распределения CPU.
6 Ноя в 07:40
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир