Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мои шпоры ОСиСП(1).doc
Скачиваний:
32
Добавлен:
26.09.2019
Размер:
1.63 Mб
Скачать

2. Монитороподобные средства синхронизации для решения задачи взаимного исключения (17) – 160

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

Механизм типа «критическая область»

Как следует из названия, это механизм, ориентированный на решение задачи взаимного исключения. Для построения критической области используется две языковые конструкции. Одна из них VAR V: SHARED T; предназначена для описания критического ресурса, и её используют в начале текста программы в области описания типов переменных. Вторая описывает доступ к ресурсу в тексте программы REGION V DO S.

VAR R: SHARED T1; Q: SHARED T2;

Begin

Parbegin

процесс 1: . . . L1: REGION R DO S1; . . .

процесс 2: . . . L2: REGION Q DO S2; . . .

. . . . . . . . . . .

процесс i: . . . Li: REGION R DO S3; . . .

Parend;

End.

Процессы 1-ый и i-ый взаимно разделяют ресурс R и при выполнении программы будет выполняться только одна из областей. Описание переменной V: SHARED T означает, что определяется ресурс с именем V, как некоторая переменная, доступная параллельным процессам. Тип ресурса задаётся его описанием T. Для осуществления доступа к ресурсу V в тексте программы процесса требуется использовать конструкцию вида REGION V DO S. Такая конструкция описывает отдельную критическую область относительно критического

ресурса V и определяет действия S, которые будут осуществлены над ресурсом. Такие конструкции при исполнении исключают друг друга относительно критического ресурса.

Основные допущения при построении такого механизма синхронизации заключаются в том, что недопустима обработка переменной, описанной как «разделяемая» в каких-либо языковых конструкциях в программе, отличных от конструкций типа REGION. Попытка сделать это – заведомая ошибка в использовании критического ресурса – может быть выявлена на этапе компиляции программы.

TYPE T = ARRAY 1..100 OF INTEGER;

VAR M: SHARED T;

Begin

Parbegin

Процесс 1: L1: <действие процесса>

REGION M DO <обработка массива M>;

GOTO L1;

. . . . . . . . . . . . . . . . . .

Parend;

End.

Механизм типа «условная критическая область»

Данный механизм является модификацией механизма «критическая область». Но здесь вводится возможность производить работу с критическим ресурсом только тогда, когда он пребывает в определенном состоянии или выполнено условие, допускающее возможность работы с критическим ресурсом. Для проверки условия и состояния вводится специальный примитив AWAIT. Он может выполняться только в пределах языковой конструкции REGION. В качестве параметра этого примитива используется логическое выражение. Предполагается, что значения компонентов логического выражения могут изменяться другими параллельными процессами, но обязательно в области REGION. Если при выполнении AWAIT окажется, что логическое выражение истинно, то данный процесс временно покидает критическую область. Это даёт возможность одному из других параллельных процессов войти в критическую область и изменить параметры логического выражения. При повторном входе приостановленного процесса в критическую область логическое условие может стать ложным, и процесс получит возможность работать с критическим ресурсом.

Для организации временного выхода из критической области и повторного входа в неё по отношению к критическому ресурсу выстраиваются две очереди:

- в первую или главную очередь попадают те процессы, которые готовы войти в критическую область, и конкурируют за право получить доступ к ресурсу;

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

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

TYPE T = ARRAY 1..100 OF INTEGER;

VAR M: SHARED T; СЧИТЫВАНИЕ : BOOLEAN;

BEGIN

СЧИТЫВАНИЕ :=TRUE;

PARBEGIN процесс 1 :begin

m1: < действия процесса> //пр-сс-читатель

region m do begin

await(считывание);

<считать информацию из М>

считывание := true;

end;

goto m1;

end;

процесс 2 :begin

m2: <действия процесса> //пр-сс-писатель

region m do begin

<запись информации в М>

считывание := false;

end;

goto m2;

end;

parend;

end.

Такие действия могут быть реализованы компилятором путём применения двоичного семафора, единственного в отношении каждого критического ресурса. Процесс-читатель может выполнить действия только в том случае, если информация в массив записана. Особенностью данного средства синхронизации является сокрытие от пользователей механизма повторного входа в критические области. Этот механизм является механизмом активного ожидания, поэтому его использование целесообразно, когда обращение к критическим ресурсам происходит редко.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]