Тема 10. Классические проблемы межпроцессного взаимодействия

Проблема производителя и потребителя

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

Условия синхронизации:

- производитель должен ждать, если буфер полон;

- потребитель должен ждать, если буфер пуст;

- операции с буфером – критические секции, т.е. работать с буфером может только один процесс.

Ниже приведено решение проблемы производителя и потребителя с использованием семафоров.

#define N 100 /* количество сегментов в буфере */

typedef int semaphore;

semaphore mutex = 1; /* контроль доступа в КС */

semaphore empty = N; /* число пустых сегментов буфера */

semaphore full = 0; /* число полных сегментов буфера */

void producer(void)

{

int item;

while (TRUE) {

item = produce_item();/*создать данные, помещаемые в буфер */

wait(&empty); /* уменьшить счетчик пустых сегментов буфера */

wait(&mutex); /* вход в критическую область */

insert_item(item); /* поместить в буфер новый элемент */

signal(&mutex); /* выход из критической области */

signal(full); /*увеличить счетчик полных сегментов буфера*/

}

}

void consumer(void);

{

int item;

while (TRUE) {

wait(&full); /* уменьшить число полных сегментов буфера */

wait(&mutex); /* вход в критическую область */

item = remove_item(); /* удалить элемент из буфера */

signal(&mutex); /* выход из критичекой области */

signal(&empty); /*увеличить счетчик пустых сегментов буфера*/

consume_item(item); /* обработка элемента */

}

}

Здесь семафор mutex используется для реализации взаимного исключения, то есть для исключения одновременного обращения к буферу двух процессов. Остальные семафоры использованы для синхронизации. Семафоры full и empty необходимы, чтобы гарантировать, что производитель прекращает работу, когда буфер полон, а потребитель прекращает работу, когда буфер пуст.

Можно обобщить задачу на случай m производителей и n потребителей.

Задача о читателях и писателях

Это одна из задач синхронизации, описывающих доступ процессов к разделяемой базе данных. Процессы подразделяются на две категории: читатели никогда не модифицируют базу данных; писатели читают и модифицируют базу данных.

Правила синхронизации следующие:

- читатели могут работать параллельно, если никто из писателей не модифицирует базу данных;

- модифицировать базу может только один писатель и когда никто не читает из базы данных;

- переменные состояния может просматривать и менять только один процесс;

Ниже приведена схема решения данной задачи.

Читатель Писатель
Ждать, пока закончит работу писатель (если кто-то пишет) Ждать, пока закончат работу все читатели (если кто-то читает)
Читать из базы данных Модифицировать базу данных
При необходимости разбудить ожидающего писателя При необходимости разбудить ожидающих читателей

Задача об обедающих философах

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

Ограничения:

- философ должен ждать, пока не освободятся две вилки рядом с ним;

- модификация переменных состояния должно выполняться в критической секции.

Задача о спящем парикмахере

Моделирует обслуживание потока запросов по очереди. Клиенты приходят в парикмахерскую и встают в очередь. Парикмахер приглашает и обслуживает клиентов по одному.

Ограничения:

- клиент должен ждать, если есть очередь или парикмахер занят обслуживанием;

- парикмахер спит, если нет клиентов;

- первый клиент будит парикмахера.

Задача о железнодорожном перегоне

Моделирует обмен по полудуплексному каналу связи. Поезда движутся по одноколейному участку дороги в двух направлениях. Необходимо организовать движение таким образом, чтобы избежать столкновения.

Ограничения:

- поезд, подходящий к одноколейному участку дороги должен остановиться, если по нему движется поезд во встречном направлении;

- модификация переменных состояния должно выполняться в критической секции.

Вопросы для самоконтроля

1. Приведите решение задачи производителей и потребителей при помощи семафоров.

2. Какие условия обычно связаны с задачей читателей и писателей?

3. Как решается задача читателей и писателей при помощи семафоров?

Наши рекомендации