пользователей: 21251
предметов: 10459
вопросов: 177801
Конспект-online
зарегистрируйся или войди через vk.com чтобы оставить конспект.
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Семафоры и семафорные примитивы. Задача «писатели-читатели» с приоритетом писателей.

В общем о семафорах! см.билет№32

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

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

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

Наиболее широкое применение на практике нашли два варианта взаимодействия процессов-читателей и процессов-писателей: взаимодействие с приоритетом «читателей» и взаимодействие с приоритетом «писателей». В обоих случаях необходимо обеспечить описанное выше взаимное исключение. Различия между вариантами взаимодействия процессов определяются ограничениями, которые накладываются на процессы-читатели при появлении процесса-писателя.

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

Задача «читатели-писатели» с приоритетом «писателей».

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

Этой цели можно добиться, добавив еще один двоичный семафор S: 

W=1; Число_читателей=0; R=1

S=1;

Process Читатель   

{

P(S); P(R);

Число_читателей=Число_читателей+1;

Если Число_читателей=1 then P(W); 

V(R); V(S);

Чтение_данных;

P(R);

Число_читателей=Число_читателей-1;

Если Число_читателей=1 then V(W);

V(R);

Process Писатель 

{

P(S); P(W); Запись_данных; V(W); V(S);


15.06.2014; 14:48
хиты: 189
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2016. All Rights Reserved. помощь