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