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

34)Опишите пример использования семафоров при работе с буферным пулом записи/чтения.

Рассмотрим использование семафоров на примере взаимодействия потоков, выполняющихся в многозадачном режиме. Одни потоки записывают данные в буферный пул, а другие считывают их из буферного пула. (Буферный пул – набор регистров, в которые записывается информация для временного хранения. Регистры освобождаются и занимаются потоками.) Пусть буферный пул состоит из N буферов, каждый из которых может содержать одну запись. Потоки-писатели должны приостанавливаться, когда все буферы оказываются занятыми, и активизироваться при освобождении хотя бы одного буфера. Напротив, потоки-читатели должны приостанавливаться, когда все буферы пусты, и активизироваться при появлении хотя бы одной записи. Операции записи в буфер и считывания из буфера являются критическими секциями потоков-читателей и потоков-писателей.

Для решения задачи введем три семафора:

e – число пустых буферов;

f – число заполненных буферов;

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

V- освобождение ресурса Р-занятие ресурса.

Использование семафоров для синхронизации потоков Здесь операции Р и V имеют следующее содержание: Р(е) – если есть свободные буферы, то уменьшить их количество на 1, если нет, то перейти в состояние «ожидание»; P(b) – если критическая секция доступна, то установить признак «занято» (b=0), если нет, то перейти в состояние «ожидание»; V(b) – освободить критическую секцию (установить b=1); V(f) – нарастить число занятых буферов. Следует учитывать, что уменьшение количества свободных и увеличение числа занятых буферов – разные операции. Поток-писатель, прежде всего, проверяет, имеются ли в пуле пустые буферы, используя семафор P(e). Если свободных буферов нет (е=0), то поток переводится в состояние ожидания. Если свободные буферы есть (е>0), то поток-писатель уменьшает их число и входит в критическую секцию (если это возможно, т.е. если b=1) для записи данных в буфер. После выхода из критической секции поток-писатель наращивает число занятых буферов V(f). Поток-читатель действует аналогично, с той разницей, что он начинает работу с проверки наличия заполненных буферов – P(f), а после чтения данных наращивает количество свободных буферов – V(e). 35)Поясните суть взаимных блокировок (тупиков).

Взаимная блокировка - ситуация, когда каждый из группы процессов ожидает событие, которое может вызвать только другой процесс из этой группы. Часто, такая ситуация наблюдается в парадоксах типа «Курица или яйцо». Также встречаются названия тупиковая ситуациятупик,клинч. В англоязычной литературе эта ситуация называется англ. deadlock(произносится как Дедлок ).

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

Вообще говоря, блокировкой (или зависанием ) есть такая ситуация, когда вне зависимости от того, сколько прошествии времени, ни один прехид из одного состояния в другое состояться не может.

Условия возникновения взаимной блокировки

Было показано, что для возникновения ситуации взаимной блокировки, необходимо выполнение следующих четырех условий одновременно:

  1. Условие взаимного исключения ( англ. mutual exclusion ). Каждый ресурс в текущий момент или занят ровно одним процессом или свободный. То есть, ресурсы находятся в режиме эксклюзивного пользования.

  2. Условие удержания и ожидания ( англ. hold and wait ). Процессы, в текущий момент удерживают полученные ранее ресурсы, могут делать запросы на получение новых ресурсов.

  3. Условие отсутствия принудительного освобождения ресурсов ( англ. no preemption ). Невозможно заставить процесс освободить ранее полученные ресурсы.Процесс, обладающий ресурсами, должен сам их увольнять.

  4. Условие циклического ожидания ( англ. circular wait ). Должно существовать кольцевая последовательность из двух или более процессов, каждый из которых ожидает увольнение ресурса, удерживаемого следующим членом последовательности. Иными словами, должно существовать множество процессов {P0, P1,... Pn}, так, что процесс 0 ожидает освобождения ресур процесса 1, 1 ожидает 2,...,P N - 1 ожидает P N, а P N ожидает освобождения ресурсов процессом 0.