Архитектура Unix

       

. Алгоритм чтения блока с продвижением



Рисунок 3.14. Алгоритм чтения блока с продвижением



алгоритм breada /* чтение блока с продвижением */ входная информация: (1) в файловой системе номер блока для немедленного считывания (2) в файловой системе номер блока для асинхронного считывания выходная информация: буфер с данными, считанными немедленно { если (первый блок отсутствует в кеше) { получить буфер для первого блока (алгоритм getblk); если (данные в буфере неверные) приступить к чтению с диска; } если (второй блок отсутствует в кеше) { получить буфер для второго блока (алгоритм getblk); если (данные в буфере верные) освободить буфер (алгоритм brelse); в противном случае приступить к чтению с диска; } если (первый блок первоначально находился в кеше) { считать первый блок (алгоритм bread); возвратить буфер; } приостановиться (до того момента, когда первый буфер будет содержать верные данные); возвратить буфер; }


Могут возникнуть ситуации, и это будет показано в следующих двух главах, когда ядро не записывает данные немедленно на диск. Если запись "откладывается", ядро соответствующим образом помечает буфер, освобождая его по алгоритму brelse, и продолжает работу без планирования ввода-вывода. Ядро записывает блок на диск перед тем, как другой процесс сможет переназначить буфер другому блоку, как показано в алгоритме getblk (случай 3). Между тем, ядро надеется на то, что процесс получает доступ до того, как буфер будет переписан на диск; если этот процесс впоследствии изменит содержимое буфера, ядро произведет дополнительную операцию по сохранению изменений на диске.









Содержание раздела