Архитектура операционной системы UNIX   ::   Бах Морис Дж.

Страница: 90 из 715



алгоритм 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 След. >|

Контакты: [email protected]