Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Parbegin

Begin

Begin

Begin

Begin

Begin

Begin

Begin

End.

Parend

Процесс_Y

Parbegin

Begin

Begin

while (КЛЮЧ_X) do; {ожидание пока процесс X не выйдет из критического участка}

КЛЮЧ_Y:=true;

{Критический участок Y}

КЛЮЧ_Y:=false; {признак выхода процесса Y из критического участка}

{Оставшаяся часть процесса Y}

end;

end;

КЛЮЧ_X:=false;

КЛЮЧ_Y:=false;

Процесс_Х;

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

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

 

Рассмотреть этот вариант самостоятельно.

Если процесс Y заканчивает выполнение своего критического участка и устанавливает в переключателе КЛЮЧ_Y значение false,,тем самым допускает процесс Х к выполнению своего критического участка. Пусть процесс Y работает значительно быстрее процесса Х, настолько, что прежде чем процесс Х установит свой КЛЮЧ_Х в состояние true, свидетельствующее о входе этого процесса в критический участок, процесс Y уже выполнит оставшуюся часть процесса и, не обнаружив в переменной КЛЮЧ_Х значения true, также получает доступ к критическому участку. Таким образом предложенный алгоритм полностью не решает проблему критического участка.

Алгоритм Деккера (Dekker’s Algorithm)

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

 

var C1,C2,ОЧЕРЕДЬ:integer;

procedure Процесс_Х;

C1:=1;

while (C2=1) do

if ОЧЕРЕДЬ=2 then

C1:=0;

while (ОЧЕРЕДЬ=2) do;

C1:=1;

end;

end;

{Критический участок процесса Х}

C1:=0;

ОЧЕРЕДЬ:=2;

{Оставшаяся часть процесса Х}

end;

procedure Процесс_Y;

C2:=1;

while (C1=1) do

if ОЧЕРЕДЬ=1 then

C2:=0;

while (ОЧЕРЕДЬ=1) do;

C2:=1

end;

end;

{Критический участок процесса Y}

C2:=0;

ОЧЕРЕДЬ:=1;

{Оставшаяся часть процесса Y}

end;

C1:=0;

C2:=0;

ОЧЕРЕДЬ:=1;

Процесс_X;

<== предыдущая лекция | следующая лекция ==>
While (true) do | While (true) do. В этом решении С1=1, когда ПРОЦЕСС_Х хочет войти в свой критический участок
Поделиться с друзьями:


Дата добавления: 2014-01-03; Просмотров: 352; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.013 сек.