в котором для обработки запроса необходимо перемещать головки
диска из их текущего положения.
Запросы очереди left упорядочены по уменьшению номера ци-
линдра, а в очереди right — по возрастанию.
Переменная headpos запоминает текущую позицию головок, а
nsaved — число сохраненных запросов.
Пусть cy1 — затребованный адрес (т.е. позиция, куда требует-
ся переместить головку). Инвариант для внешнего цикла процесса
можно записать в следующем виде.
SST: {left — это упорядоченная очередь от наибольшего
к наименьшему}
V
{все значения в left не больше headpos}
V
{right — это упорядоченная очередь от наименьшего к
наибольшему}
V
{все значения в right не меньше headpos}
V
{если (nsaved==0), то и left и right пусты}
Примитив empty в условии внутреннего цикла while позволяет
определить, есть ли еще сообщение в очереди канала request.
Здесь приводится пример метода программир ования, называе-
мого опросом.
Процесс постоянно опрашивает канал request, чтобы опреде-
лить, имеются ли ожидающие запросы. Если такие запросы есть,
то процесс получает еще один запрос для того, чтобы расширить
возможность выбора подходящего. Если ожидающих запросов нет,
то процесс приступает к обслуживанию наиболее подходящих из
сохраненных.
ПЛАНИРУЮЩИЙ ПРОЦЕСС
chan request(int clientID, int cy1,
[типы других аргументов]);
chan reply[n]([типы результатов]);
process Disk_Driver {
queue left, right;
# упорядоченные очереди сохраненных запросов
int clientID, cy1, headpos=1, nsaved=0;
[переменные для запоминания
других аргументов запроса];
while (true){ ## инвариант цикла SST
while (!empty(request) or nsaved==0){
# если очередь не пуста или число сохраненных
40