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

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

Если же, в начале выполнения алгоритма breada, первый блок обнаружился в буферном кеше, ядро тут же проверяет, находится там же и второй блок, и продолжает работу по только что описанной схеме.

алгоритм bread /* чтение блока */

входная информация: номер блока в файловой системе

выходная информация: буфер, содержащий данные

{

 получить буфер для блока (алгоритм getblk);

 if (данные в буфере правильные)  return буфер;

 приступить к чтению с диска;

 sleep (до завершения операции чтения);

 return (буфер);

}

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

Алгоритм записи содержимого буфера в дисковый блок (Рисунок 3.15) похож на алгоритм чтения. Ядро информирует дисковод о том, что есть буфер, содержимое которого должно быть выведено, и дисковод планирует операцию ввода-вывода блока. Если запись производится синхронно, вызывающий процесс приостанавливается, ожидая ее завершения и освобождая буфер в момент возобновления своего выполнения. Если запись производится асинхронно, ядро запускает операцию записи на диск, но не ждет ее завершения. Ядро освободит буфер, когда завершится ввод-вывод.

алгоритм breada /* чтение блока с продвижением */

входная информация:

 (1) в файловой системе номер блока для немедленного считывания

 (2) в файловой системе номер блока для асинхронного считывания

выходная информация: буфер с данными, считанными немедленно

{

 if (первый блок отсутствует в кеше)  {

  получить буфер для первого блока (алгоритм getblk);

  if (данные

|< Пред. 87 88 89 90 91 След. >|

Java книги

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