КАТЕГОРИИ: Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |