алгоритм breada /* чтение блока с продвижением */
входная информация:
(1) в файловой системе номер блока для немедленного считывания
(2) в файловой системе номер блока для асинхронного считывания
выходная информация: буфер с данными, считанными немедленно
{
if (первый блок отсутствует в кеше) {
получить буфер для первого блока (алгоритм getblk);
if (данныев буфере неверные) приступить к чтению с диска;
}
if (второй блок отсутствует в кеше) {
получить буфер для второго блока (алгоритм getblk);
if (данные в буфере верные) освободить буфер (алгоритм brelse);
else приступить к чтению с диска;
}
if (первый блок первоначально находился в кеше) {
считать первый блок (алгоритм bread);
return буфер;
}
sleep (до того момента, когда первый буфер будет содержать верные данные);
return буфер;
}
Рисунок 3.14. Алгоритм чтения блока с продвижением
Могут возникнуть ситуации, и это будет показано в следующих двух главах, когда ядро не записывает данные немедленно на диск. Если запись «откладывается», ядро соответствующим образом помечает буфер, освобождая его по алгоритму brelse, и продолжает работу без планирования ввода-вывода. Ядро записывает блок на диск перед тем, как другой процесс сможет переназначить буфер другому блоку, как показано в алгоритме getblk (случай 3). Между тем, ядро надеется на то, что процесс получает доступ до того, как буфер будет переписан на диск; если этот процесс впоследствии изменит содержимое буфера, ядро произведет дополнительную операцию по сохранению изменений на диске.
алгоритм bwrite /* запись блока */
входная информация: буфер
выходная информация: отсутствует
{
приступить к записи на диск;
if (ввод-вывод синхронный) {
sleep (до завершения ввода-вывода);
|< Пред. 88 89 90 91 92 След. >|