Барьеры
- это механизм синхронизации, который предназначается для нескольких процессов, а не для двух процессов как в большинстве рассмотренных случаях.
При использовании этого механизма некоторые приложения делятся на фазы и существует правило что процесс не может перейти в следующую фазу пока к этому не готовы все остальные процессы. Этого можно достичь, разместив в конце каждой фазы барьер. Когда процесс дойдет до барьера он блокируется, пока все остальные процессы не дойдут до этого барьера.
Задачи на межпроцессное взаимодействие.
Читатель- писатель. Варианты решения:
1. Решение с помощью передачи сообщений. Предположим, что вес сообщения имеют одинаковый размер и все сообщения которые посланы, но еще не получены автоматически помещаются ОС в буфер. При решении этой задачи используются N сообщений. Читатель начинает с того, что посылает писателю N пустых сообщений. Как только у писателя оказывается элемент данных, который он может предоставить читателю, он берет пустое сообщение и отправляет полное. Т.о. общее число сообщений в системе постоянно и их можно хранить в заданном участке памяти. Если писатель работает быстрее читателя, то все сообщение будут ожидать читатель в заполненном виде, при этом писатель блокируется в ожидании пустого сообщения. Если читатель работает быстрее писателя, то все сообщение будут ожидать писателя в пустом виде, при этом читатель блокируется в ожидании заполненного сообщения.
2. При использовании почтовых ящиков в задаче читатель- писатель оба они создадут почтовые ящики достаточно большие, что бы хранить N сообщений. Писатель будет посылать сообщения с данными в почтовый ящик читателя, а читатель будет посылать пустые сообщения в почтовый ящик писателя. При использовании почтовых ящиков необходимо использовать метод буферизации, что бы хранить сообщения посланные читателю, но еще не получены.
3. Использование семафоров.
Введем два семафора:
- e- число пустых буферов;
- f- количество заполненных буферов.
N- общее количество буферов
p- SemSignal
v- SemWait
В исходном состоянии e= N; f=0
4. Неправильное решение. Поток писатель. Выполняется p(e), потом проверяется, доступен p(f) ли критический ресурс, если все нормально, то выполняется запись и v(e),v(f). Поток читатель. p(f)p(e) v(e),v(e).