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

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



алгоритм read

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

 пользовательский дескриптор файла

 адрес буфера в пользовательском процессе

 количество байт, которые нужно прочитать

выходная информация: количество байт, скопированных в пользовательское пространство

{

 обратиться к записи в таблице файлов по значению пользовательского дескриптора файла;

 проверить доступность файла;

 установить параметры в адресном пространстве процесса, указав адрес пользователя, счетчик байтов, параметры ввода-вывода для пользователя;

 получить индекс по записи в таблице файлов;

 заблокировать индекс;

 установить значение смещения в байтах для адресного пространства процесса по значению смещения в таблице файлов;

 do (пока значение счетчика байтов не станет удовлетворительным)   {

  превратить смещение в файле в номер дискового блока (алгоритм bmap);

  вычислить смещение внутри блока и количество байт, которые будут прочитаны;

  if (количество байт для чтения == 0) /* попытка чтения конца файла */ break; /* выход из цикла */

  прочитать блок (алгоритм breada, если производится чтение с продвижением, и алгоритм bread — в противном случае);

  скопировать данные из системного буфера по адресу пользователя;

  скорректировать значения полей в адресном пространстве процесса, указывающие смещение в байтах внутри файла, количество прочитанных байт и адрес для передачи в пространство пользователя;

  освободить буфер; /* заблокированный в алгоритме bread */

 }

 разблокировать индекс;

 скорректировать значение смещения в таблице файлов для следующей операции чтения;

 return (общее число прочитанных байт);

}

Рисунок 5.5.

|< Пред. 148 149 150 151 152 След. >|

Java книги

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