Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
115 из 715
Объем файла в байтах при размере блока 1 Кбайт
алгоритм bmap /* отображение адреса смещения в байтах от начала логического файла на адрес блока в файловой системе */
входная информация:
(1) индекс
(2) смещение в байтах
выходная информация:
(1) номер блока в файловой системе
(2) смещение в байтах внутри блока
(3) число байт ввода-вывода в блок
(4) номер блока с продвижением
{
вычислить номер логического блока в файле исходя из заданного смещения в байтах;
вычислить номер начального байта в блоке для ввода-вывода; /* выходная информация 2 */
вычислить количество байт для копирования пользователю; /* выходная информация 3 */
проверить возможность чтения с продвижением, пометить индекс; /* выходная информация 4 */
определить уровень косвенности;
do (пока уровень косвенности другой) {
определить указатель в индексе или блок косвенной адресации исходя из номера логического блока в файле;
получить номер дискового блока из индекса или из блока косвенной адресации;
освободить буфер от данных, полученных в результате выполнения предыдущей операции чтения с диска (алгоритм brelse);
if (число уровней косвенности исчерпано) return (номер блока);
считать дисковый блок косвенной адресации (алгоритм bread);
установить номер логического блока в файле исходя из уровня косвенности;
}
}
Рисунок 4.8. Преобразование адреса смещения в номер блока в файловой системе
Рассмотрим формат файла в блоках (Рисунок 4.9) и предположим, что дисковый блок занимает 1024 байта. Если процессу нужно обратиться к байту, имеющему смещение от начала файла, равное 9000, в результате вычислений ядро приходит к выводу, что этот байт располагается в блоке прямой адресации с номером 8 (начиная с 0). Затем ядро обращается к блоку с номером 367; 808-й байт в этом блоке (если вести отсчет с 0) и является 9000-м байтом в файле. Если процессу нужно обратиться по адресу, указанному смещением 350000 байт от начала файла, он должен считать блок двойной косвенной адресации, который на рисунке имеет номер 9156. Так как блок косвенной адресации имеет место для 256 номеров блоков, первым байтом, к которому будет получен доступ в результате обращения к блоку двойной косвенной адресации, будет байт с номером 272384 (256К + 10К); таким образом, байт с номером 350000 будет иметь в блоке двойной косвенной адресации номер 77616.
|< Пред. 113 114 115 116 117 След. >|