Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Раздел 5. Операционные системы, среды и оболочк...docx
Скачиваний:
41
Добавлен:
23.09.2019
Размер:
416.36 Кб
Скачать

12. Проблемы взаимодействующих процессов: "Обедающие философы", "Читатели и писатели", "Спящий брадобрей". Описание и решения задач.

Проблема разбивается на три пункта:

  • обмен информацией между процессами,

  • недопущение конфликтных ситуаций,

  • согласование действий процессов.

Последние две проблемы можно объединить в одну и назвать ее «Синхронизация

"Обедающие философы".

С уть задачи обедающие философы в следующем. Имеется круглый стол, за которым сидят пять философов (впрочем, их число принципиального значения не имеет – для другого числа философов решение будет аналогичным). Перед каждым из них лежит тарелка с едой, слева и справа от каждого – две китайские палочки. Философ может находиться в трех состояниях: проголодаться, думать и обедать. На голодный желудок философ думать не может. Но начать обедать он может, только если обе палочки слева и справа от него свободны. Требуется синхронизировать действия философов. В данном случае общим ресурсом являются палочки.

При решении задачи будем использовать массив семафоров chopstick, описывающий текущее состояние палочек: chopstick[i] закрыт, если палочка занята, открыт – если свободна:

semaphore chopstick [5] = { 1, 1, 1, 1, 1};

Алгоритм реализации действий философа i имеет вид:

do {

wait (chopstick [i]); /* взять левую палочку */

wait (chopstick [(I + 1) % 5]); /* взять правую палочку */

. . .

обедать

. . .

signal (chopstick [i]); /* освободить левую палочку */

signal (chopstick [(i+1) % 5]); /* освободить правую палочку */

. . .

думать

. . .

while (1);

Используется массив, в котором отслеживается, чем занимается философ: ест, размышляет или пытается взять вилки. Перейти в состояние приема пищи философ может, только если в этом состоянии не находится ни один из его соседей. Голодный философ может блокироваться, если нужная ему вилка занята.

"Читатели и писатели".

Базу данных разделяют два типа процессов — читатели и писатели Читатели выполняют транзакции, которые просматривают записи базы данных, а транзакции писателей и просматривают, и изменяют записи. Предполагает­ся, что вначале база данных находится в непротиворечивом состоянии (т.е. отношения между данными имеют .смысл). Каждая отдельная транзакция переводит базу данных из одного непротиворечивого состояния в другое. Для предотвращения взаимного влияния транзакций процесс-писатель должен иметь исключительный доступ к базе данных Если к базе данных не обращается ни один из процессов-писателей, то вы­полнять транзакции могут одновременно сколько угодно читателей. В одном из решений первый читатель для получения доступа к БД выполняет в отношении семафора db операцию down. А все следующие читатели просто увеличивают значение счетчика. Как только читатели прекращают свою работу, они уменьшают значение счетчика, а последний из них выполняет в отношении семафора операцию up, позволяя заблокированному писателю, если такой имеется, приступить к работе. Одновременная работа двух читателей разрешена. Писатель не может получить доступ к БД, ьак как писатели должны иметь исключительный доступ, поэтому писатель приостанавливает свою работу. До тех пор пока не останется ни одного читателя, то есть вполне возможно писатель вообще не получит доступ. Чтобы предотвратить такую ситуация, писатель должен дожидаться лишь окончания работы тех читателей, которые были активны при его прибытии.

"Спящий брадобрей".

В парикмахерской есть один брадобрей, его кресло и n стульев для посетителей. Если желающих воспользоваться его услугами нет, брадобрей сидит в своем кресле и спит. Если в парикмахерскую входит клиент, он должен разбудить брадобрея. Если клиент приходит и видит, что брадобрей занят, он либо садится на стул(если есть место), либо уходит(мет нет). Необходимо запрограммировать брадобрея и посетителей так, чтобы избежать состояния состязания. В решении можно использовать три семафора: customers, для подсчета посетителей(клиент в кресле брадобрея не считается); barbers - количество брадобреев, 0/1; mutex - для реализации взаимного исключения. Также используется переменная waiting, предназначенная для подсчета ожидающих посетителей. Она является копией переменной customers.(прочитать текущее значение семафора невозможно).

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

Когда брадобрей приходит на работу, он выполняет процедуру barber, блокируясь на семафоре customers, поскольку значение семафора равно 0. Затем брадобрей засыпает и спит, пока не придет новый клиент. Приходя в парикмахерскую, посетитель выполняет процедуру customer, запрашивая доступ к multex для входа в критическую область. Затем проверяет наличие свободных стульев, в случае неудачи, освобождает доступ к multex. Если свободный стул есть, посетитель увеличивает значение переменной waiting. Затем он выполняет процедуру up а семафоре customers , тем самым активируя поток брадобрея. В этот момент они оба активны. Когда посетитель освобождает доступ к multex, брадобрей захватывает его , проделывает некоторые служебные операции и начинает стричь клиента. По окончании стрижки посетитель выходит из процедуры и покидает парикмахерскую. В отличие от предыдущих программ, цикла посетителя нет, поскольку каждого посетителя стригут только одни раз. Цикл брадобрея существует, и брадобрей пытается найти следующего посетителя. Если ему это удается, он стрижет следующего посетителя, в противном случае засыпает.