Студопедия

КАТЕГОРИИ:


Архитектура-(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)

While (true) do. If (SmbWRITE) or (Очередь(PermWRITE))

Begin

Begin

If Очередь(PermREAD)

Begin

Begin

Begin

If (SmbWRITE) or (Очередь(PermWRITE))

Begin

PermREAD,

Var

READERS: integer; {переменная указывает количество активных читателей, когда READERS = 0, ожидающий процесс-писатель получает возможность начать работу}

SmbWRITE: boolean; {somebody write - когда кто-то пишет эта

переменная имеет истинное значение}

PermWRITE: condition; {permission read/write - пока не появится истинное значение условия читать разрешается,PermREAD - процесс-читатель не может продолжить свое выполнение; пока не появится истинное значение условия писать разрешается, Permwrite - процесс-писатель не может продолжить свое выполнение}

Procedure Начало_Чтения;

then Wait(PermREAD); {ожидание сигнала - читать разрешается}

READERS: = READEARS+1;

Signal(PermREAD); {сигнал, оповещающий о возможности чтения}

end;

Procedure Конец_Чтения;

READERS:=READERS-1;

If READERS=0 then Signal(PermWRITE); {сигнал, оповещающий о

возможности записи}

end;

Procedure Начало_Записи;

if (READERS>0) or (SmbWRITE)

then Wait(PermWRITE); {ожидание сигнала - писать разрешается}

SmbWRITE:=true

end;

Procedure Конец­_Записи;

SmbWRITE:=false;

then Signal(PermREAD) {сигнал, оповещающий о возможности чтения}

else Signal(PermWRITE); {сигнал, оповещающий и возможности записи}

end;

READERS:=0;

SmbWRITE:=false

end;

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

Когда процесс завершает операцию чтения, он вызывает процедуру Конец_Чтения, которая уменьшает число читателей на 1 и, в конце концов количество процессов-читателей становится равным 0; в этот момент вырабатывается сигнал разрешающий запись, PermWRITE, и следующий процесс-писатель получает возможность продолжать работу.

Когда процессу-писателю нужно произвести запись, он вызывает процедуру Начало_Записи. Поскольку процесс-писатель должен иметь монопольный доступ к информации, то если в настоящий момент есть уже работающие процессы-читатели или какой-либо активизированный процесс-писатель, данному процессу-писателю придется ждать выдачи сигнала PermWRITE. Когда же писатель получает возможность продолжить работу, переменная SmbWRITE:=true.

Когда процесс-писатель заканчивает свою работу, он устанавливает SmbWRITE:=false, тем самым, открывая вход в монитор для других процессов.

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

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

 

 

Решение задачи “обедающие философы”

(для самостоятельной работы)

 

Одна из наиболее интересных задач, предложенных Дейкстрой9 - это задача об обедающих философах. Она иллюстрирует многие нюансы, присущие параллельному программированию.

Формулировка задачи заключается в следующем.

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

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

 

 

Procedure Типичный_философ;

<== предыдущая лекция | следующая лекция ==>
Решение задачи передачи данных одного процесса другому при помощи монитора (случай информационной базы) | Театр реализма и авангарда
Поделиться с друзьями:


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


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



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




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