Самодел 1 (1114716), страница 25
Текст из файла (страница 25)
В системе определено 32 уровня приоритетов.
Два класса нитей:
Нити с переменными приоритетами (0-15]
Нити “реального” времени (16-31] – высокоприоритетные нити.
Критичны по времени выполнения.
Нити с переменными приоритетами
Изначально процессу присваивается базовый приоритет.
Базовый приоритет процесса может меняться ОС, следовательно, могут измениться базовые приоритеты составляющих его нитей.
Нить получает значение приоритета из диапазона базового приоритета.
Приоритет нити может отклоняться от своего базового приоритета, и это может быть не связано с изменением базового приоритета процесса ( см. диапазон значений динамического приоритета нитей).
Например, ОС повышает приоритет нити, если до конца не использован квант времени, и уменьшает в противном случае.
• Поддерживается группа очередей (для нитей с переменными приоритетами ) – по одной для каждого приоритета. Система просматривает очереди, начиная с самой приоритетной.
• На выполнение выбирается нить с наивысшим приоритетом. Ей выделяется квант времени. Если во время выполнения в очереди появляется нить с более высоким приоритетом, то текущая нить вытесняется. Вытесненная нить становится в очередь готовых впереди тех, что имеют тот же приоритет.
• Если нить исчерпала квант – ее приоритет понижается на единицу и она перемещается в соответствующую очередь
• Повышается значение приоритета – при выходе из состояния ожидания окончания ввода-вывода
Планирование свопинга в ОС Unix
При принятии нового процесса на обработку необходимо освободить ресурсы. Какой - то процесс скидывается в область своппинга.
Область свопинга - специально выделенное системой пространство внешней памяти
P_TIME – счетчик, находящийся в контексте процесса. Суммирует время нахождения процесса в состоянии мультипрограммной обработки или в области свопинга. При переходе из одного состояния в другое счетчик обнуляется. Для загрузки процесса в память из области свопинга выбирается процесс с максимальным значением P_TIME. Если для загрузки этого процесса нет свободного пространства оперативной памяти, то система ищет среди процессов в оперативной памяти процесс, ожидающий ввода/вывода (сравнительно медленных операций, процессы у которых приоритет выше значения P_ZERO) и имеющий максимальное значение P_TIME (т.е. тот, который находился в оперативной памяти дольше всех). Если такого процесса нет, то выбирается просто процесс с максимальным значением P_TIME.
Работа диспетчерского процесса.
Надо определить принципы, исходя из которых происходят откачка процесса на диск м запуск на выполнение.
- Поиск процесса для ввода в оперативную память. Иначе выбирается процесс с максимальным значением p_time (обозначим outage). Если (outage < 3), то процесс не загружается.
- Если места в ОП нет, диспетчерский процесс определяет кандидата на выгрузку, прежде всего среди процессов в системной фазе, ждущих завершения сравнительно медленных операций. (По определению их приоритет > PZERO)
Из них – занимающий наибольшее место. Если такого нет – с максимальным значением p_time (обозначим inage). При (inage < 2) процесс не выгружается.
При отказе загрузки (нет претендентов) / выгрузки (невозможен выбор) диспетчерский процесс переходит в состояние ожидания
Планирование обработки прерываний
Правильное планирование обработки прерываний – залог правильного планирования процессов.
ОС должна обеспечивать контроль над ходом выполнения системных процедур, вызываемых по прерываниям . Это необходимое условие для правильного планирования пользовательских процессов.
Рассмотрим пример, в котором обработчик прерываний принтера блокирует на длительное время обработку прерываний от таймера, в результате чего системное время на некоторое время «замирает», и один из процессов (2), критически важный для пользователя, не получат управление в запланированное время.
Упорядоченное планирование прерываний
Механизм прерываний поддерживает приоритезацию и маскирование прерываний.
Источники прерываний делятся на классы – каждому классу свой уровень приоритета запроса на прерывание.
Дисциплина обслуживания приоритетов
-относительная (выбор по наивысшему приоритету, но далее обработка не может быть отложена)
-абсолютная (происходит переход к обработке более приоритетного с откладыванием текущего)
В схеме с абсолютными приоритетами заложено маскирование, так как запрещаются запросы с равными или более низкими приоритетами.
В общем случае - возможность маскирования прерываний любого класса и любого приоритета на некоторое время.
Упорядочивание работы обработчиков прерываний – механизм приоритетных очередей.
Наличие в ОС программного модуля – диспетчера прерываний.
При возникновении прерывания – вызов диспетчера.
Он блокирует все прерывания на некоторое время, устанавливает причину прерывания, сравнивает назначенный данному источнику прерывания приоритет с текущим приоритетом. В случае если у нового запроса на прерывание приоритет выше чем у текущего, то выполнение текущего приостанавливается и он помещается в соответствующую очередь. Иначе в соответствующую очередь помещается поступивший обработчик.
Планирование обработки прерываний в Windows NT
Все источники прерываний делятся на несколько классов, и каждому уровню присваивается уровень запроса прерывания – Interrupt Request Level (IRQL). Этот уровень и представляет приоритет данного класса.
Поступление запроса на прерывание/исключение – вызов диспетчера прерываний, который:
-Запоминает информацию об источнике прерывания
-Анализирует его приоритет
Если приоритет <= IRQL прерванного, то отложить в очередь,
иначе текущий обработчик – в очередь, управление - новому
Особенности планирования ввода/ вывода
Одна из важных задач планирования – обеспечение занятости внешних устройств
Для этого можно присваивать процессам высокий приоритет в периоды, когда они интенсивно используют ввод/ вывод
Эти периоды легко прослеживаются: - процесс блокируется про обращении к вводу/выводу. - операции ввода/вывода обычно бывают сконцентрированы в отдельных частях программ.
Применяется стратегия HPF.
Взаимодействие процессов: синхронизация, тупики
Параллельные процессы
Процессы, выполнение которых хотя бы частично перекрывается по времени, называются параллельными процессами
В однопроцессорной системе имеет место так называемый псевдопараллелизм, т.е. параллельные процессы в действительности в каждый момент времени исполняется только один раз, однако несколько процессов находятся в состоянии выполнения, т.е. они выполняются по очереди и за счет быстрого переключения процессов между ними создается иллюзия параллелизма. Все такие процессы, которые все время находятся в буфере выполняемых процессов, будем называть параллельными. Действительный параллелизм может иметь место, когда на разных ЦП одновременно выполняются разные задачи. Для нас с точки зрения задач взаимодействия параллельных процессов и синхронизации их работы такие случаи ничем друг от друга не отличаются.
Они могут быть независимыми и взаимодействующими.
Независимые процессы – процессы, использующие независимое множество ресурсов и на результат работы такого процесса не влияет работа независимого от него процесса.
Взаимодействующие процессы совместно используют ресурсы, и выполнение одного может оказывать влияние на результат другого.
Совместное использование несколькими процессами ресурса ВС, когда каждый из процессов одновременно владеет ресурсом называют разделением ресурса.
Разделению подлежат как аппаратные, так программные ресурсы.
Разделяемые ресурсы, которые должны быть доступны в текущий момент времени только одному процессу – это так называемые критические ресурсы. Таковыми ресурсами могут быть, как внешнее устройство, так и некая переменная, значение которой может изменяться разными процессами.
Необходимо уметь решать две важнейшие задачи:
1. Распределение ресурсов между процессами.
2. Организация защиты адресного пространства и других ресурсов, выделенных определенному процессу, от неконтролируемого доступа со стороны других процессов.
Важнейшим требованием мультипрограммирования с точки зрения распределения ресурсов является следующее: результат выполнения процесса не должен зависеть от порядка переключения выполнения между процессами, т.е. от соотношения скорости выполнения процесса со скоростями выполнения других процессов.
Рассмотрим пример ситуации, в которой нарушается требование мультипрограммирования.
Посмотрим на рисунок и представить себе, что время идет сверху вниз. Оба процесса выполняют некоторую условную функцию if, в которой есть условный input (ввод некоторого символа) и условный output (вывод этой же переменной) понятно, что реализация этих функций нас сейчас не очень волнует, нас волнует в первую очередь то, что сейчас произойдет. Видно, что при такой ситуации у нас получается, что процесс А считал в разделяемую переменную in некоторый символ, после чего управление было передано на процесс В, и процесс В затер значение, которое считал процесс А. После чего он вывел новое значение, управление опять было передано процессу А, и процесс А вывел значение, не то которое он считал, а то, которое было затерто уже процессом В. Т.е. один из символов просто потерялся, в то время как другой был выведен дважды. Здесь предполагается, что in – это некоторая разделяемая переменная, т.е. некоторый разделяемый ресурс. В данном случае эта переменная и будет разделяемым физическим ресурсом
Такие ситуации называются гонками (race conditions) между процессами, а процессы – конкурирующими.
Часть программы (фактически набор операций), в которой осуществляется работа с критическим ресурсом, называется критической секцией, или критическим интервалом.
Единственный способ избежать гонок при использовании разделяемых ресурсов – контролировать доступ к любым разделяемым ресурсам в системе. При этом необходимо организовать взаимное исключение – т.е. такой способ работы с разделяемым ресурсом, при котором постулируется, что в тот момент, когда один из процессов работает с разделяемым ресурсом, все остальные процессы не могут иметь к нему доступ.
Заметим, что вопрос организации взаимного исключения актуален не только для взаимосвязанных процессов, совместно использующих определенные ресурсы для обмена информацией. Возможна ситуация, когда процессы, не подозревающие о существовании друг друга, используют глобальные ресурсы системы, такие как устройства ввода/вывода, принтеры и т.п. В с этом случае имеет место конкуренция за ресурсы, доступ к которым также должен быть организован по принципу взаимного исключения.
Проблемы организации взаимного исключения
•Тупики (deadlocks)
•Блокирование (дискриминация)
-
Блокирование – это ситуация, когда один из процессов никогда не получит доступа к ресурсу, т.е. будет ожидать вечно. Эта проблема присуща многим алгоритмам синхронизации, поскольку в любом случае если несколько процессов желают получить доступ к критическому ресурсу, то в каждый конкретный момент выбирается один из них, при этом естественно возможна ситуация, что один из этих процессов не будет выполнен никогда, т.е. этот алгоритм не является справедливым, всякий раз выбирается другой процесс, он получает доступ к ресурсу, а наш некоторый процесс будет ожидать вечно. Вот эта ситуация очень плохая, и хороший алгоритм организации взаимного исключения должен не допускать дискриминации среди процессов, т.е. быть справедливым.
Тупики (deadlocks)
При организации взаимного исключения могут возникнуть тупики (deadlocks), ситуации в которой конкурирующие за критический ресурс процессы вступают в клинч – безвозвратно блокируются.
Есть два процесса А и В, каждому из которых в некоторый момент требуется иметь доступ к двум ресурсам R1 и R2. Процесс А получил доступ к ресурсу R1, и следовательно, никакой другой процесс не может иметь к нему доступ, пока процесс А не закончит с ним работать. Одновременно процесс В завладел ресурсом R2. В этой ситуации каждый из процессов ожидает освобождения недостающего ресурса, но оба ресурса никогда не будут освобождены, и процессы никогда не смогут выполнить необходимые действия.
В тупике могут «участвовать» произвольное количество ресурсов.
Способы реализации взаимного исключения
• Запрещение прерываний и специальные инструкции
• Алгоритм Петерсона