Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
642 из 715
алгоритм getblk /* многопроцессорная версия */
входная информация:
номер файловой системы
номер блока
выходная информация: захваченный буфер, предназначенный для обработки содержимого блока
{
do while(буфер не будет обнаружен) {
P(семафор хеш-очереди);
if (блок находится в хеш-очереди) {
if (операция CP(семафор буфера) завершается неудачно) { /* буфер занят */
V(семафор хеш-очереди);
P(семафор буфера); /* приостанов до момента освобождения */
if (операция CP(семафор хеш-очереди) завершается неудачно) {
V(семафор буфера);
continue; /* выход в цикл "выполнять" */
}
else if (номер устройства или номер блока изменились) {
V(семафор буфера);
V(семафор хеш-очереди);
}
}
do while(операция CP(семафор списка свободных буферов) не завершится успешно);
/* "кольцевой цикл" */
пометить буфер занятым;
убрать буфер из списка свободных буферов;
V(семафор списка свободных буферов);
V(семафор хеш-очереди);
return буфер;
}
else
/* буфер отсутствует в хеш-очереди здесь начинается выполнение оставшейся части алгоритма */
}
}
Рисунок 12.14. Выделение буфера с использованием семафоров
На Рисунке 12.14 показана первая часть алгоритма getblk, реализованная в многопроцессорной системе с использованием семафоров. Просматривая буферный кеш в поисках указанного блока, ядро с помощью операции P захватывает семафор, принадлежащий хеш-очереди. Если над семафором уже кем-то произведена операция данного типа, текущий процесс приостанавливается до тех пор, пока процесс, захвативший семафор, не освободит его, выполнив операцию V. Когда текущий процесс получает право исключительного контроля над хеш-очередью, он приступает к поиску подходящего буфера. Предположим, что буфер находится в хеш-очереди.
|< Пред. 640 641 642 643 644 След. >|