
- •Операционные системы
- •Аппаратура и программное обеспечение
- •Управление процессами
- •Прерывания
- •Переключение контекста
- •Ядро ос
- •Многослойная структура ос
- •Асинхронные и параллельные процессы
- •Взаимоисключения
- •Аппаратная реализация взаимоисключения. Команда testandset(a,b)
- •Семафора
- •Пара производитель/потребитель
- •Кольцевой буфер
- •Мониторы
- •Концепция ресурсов
- •4 Основных условия для возникновения тупика
- •Основные направления исследования по управлению тупиков
- •Алгоритм банкира
- •Иерархия памяти
- •Стратегии управления памятью
- •Связное и не связное распределение памяти
- •Мультипрограммирование со свопингом
- •21 Декабря в 13:40 последний тест
- •Организация виртуальной памяти
- •Поблочное отображение
- •Рабочие множества
- •Размер страниц
Многослойная структура ос
Многослойный подход является универсальным и эффективным способом декомпозиции (разделение на части) сложных систем. В соответствии с этим подходом система состоит из иерархии слоев. Каждый слов обслуживает вышележащий слой, выполняя для него некоторый набор функций, которые образуют межслойный интерфейс.
Межслойный интерфейс – это набор функций, которые предоставляются вышележащему слою.
Слои от центра (уровни):
Средства аппаратной поддержки, которые прямо участвуют в организации вычислительных процессов. Здесь находятся средства поддержки привилегированного режима, прерываний, переключение контекстов, защита памяти и др.;
Машинно-зависимые компоненты ОС. Здесь отражается специфика аппаратной платформы, что позволяет разрабатывать вышележащие слои на основе машинно-независимых модулей;
Базовые механизмы ядра;
Менеджер ресурсов;
Интерфейс системных вызовов.
Слои ядра можно менять при условии, что межслойный интерфейс не изменился (при сохранении межслойного интерфейса).
Асинхронные и параллельные процессы
Процессы называются параллельными, если они существуют одновременно. Параллельные процессы могут работать независимо друг от друга или они могут быть асинхронными. Это значит, что им необходимо периодически синхронизироваться и взаимодействовать.
Управляющая конструкция:
Parbegin
On_1
On_2
On_n
Parend
Parbegin указывает на то, что последовательное течение программы должно быть разделено на несколько параллельно выполняемых последовательностей (цепочек управления).
Parend указывает на то, что определенные параллельно выполняемые последовательности должны слиться воедино и должно возобновиться последовательное выполнение программы. Внутри конструкции могут быть простые операторы, вызовы процедур, блоки последовательных операторов и комбинации этих элементов.
Каждая цепочка со временем завершается и приходит к конечному parend. Когда завершается последняя из всех параллельных цепочек, то они снова сливаются в единую цепочку управления и программа проходит точку parend.
Взаимоисключения
Взаимоисключения – запрет возможности одновременного обращения к разделяемым данным выполняющегося процесса другим процессом.
Взаимоисключения необходимы, когда процессы обращаются к разделяемым общим данным. Если же они выполняют операции, которые не приводят к конфликтным ситуациям, то они должны иметь возможность работать параллельно.
Когда процесс получает обращение к разделяемым данным, то говорят, что он находится на своем критическом участке. Когда процесс находится в своем критическом участке, он имеет исключительное право доступа к разделяемым данным, а всем остальным процессам приходится ждать. Поэтому процессы должны как можно быстрее проходить свои критические участки и не должны в этот период блокироваться. Конструкция входвзаимоисключение и выходвзаимоисключения обрамляют критические участки и называются примитивами взаимоисключения. Примитивами вызывают выполнение самых фундаментальных операций, обеспечивающих операцию взаимоисключения.
Критический участок – ограниченная примитивами, находящаяся в оперативной памяти, часть программного кода, в процессе выполнения которого происходит обращение к разделяемым данным.
Взаимоисключения реализуются как программно, так и аппаратно.
Программную реализацию механизма взаимоисключения впервые предложил голландский математик Деккер. У алгоритма Деккера было несколько версий.
Алгоритм Деккера. 1 версия.
Program версияОдин;
var номер процесса: целое;
procedure процессОдин
begin
while истина do
begin
while номерПроцесса=2 do - бесконечный цикл ожидания
критическийУчасток1;
номерПроцесса:=2;
…
end
end
procedure процессДва
begin
while истина do
begin
while номерПроцесса=1 do
parbegin
процесс_1;
процесс_2;
parend
end
end
Версия 1 гарантирует взаимоисключения, однако весьма дорогой ценой. ПроцессОдин должен выполняться первым, и если процессДва готов к входу в критический участок, он может получить разрешение на это со значительной задержкой. После того, как процессОдин войдет в свой критический участок, а затем выйдет из него, должен будет выполняться процессДва. Даже если процессОдин еще раз готов войти в критический участок, он будет ждать, пока процессДва не войдет в свой критический участок и не разрешит первому процессу войти. Если одному процессу приходится гораздо чаще, чем другому, входить в свой критический участок, то он вынужден работать с гораздо меньшей скоростью из-за жесткой синхронизации.
Program версияДва;
Var процесс1внутри, процесс2внутри: логический;
procedure процессОдин
begin
while истина do
begin
while процесс2внутри do
процесс1внутри:=истина
критический участок1;
процесс1внутри:=ложь;
…
end
end
procedure процессДва
begin
while истина do
begin
процесс1внутри:=ложь
процесс2внутри:=ложь снимается ограничение, что один из процессов должен входить первым
parbegin
процесс_1;
процесс_2;
parend
end
end
ВерсияДва не гарантирует взаимоисключения, потому что параллельные процессы могут выполняться одновременно и оказаться одновременно в своих критических участках.
Это версия программы может служить причиной тупика. Например, оба процесса могут заблокироваться в своем цикле ожидания while.
|
Реализован способ разрывания циклов активного ожидания. Для этого предусматривается периодическая кратковременная установка ложного значения флага каждым вошедшим в цикл процессам. Благодаря этому другой процесс получает возможность выйти из своего цикла ожидания при по-прежнему установленном собственном флаге. В этой версии гарантируются взаимоисключения, отсутствуют тупики, однако возникает другая потенциальная проблема – бесконечное откладывание, возникающее при параллельном выполнении процессов тандемом. |
|