Планировщик операционной системы
Простая модель планировщика ОС
Не так давно пытался найти здесь какую-нибудь информацию о планировщике Windows и к своему удивлению не нашёл ничего конкретного о планировщиках вообще, поэтому решил запостить вот этот пример планировщика, надеюсь кому-то он окажется полезен. Код написан на Turbo Pascal со вставками ассемблера 8086.
Что собственно планирует планировщик?
Планировщик — часть операционной системы, которая отвечает за (псевдо)параллельное выполнения задач, потоков, процессов. Планировщик выделяет потокам процессорное время, память, стек и прочие ресурсы. Планировщик может принудительно забирать управление у потока (например по таймеру или при появлении потока с большим приоритетом), либо просто ожидать пока поток сам явно(вызовом некой системной процедуры) или неявно(по завершении) отдаст управление планировщику. Первый вариант работы планировщика называется реальным или вытесняющим(preemptive), второй, соответственно, не вытесняющим (non-preemptive).Алгоритмы планирования
Существует несколько алгоритмов как вытесняющего, так и невытесняющего планировщика. Для начала давайте разберёмся какой механизм лучше? На первый взгляд очевидным кажется, что вытесняющая многозадачность всегда лучше невытесняющей. Но это не совсем так. Невытесняющая многозадачность даёт большую фору вытесняющей там, где необходимо, чтобы процессор постоянно был занят именно решением задач, а не их переключением, подготовкой, ожиданием. Пример — системы пакетной обработки данных. А во современные пользовательские ОС трудно представить без вытесняющей многозадачности (хотя до выхода Windows NT, все вполне обходились без неё). Итак рассмотрим основные алгоритмы невытесняющей планировки:- FIFO
- Самые короткие — вперёд!
- Самые выполнившиеся вперёд!
- Циклическая
- С приоритетом по времени
- С приоритетом по назначению
Критические секции
C процессорным временем или стеком вроде бы всё просто, а что если потоку требуется например напечатать на принтере котёнка? А что если таких потоков два? При невытесняющей многозадачности всё пройдёт как по маслу: один поток отпечатает котёнка, завершится и отдаст управление планировщику, который позволит печатать второму потоку. Но если многозадачность вытесняющая, планировщик может переключить потоки в момент, когда те ещё не завершили печать и получится что-то вроде этого:
Взаимная блокировка
Допустим у нас есть неразделяемые ресурсы А и Б и потоки Х, Y, которые хотят задействовать эти ресурсы. Если некий криворукий недостаточно компетентный программист расставит критические скобки вот так: … Поток X Занять Ресурс(А) Занять Ресурс(Б) … Отдать Ресурс(А) Отдать Ресурс(Б) Поток Y Занять Ресурс(Б) Занять Ресурс(А) … Отдать Ресурс(Б) Отдать Ресурс(А) через некоторое время возникнет вот такая ситуация:
Сладенькое
Ну и собственно то ради чего это всё писалось. Как уже было сказано код нашего планировщика будет выполнен на языке Turbo Pascal. Механизм критических секций реализован в процедурах EnterCritical(), LeaveCritical(). Вспомним ещё раз: чтобы войти в критическую секцию — нужно проверить не занята ли она, и по результату — либо занять её и разрешить потоку ей пользоваться, либо поставить поток в очередь и передать управление кому-то другому.procedure EnterCritical(num:TCriticalNum); {Войти в критическую секцию} begin asm cli end; if num0 do begin {Пока КС занята кем-то} {отдать управление другому процессу и ждать освобождения КС} asm sti end; SwitchThreads; asm cli end; end; dec(criticalTableWait[num]); end; criticalTable[num]:=1; end; asm sti end; end; C LeaveCritical() вроде бы и так всё ясно:procedure LeaveCritical(num:TCriticalNum); {Покинуть критическую секцию} begin asm cli end; if num0 then {Если кто-то ждет КС} switchThreads; end; Сама процедура переключения потоков написана с использованием ассемблерных вставок, поэтому можно увидеть момент переключения потоков от одного к другому с точностью до машинной команды:procedure TimerHandler(flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp:word); interrupt; {Следующие типизированные константы являются на самом деле статическими локальными переменными, которые размещаются в сегменте данных и сохраняют свои значения между вызовами процедуры} const ThreadNumber:byte=0; const NumPrev:byte=0; const tsoffset:word=0; mainSP:word=0; mainSS:word=0; begin if not DisableHardwareEvents then begin asm pushf end; oldvec8; {Вызван старый обработчик прерывания от таймера. Он сбросил контроллер прерываний.} end; if preemptiveSwitch or DisableHardwareEvents then if (ThreadsRegistered> 1) or (parallelStart) then begin {Зарегистрировано более одной задачи} asm cli end; if ParallelStart then begin {Если идет запуск процесса параллельных вычислений} StepCount:=0; asm mov ParallelFinished,false {Сброс флага завершения} mov mainsp,bp {Стек главного потока для возврата по окончании} mov mainss,ss {исполнения параллельных потоков} end; end; inc(StepCount); if {ts[ThreadNumber].active and} not ParallelStart then begin {Сохранение состояния текущего (прерванного) потока. Не производится при взведенном флаге ParallelStart, т.к. предполагается, что в этом случае была прервана основная программа} {Смещение текущнго потока в таблице зарегистрированных потоков} tsoffset:=ThreadNumber*sizeof(TThreadStateWord); asm push ds {нет гарантий, что при прерывании DS указывает на сегмент данных программы!} mov ax,seg ts mov es,ax mov di,offset ts add di,tsoffset mov ax,ss mov ds,ax mov si,bp {ds:si указывает на регистры, сохраненные в стеке} cld mov cx,12 rep movsw {сохранение состояния прерванного потока (кроме стека)} pop ds {es:di продвинулось на 24 байта вперед и указывает на место для сохранения состояния стека} mov ax,bp {BP содержит состояние стека после 12 сохранений регистров} add ax,12*2 stosw {SP задачи} mov ax,ss stosw {SS задачи} end; end; {Поиск следующей активной задачи} NumPrev:=ThreadNumber; repeat ThreadNumber:=(ThreadNumber+1) mod ThreadsRegistered; until (ThreadNumber=NumPrev) or TS[ThreadNumber].active; if ts[ThreadNumber].active and ((ThreadNumberNumPrev) or parallelStart) then begin {Восстановление новой задачи, если она отлична от прежней. Производится при взведенном флаге ParallelStart, даже если задача совпадает с якобы прежней, т.к. может оказаться, что единственной активной задачей в очереди является задача номер 0} tsOffset:=(ThreadNumber+1)*sizeof(TThreadStateWord) - 3; asm mov dx,ds mov ax,seg TS mov ds,ax mov si,offset TS add si,tsOffset {ds:si указывает на состояние активизируемого потока} std lodsw mov ss,ax lodsw mov sp,ax mov bp,ax {Переключение на стек нового потока} sub bp,12*2 {Подмена регистров в стеке на сосотояние нового потока. После возврата из процедуры будет исполняться код с той точки, где он был прерван при деактивации активизируемого сейчас потока} mov cx,12 @m1: lodsw push ax loop @m1 cld mov ds,dx end; end else if (not ts[Threadnumber].active) and (Threadnumber=NumPrev) then begin {Все задачи завершены} setintvec($8,@oldvec8); asm mov parallelfinished,true mov ax,mainss mov ss,ax mov bp,mainsp mov sp,bp end; end; parallelstart:=false; end; DisableHardwareEvents:=false; end; Сама процедура скомпилирована с директивой interrupt, то есть является обработчиком прерывания. Которое может быть спровоцировано как аппаратно, так и программно вызовом int 08h, вот так:procedure SwitchThreads; begin if not parallelFinished then asm cli mov DisableHardwareEvents,1 int 08h sti end; end; Так же необходимо описать сами процедуры регистрации, включения и остановки потоков. Если кому-то интересно — можно посмотреть в исходниках процедуры RegistrThread, RunThread, StopThread. Вот и всё! Наш планировщик готов.Исходники вместе примером многопоточной программы написаной под этот планировщих и досовским турбиком можно скачать здесь. Можно поиграться и посмотреть как по разному будут выполняться потоки при вытесняющей и невытесняющей многозадачности (процедура ExecuteRegisterThreads(true/false)), смоделировать ситуацию взаимной блокировки и убедиться в том, что она не всегда диагностируема (я однажды минуту ждал пока возникнет дедлок).
Запускать в системах новее Win98 советую из под DOSbox. Теги:- OS
- ОС
- планировщик
- низкий уровень
habr.com
Планировщик. Планирование. Алгоритмы планирования в операционной системе - презентация онлайн
ppt-online.org
Планирование процессов
Уже был затронут вопрос об очереди готовых процессов. Решение о том, кому дать следующий квант времени процессора определяет планирование.
Планирование процессов в ОС это процесс выбора – кто будет исполняться следующим и как долго это будет исполняться.
Не путать с переключением контекста, что является просто механизмом передачи управления.
Переключения контекста это не есть операция планирования, это техническая операция.
- Происходит прерывание;
- Поток вызывает исключение или ловушку (trap);
- После этого выбирается другой поток.
Т.е. в процессе переключения контекста нужно четко выбрать, кому передать управление.
Классы планировщиков
- Пакетный – ориентирован на длительные задачи, которые требуют больших вычислительных ресурсов, где не требуется частое прерывание. Т.е. подразумевают обработку больших задач большими пакетами, нет ограничения на время выполнения.
- Интерактивный – ориентирован на снижение времени отклика, т.е. чтобы система казалась”отзывчивой”. Обычные абонентские системы на ПК – это интерактивные системы, когда в ответ на действие пользователя (например перемещение мыши) ОС что-то делает. И всегда пользователю хочется, чтобы этот ответ происходил как можно быстрее. Главное чтобы на поступающий в систему запрос был получен максимально быстро ответ. Запрос – это любое взаимодействие с компьютером.
- Реального времени – специализированные класс, ориентированный на дедлайн – предельный срок завершения какой-либо работы.Главное, чтобы определенное действие завершалось к определенному сроку, это понятие называется дедлайн.Поступающий запрос должен быть обработан не более, чем в определенный промежуток времени.Классический пример СРВ – управление ядерным реактором, в котором превышение времени отклика приведет к аварийной ситуации.
Уровни планирования
- Долговременное(догосрочное) – решает какие новые задачи будут добавлены (концептуальные вопросы).
- Среднесрочное – решает нужно ли временно выгружать программу во вторичную память (какую и вообще нужно ли это).
- Краткосрочный – решает, какому потоку дать следующий квант процессорного времени и какой длины. Координирует выполняющиеся потоки на разных ЦП.
Основной задачей планирования процессов в ОС является обеспечение высокой производительности ОС.
Существуют разные метрики, которыми оценивается эта производительность. Эти метрики зачастую противоречивы.
Что концептуально требуется при проектировании планировщика ОС:
- Максимизировать использование ЦП (чтобы он максимально работал на задачах)
- Максимизировать пропускную способность(число выполненных запросов в единицу времени)
- Минимизировать среднее время отклика (среднее время от подачи запроса до завершения обработки ответа)
- Минимизировать среднее время ожидания (среднее время от подачи запроса до начала его выполнения)
- Минимизировать энергии (джоулей на инструкцию)
Метрики планирования
На следующем рисунке рассмотрим пример метрики планирования.

Метрики планирования
ta— время поступления процесса (когда процесс становится готовым к выполнению);
Tw – время ожидания (которое тратит процесс в очереди на выполнение);
Ts – время выполнения ЦП;
Tr – время оборота (общее время на ожидание и выполнение).
На схеме 5 и 6 процессы поступили в очередь готовых процессов.
5 задержался из-за 1-4 процесов. Для пятого процесса Tw – время ожидания Ts – время выполнения ЦП.
Время оборота это время от момента его поступления до момента, когда завершилось его выполнение Tr=Tw+Ts.
При планировании процессов главным остается вопрос: Как выбрать какой процесс будет работать дольше и дальше?
Существуют следующие алгоритмы планирования процессов:
- FIFO— классика – первым пришел, первым ушел
- Кратчайшая работа следующей, т.е. следующей выбирается работа, которая требует наименьшего времени завершения
- Round-robin
- Многоуровневая очередь
- Многоуровневая очередь с обратной связью
Рассмотрим названные алгоритмы планирования процессов.
FIFO
В данном случае мы будем его понимать как невытесняющую многозадачность
- Процессы планируются по мере их поступления;
- Время выполнения не учитывается (никак совсем);
- Другие процесс с меньшим временем Tr вынуждены ждать (снижается отзывчивость системы);
- Когда процесс переходит в состояние готовности он перемещается в конец очереди.
Пример FIFO
Допустим есть три процесса, которые пребывают в одно и тоже время t=0 в порядке P1,P2,P3.
У каждого из процессов существует время, которое ему нужно для выполнения части задачи. Эту часть задачи, которую ему необходимо выполнить назовем английским словом Burst. У трех процессов она разная.
- Burst(Р1)=24 (усл.ед.времени)
- Burst(Р2)=3
- Burst(Р3)=3
Тогда Время ожидания
- Wait(P1)=0
- Wait(P2)=24
- Wait(P3)=27
Среднее время ожидания = 17
Если эти три поступившие процесса запланировать по другому, можно сильно снизить время отклика системы.
Допустим процессы поступают в порядке Р2,Р3,Р1
Тогда время ожидания
Среднее время ожидания =3
Оно резко снизилось за счет того, что мы изменили порядок работы процессов, поступивших в одно и тоже время.
За данным простым примером скрыта вся мощь и важность алгоритмов планирования процессов в ОС.
Обобщения по FIFO:
- Он больше других подходит для длительных, требовательных к времени ЦП процессов;
- Плохое использование ЦП и устройств ввода/вывода;
- Среднее время ожидание сильно варьируется.
Кратчайшая работа следующей
Условимся, имеется в виду невытесняющая политика планирования – сколько квант времени запрашивает процесс, столько ему и выделяется.
Суть процесса — следующим запланировать тот процесс, который требует наименьшего времени для своего выполнения, т.е. процесс имеющий самое короткое время обработки.
Сложности:
Нужно оценивать требуемое время обработки для каждого процесса.
- Для пакетных заданий на основе предыдущего опыта или вручную (нет гарантии, что повторится)
- Для интерактивных заданий на основе затраченного времени
Как только мы получаем метрику процессов, то короткий процесс помещается в начало очереди.
Кратчайшая работа следующей вытесняющий вариант
Существует вытесняющий вариант метода кратчайшей работы следующего.
Сортировка осуществляется по времени, которое нужно процессу для завершения своей части задачи. Если он вытесняется в процессе выполнения, то время, которое у него осталось называется остаточным.
По остаточному времени осуществляется сортировка и принимается решение, какой процесс будет выполняться следующим.
Соответственно те процессы, которые выполняются на ЦП вытесняются тем процессом, который близкий к завершению, чтобы отработать его и распрощаться с ним.
А те процессы, которым еще долго работать, оставить на потом и заняться ими “в плотную”. Логика в этом есть.
Обобщение по «Кратчайшая работа следующей»:
- Процессы, уже выполняющиеся на ЦП вытесняются самым близким к завершению заданием;
- Меньше общее время оборота процесса;
- Меньше время ожидания ЦП.
Планирование с приоритетами
Тот же алгоритм кратчайшей работы следующей можно представить, как планирование с приоритетом, где приоритет – наименьшее время работы.
Суть: каждому процессу сопоставляется некоторое число, которое характеризует, определяет приоритет этого процесса. Чем меньше это число, тем выше приоритет.
Проблема старвации – это проблема “зависания”,“голодания” – если процессу с высоким приоритетом приспичит выполнить очень длительную работу, то все остальные процессы будут “висеть” и ждать.
Время ЦП выделяется процессу с наивысшим приоритетом (вытесняющим или невытесняющим). Процесс с низким приоритетом может вообще никогда не выполниться, до него не дойдет очередь.
Старвация – ее можно представить как всех стоящих в очереди и кто привилегированный лезет вне очереди.
Проявляется в алгоритме КРС. Низкоприоритетные запросы могут никогда не выполниться.
Решение проблемы:
Ввести понятие «старения»: по мере течения времени увеличивать приоритет процесса.
Приоритет = Оценочное время выполнение на ЦП – время ожидания
Приоритеты – это инструмент с помощью которого необходимо сделать общий процесс планирования эффективным.
Round-robin
Данный алгоритм планирования обозначает циклический алгоритм с вытесняющим планированием.
- Каждый процесс получает фиксированный квант процессорного времени (фиксированную единицу процессорного времени).
- После истечения кванта времени процесс принудительно вытесняется и помещается в очередь готовых к выполнению.
- Процесс всегда планируются в том же порядке и каждый процесс получает одинаковый квант времени
- Не сложно подсчитать: если квант времени равен q и n-процессов в очереди, то каждый получит 1/n времени ЦП, кусками максимум по q
- Никакой из процессов не ожидает больше, чем (n-1)*q единиц времени
Производительность Round-robin(RR)
- Если q большое(стремиться к ∞), то RR перерождается в алгоритм FIFO;
- Если q малое (но не стремится к 0, иначе ПК будет только переключать процессы и больше не выполнять вообще ничего), то все хорошо;
- Нет старвации;
- Появляется высокая отзывчивость системы;
- Равное распределение времени;
- Если q меньше, чем время, затрачиваемое на переключение контекста, тогда диспетчер будет неэффективным.
Недостаток Round-robin
Процессы с интенсивным вв/выв(т.е.заблокированные в ожидании вв/выв) полностью не используют свой квант времени, поэтому процессы с интенсивным использованием ЦП получают преимущество.

Недостаток Round-robin
Есть 2 процесса Р1 и Р2
Процесс Р1 ожидает ввод/вывод в точке (●), пока этот вв/выв не завершится часть отмеченного штриховкой времени процесс Р1 потратит «впустую», он вытиснится только в зеленой точке по истечении кванта времени.
Р2 в это время активно использует ЦП, например, считает.
Проблема RR в том, что не учитываются задержки, и полезное время работы Р1 составляет только 10%.
Многоуровневые очереди
Выделяется несколько разных очередей, например:
- Очередь интерактивных процессов, т.е. тех, которые требуют малого времени отклика;
- Очередь фоновых процессов, требующих много выч.ресурсов, но для которых не важно быстрое время отклика(пакетная обработка), нужно много повычислять.
У каждой очереди сопоставляется свой алгоритм планирования, таким образом имеем некий «баланс сил»:
- у интерактивных процессов RR;
- у фоновых — FIFO.
Но в случае многоуровневых очередей нужно планирование не просто внутри каждой очереди, но и планирование между очередями. Получается «накрученный» планировщик, можно предложить много вариантов:
1) Планирование с фиксированным приоритетом
- Вначале обслужить все интерактивные процессы, потом все фоновые
- Возможна старвация
2) Разделение времени
Каждой очереди выделяется часть времени ЦП, которую она может распланировать между своими процессами. Например 80% времени ЦП на интерактивные процессы через RR, 20% на фоновые через FIFO.
3) Многоуровневая очередь с обратной связью
Многоуровневая очередь с обратной связью
Планирование на основе затраченного времени, если процесс затратил определенный квант времени, то он помещается в определенную очередь – динамически перепланируются очереди.

Многоуровневая очередь с обратной связью
Если он выполнился достаточно быстро, то он попадает в первую очередь «быстрых» процессов.
Если он средний по времени выполнения, то в среднюю.
Если он требует много времени вычислительных ресурсов, то он помещается в последнюю очередь FIFO.
За счет этого процессы постоянно перемещаются между очередями, таким образом заранее не нужно смотреть, куда помещать процесс и сопоставлять ему какое-то свойство.
Планировщик определяется с многими параметрами:
- Числом очередей;
- Алгоритмами планирования в каждой очереди;
- Методом, используемым для определения принадлежности процесса к той или иной очереди.
Пример многоуровневой очереди с обратной связью
Есть три очереди:
- Q0 –RR с квантом времени t=16мс
- Q1 –RR с квантом времени t=32мс
- Q2 –FIFO
Планирование:
Новый процесс помещается в конец первой очереди Q0
- Когда процесс из этой очереди получает ЦП, то выделяется квант времени t=16мс
- Если процесс выполняется дольше, не вернул управление ОС, то он принудительно вытесняется и помещается в конец очереди Q1
В очереди Q1
- Когда процесс из этой очереди получает ЦП, то выделяется квант времени t=32мс
- Если процесс выполняется дольше, то он принудительно вытесняется и помещается в конец очереди Q2 и выполняется по FIFO пока не закончится
Скачать презентацию по теме «Планирование процессов»
Скачать тест по теме «Планирование процессов»
Понравилась статья, рекомендуйте Вашим друзьям!
Давайте дружить!
komputercnulja.ru
61.Что такое планировщик, какие функции выполняет долговременный планировщик и т.д
Что такое планировщик? Какие функции выполняет долговременный планировщик? Какие функции выполняет кратковременный планировщик? Какие функции выполняет планировщик откачки и подкачки? Какой из планировщиков определяет степень мультипрограммирования ОС?
В операционной системе диспетчеризация процессов выполняется обычно несколькими планировщиками, каждый из которых имеет свою периодичность вызовов и свою определенную задачу, которую он решает.
Долговременный планировщик (планировщик заданий) определяет, какие процессы должны быть перемещены в очередь готовых процессов.
Долговременный планировщик вызывается относительно редко, так как система не столь часто принимает решения о переводе процесса в очередь готовых процессов. Поэтому он может быть сравнительно медленным, не столь эффективно реализованным.
Кратковременный планировщик (планировщик процессора) – определяет, какие процессы должны быть выполнены следующими и каким процессам должен быть предоставлен процессор.
Кратковременный планировщик вызывается очень часто, по крайней мере, не реже, чем по истечении очередного кванта времени процессора. Поэтому он должен быть очень быстрым, максимально эффективно реализованным. Понятно, что недопустимо, например, если время работы этого планировщика окажется сравнимым с размером самого кванта времени – слишком велики будут накладные расходы.
Для реализации режима разделения времени в систему может быть добавлен также планировщик откачки и подкачки процессов, определяющий, какие пользовательские процессы должны быть подкачаны в память или откачаны на диск.
Схема работы системы, включающей такой планировщик
Долговременный планировщик определяет степень (коэффициент) мультипрограммирования – число процессов, которое обслуживает система в единицу времени.
studfiles.net