Алгоритм SJF
Алгоритм SJF (Shortest Job First, «первым выполняется кратчайшая задача») — это дисциплина диспетчеризации процессов (планирования задач) в операционных системах, при которой центральный процессор (ЦП) выделяется процессу с наименьшим ожидаемым временем выполнения среди всех готовых к запуску процессов. Алгоритм относится к классу невытесняющих (non-preemptive) или вытесняющих (preemptive) алгоритмов планирования, в зависимости от реализации. Основная цель SJF — минимизация среднего времени ожидания и среднего времени оборота процессов, что теоретически делает его оптимальным с точки зрения этих критериев при условии полной априорной информации о длительности выполнения задач.
История и происхождение
Идея приоритетного выполнения коротких задач восходит к ранним работам по теории массового обслуживания и оптимизации вычислительных систем. В 1960-х годах, с развитием пакетных операционных систем, возникла необходимость в эффективных алгоритмах планирования, способных сократить время простоя процессора. Алгоритм SJF был формализован и описан в рамках исследований по операционным системам, в частности, в работах таких учёных, как Л. Клейнрок и А. Таненбаум. В классических учебниках по операционным системам (например, «Операционные системы: проектирование и реализация» Таненбаума) SJF рассматривается как теоретическая модель, демонстрирующая преимущества учёта длительности задач.
В 1970-х годах алгоритм получил развитие в виде вытесняющей версии — SRTF (Shortest Remaining Time First), где процессор перераспределяется в пользу процесса с наименьшим оставшимся временем выполнения, даже если он был прерван. Однако практическое применение SJF в реальных операционных системах ограничено из-за фундаментальной проблемы: точная оценка времени выполнения задачи заранее невозможна.
Классификация и виды
Алгоритм SJF существует в двух основных модификациях, различающихся поведением при поступлении новых процессов:
Невытесняющий SJF (Non-preemptive SJF)
В этой версии процесс, получивший ЦП, выполняется до своего завершения (или до блокировки по вводу-выводу). Если во время выполнения процесса поступает новый процесс с меньшим временем выполнения, он не прерывает текущий, а ожидает в очереди готовых. Планировщик выбирает следующий процесс только после завершения текущего. Невытесняющий SJF прост в реализации, но может приводить к неоптимальному среднему времени ожидания при неравномерном поступлении задач.
Вытесняющий SJF (SRTF — Shortest Remaining Time First)
В этой версии при поступлении нового процесса с временем выполнения, меньшим, чем оставшееся время текущего процесса, планировщик прерывает текущий процесс и помещает его обратно в очередь готовых. ЦП передаётся новому, более короткому процессу. SRTF обеспечивает минимальное среднее время ожидания среди всех алгоритмов планирования при известных длительностях, но требует частых переключений контекста и точного знания оставшегося времени.
Устройство и принцип работы
Алгоритм SJF предполагает, что для каждого процесса известно его время выполнения (burst time) — время, которое процесс будет непрерывно использовать ЦП без блокировок. Планировщик поддерживает очередь готовых процессов, отсортированную по возрастанию этого времени. При каждом событии (завершение процесса, поступление нового) планировщик выбирает процесс с минимальным burst time.
Пример работы невытесняющего SJF: Пусть в момент времени 0 поступили процессы:
- P1: burst time = 6
- P2: burst time = 8
- P3: burst time = 7
- P4: burst time = 3
Планировщик выбирает P4 (3), затем после его завершения в момент 3 — P1 (6), затем P3 (7), затем P2 (8). Среднее время ожидания: (0 + (3-0) + (9-0) + (16-0)) / 4 = (0+3+9+16)/4 = 7. Среднее время оборота: (3+9+16+24)/4 = 13.
Пример работы вытесняющего SRTF: Пусть процессы поступают в разные моменты:
- P1: arrival time = 0, burst = 8
- P2: arrival time = 1, burst = 4
- P3: arrival time = 2, burst = 9
- P4: arrival time = 3, burst = 5
В момент 0 запускается P1. В момент 1 поступает P2 (burst=4 < оставшееся время P1=7), P1 прерывается, запускается P2. В момент 5 P2 завершается, оставшееся время P1=7, P3=9, P4=5 — выбирается P4 (5). В момент 10 P4 завершается, выбирается P1 (7). В момент 17 P1 завершается, запускается P3 (9). Среднее время ожидания: ( (10-1) + (1-1) + (17-2) + (5-3) ) / 4 = (9+0+15+2)/4 = 6.5.
Характеристики и свойства
- Оптимальность по среднему времени ожидания: при условии точного знания burst time, SJF (и особенно SRTF) минимизирует среднее время ожидания среди всех невытесняющих и вытесняющих алгоритмов соответственно. Это доказано в теории планирования.
- Минимизация среднего времени оборота: алгоритм сокращает общее время выполнения набора задач, что выгодно в пакетных системах.
- Проблема «голодания» (starvation): при непрерывном поступлении коротких задач длинные процессы могут бесконечно долго не получать ЦП. В вытесняющей версии эта проблема усугубляется.
- Зависимость от априорной информации: для работы алгоритма необходимо знать или оценивать время выполнения каждого процесса. В реальных системах это невозможно, поэтому применяются методы прогнозирования (например, экспоненциальное сглаживание на основе истории выполнения).
- Высокие накладные расходы: в вытесняющей версии частые переключения контекста снижают эффективность использования ЦП.
Применение и значение
В операционных системах
В чистом виде SJF редко применяется в универсальных операционных системах (Windows, Linux, macOS) из-за невозможности точного прогнозирования burst time. Однако его идеи используются в гибридных алгоритмах. Например, в планировщике Linux (Completely Fair Scheduler, CFS) применяется концепция виртуального времени, которая эквивалентна SJF в долгосрочной перспективе. В системах реального времени (RTOS) SJF может применяться для задач с известными временными характеристиками.
В пакетных системах
В исторических пакетных системах (например, IBM OS/360) SJF использовался как основа для планирования заданий, где время выполнения оценивалось пользователем или администратором.
В планировании ресурсов
Принцип «сначала короткие задачи» применяется не только в операционных системах, но и в других областях: планирование заказов в производстве, управление очередями в сетях передачи данных, распределение вычислительных ресурсов в облачных средах.
Критика и ограничения
- Невозможность точного прогноза: burst time процесса зависит от множества факторов (ввод-вывод, пользовательский ввод, сложность вычислений) и не может быть известен заранее. Оценки на основе истории неточны, особенно для интерактивных процессов.
- Голодание длинных процессов: в системах с интенсивным потоком коротких задач (например, веб-серверы) длительные вычисления могут никогда не получить ЦП, что приводит к деградации производительности.
- Неприменимость для интерактивных систем: пользовательские процессы (редакторы, браузеры) требуют быстрого отклика, а не минимизации среднего времени ожидания. SJF может привести к неприемлемым задержкам для коротких, но частых взаимодействий.
- Сложность реализации вытесняющей версии: SRTF требует постоянного пересчёта оставшегося времени и приоритетов, что увеличивает накладные расходы планировщика.
Интересные факты
- SJF является частным случаем алгоритма HRRN (Highest Response Ratio Next), который учитывает не только время выполнения, но и время ожидания, чтобы избежать голодания.
- В некоторых учебниках SJF называют SPN (Shortest Process Next) для невытесняющей версии.
- Алгоритм SJF лежит в основе теории оптимального планирования для однопроцессорных систем с известными длительностями — он доказуемо минимизирует среднее время оборота.
Источники
- Таненбаум Э. С., Бос Х. Современные операционные системы. — 4-е изд. — СПб.: Питер, 2015.
- Сильбершатц А., Гэлвин П., Гэгн Г. Операционные системы: внутреннее устройство и проектирование. — 9-е изд. — М.: Вильямс, 2019.
- Клейнрок Л. Теория массового обслуживания. — М.: Машиностроение, 1979.
- Stallings W. Operating Systems: Internals and Design Principles. — 9th ed. — Pearson, 2017.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →