Составители:
Рубрика:
обработки вызовов: первым обслуживается самый старый вызов,
который имеет минимальное значение выражения планирования.
Заметим, что как и условие синхронизации выражение плани-
рования может ссылаться на параметры операции, так что его зна-
чение, вообще говоря, зависит от аргументов вызова операции.
§ 8. Взаимодействие типа “клиент-сервер”
Пусть имеется процесс с локальным кольцевым буфером из n
элементов, который обслуживает две операции deposit и fetch:
deposit — производитель помещает элемент в буфер;
fetch — потребитель извлекает элемент из буфера.
Рассмотрим кольцевой буфер, построенный в помощью рандеву.
КОЛЬЦЕВОЙ БУФЕР НА ОСНОВЕ РАНДЕВУ
module BoundedBuffer
op deposit(type T), fetch(result type T);
body
process Buffer {
type T buf[n];
int front=0; rear=0; count=0;
# count - число обращений производителя к
# буферу минус число изъятий
while(true)
# вызывая deposite() производитель
# помещает товар в буфер:
in deposite(item) and count<n -->
buf[rear]=item;
# - помещение товара в буфер
rear=(rear+1) mod n;
# - номер следующего пустого ящика
count=count+1;
[ ]
# вызывая fetch(), потребитель
# забирает товар из буфера:
fetch(item) and count>0 -->
item=buf[front];
front=(front+1) mod n;
84
Страницы
- « первая
- ‹ предыдущая
- …
- 81
- 82
- 83
- 84
- 85
- …
- следующая ›
- последняя »