Процесс поставщик создает информацию и помещает ее в общую область (буфер). Процесс потребитель извлекает информацию из буфера и осуществляет ее дальнейшую обработку.
1)Работа с простым, разделенным буфером.
Есть 2 процесса: поставщик и потребитель. Обмен информацией происходит через буфер, кот. в текущий момент времени может быть доступен либо на чтение, либо на запись. Необходимо так запрограммировать процесс, чтобы сообщение, помещенное в буфер не перезаписывалось без прочтения, и в то же время было прочитано 1 раз.
Поставщик: создание информации(П11);
Работа с буфером (П12);
Потребитель: работа с буфером(П21);
Обработка информации (П22);
Поставщик: П11; P(S); П12; V(S); goto L1;
Потребитель: P(S); П21; V(S); П22; goto L2;
Состояние буфера: Пустой = 1;
Полный =0;
L1: поставщик: П11; Р(пустой); П12; V(полный); goto L1;
L2: Р(полный); П12; V(пустой); П22; goto L2;
Это была задача с разделенным семафором.
2)Работа с составным буфером.(буферный пул)
Есть процесс поставщик, кот. может помещать информацию в буферный пул вплоть до его заполнения, даже если информация не извлекается. Есть процесс потребитель, кот извлекает информацию из буферного пула вплоть до его опустошения. В текущий момент времени доступ к буферу открыт либо по чтению, либо по записи, за одно обращение записывается или освобождается 1 ячейка пула. Необходимо так запрограммировать процесс, что бы в любой момент времени было известно число свободных и занятых ячеек, и процесс не выполнял чтение из несуществующей ячейки или запись в нее. (все равно в каком порядке происходит запись и забирается информация).
|
|
Поставщик: L1: П11; P(e); P(S); П12; V(f); V(S); goto L1;
Потребитель: L2: P(f); P(S); П21; V(e); V(S); П22; goto L2;
е- количество свободных ячеек
f – количество занятых ячеек
3)Работа с кольцевым буфером.
Пусть есть 2 процесс: поставщик и потребитель. В текущий момент времени буфер содержит очередь помещенных, но еще не прочитанных сообщений. Введем 2 переменных, 1-для чтения(индекс 1 ячейки, кот. нужно прочитать – 1ЧТ), и одну для заполнения(1ая свободная ячейка после очереди – 1ЗП). Необходимо запрограммировать работку процесса так, что бы информация заносилась и очищалась в определенном порядке, при этом доступ к буферу был открыт как по чтению, так и по записи.
Поставщик: P (пустой)
Buf(1ЗП)=сообщение
1ЗП= (1ЗП+1)%N
V (полный)
Потребитель: Р (полный)
ДАТА = Buf(1ЧТ)
1ЧТ=(1ЧТ+1)%N
V (пустой)
Пустой = число свободных ячеек;
Полный = число занятых ячеек;
Р(пустой) – пока это не = 0 будем писать, когда станет 0, процесс прекратиться.