Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОССиО_Лекции.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.4 Mб
Скачать

Многослойная структура ос

Многослойный подход является универсальным и эффективным способом декомпозиции (разделение на части) сложных систем. В соответствии с этим подходом система состоит из иерархии слоев. Каждый слов обслуживает вышележащий слой, выполняя для него некоторый набор функций, которые образуют межслойный интерфейс.

Межслойный интерфейс – это набор функций, которые предоставляются вышележащему слою.

Слои от центра (уровни):

  1. Средства аппаратной поддержки, которые прямо участвуют в организации вычислительных процессов. Здесь находятся средства поддержки привилегированного режима, прерываний, переключение контекстов, защита памяти и др.;

  2. Машинно-зависимые компоненты ОС. Здесь отражается специфика аппаратной платформы, что позволяет разрабатывать вышележащие слои на основе машинно-независимых модулей;

  3. Базовые механизмы ядра;

  4. Менеджер ресурсов;

  5. Интерфейс системных вызовов.

Слои ядра можно менять при условии, что межслойный интерфейс не изменился (при сохранении межслойного интерфейса).

Асинхронные и параллельные процессы

Процессы называются параллельными, если они существуют одновременно. Параллельные процессы могут работать независимо друг от друга или они могут быть асинхронными. Это значит, что им необходимо периодически синхронизироваться и взаимодействовать.

Управляющая конструкция:

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.

Реализован способ разрывания циклов активного ожидания. Для этого предусматривается периодическая кратковременная установка ложного значения флага каждым вошедшим в цикл процессам. Благодаря этому другой процесс получает возможность выйти из своего цикла ожидания при по-прежнему установленном собственном флаге. В этой версии гарантируются взаимоисключения, отсутствуют тупики, однако возникает другая потенциальная проблема – бесконечное откладывание, возникающее при параллельном выполнении процессов тандемом.