В общем о семафорах! см.билет№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);
}