Общая картина
Создание файла
На высоком уровне процесс создания файла /dir 1/filel.dat сводится к поиску каталога dirl, созданию записи каталога, выделению индексного узла и последующему выделению блоков для содержимого файла.
Точный порядок выделения структур данных зависит от ОС; описанная далее процедура может отличаться от той, что используется в вашей конкретной системе. Для простоты в этом примере игнорируются структуры данных со списками размеров фрагментов и кластеров. Создание файла начинается с чтения суперблока, который занимает 2 Кбайт и находится в файловой системе со смещением 64 Кбайт. Из суперблока мы узнаем, что размер блока равен 16 Кбайт, а размер фрагмента — 2 Кбайт. Каждая группа цилиндров содержит из 32 776 фрагментов и 8256 индексных узлов. Мы также узнаем, что дескриптор группы хранится со смещением 40 фрагментов, а таблица индексных узлов — со смещением 56 фрагментов в каждой группе цилиндров. Далее необходимо обработать индексный узел 2, чтобы найти каталог dirl в корневом каталоге. Используя информацию о количестве индексных узлов в группе, мы определяем, что индексный узел 2 находится в группе цилиндров 0. Следовательно, таблица индексных узлов с информацией об узле 2 начинается в блоке 56. Из блока 56 читается таблица индексных узлов, в которой обрабатывается третья запись (первая запись соответствует индексному узлу 0). Содержимое индексного узла 2 показывает, что структуры записей каталогов для корневого каталога находятся в блоке 1096. Мы читаем содержимое корневого каталога из блока 1096 и обрабатываем его как список записей каталогов. Последовательно перемещаясь вперед по указанным длинам записей (удаленные файлы нас не интересуют), мы в конечном счете приходим к записи с именем dirl. В записи указан номер индексного узла 16 549. У корневого каталога обновляется А-время.Местонахождение индексного узла 16 549 определяется делением числа на количество индексных узлов в группе. Так мы определяем, что узел находится в группе цилиндров 2. Группа 2 начинается в блоке 65 552, поэтому ее таблица индексных узлов начинается в блоке 65 608 (если бы использовалась файловая система UFS1, нам также пришлось бы вычислить базовый адрес для группы). Из блока 65 608 читается таблица индексных узлов, в которой обрабатывается запись 37 — относительным номером индексного узла 16 549. Содержимое индексного узла показывает, что содержимое dirl находится в блоке 66 816. Мы читаем содержимое dirl из блока 66 816 и обрабатываем его как список записей каталогов. Нас интересует неиспользуемое пространство в каталоге. Имя filel.dat состоит из 8 символов, поэтому для хранения записи каталога потребуется 16 байт. Имя нового файла включается между двумя существующими именами, для каталога обновляется М- и С-время. Место, отведенное под новую запись, ранее использовалось удаленным файлом. Для создаваемого файла необходимо выделить индексный узел, причем этот узел должен входить в группу своего родительского каталога, то есть в группу 2. Чтобы найти битовую карту индексных узлов, необходимо сначала найти дескриптор группы, удаленный на 48 фрагментов от начала группы. Выясняется, что дескриптор находится в блоке 65 600; из него мы узнаем, что битовая карта индексных узлов хранится в дескрипторе со смещением 168 байт. Кроме того, дескриптор сообщает, что последней была выделена запись индексного узла 16 650. Проверка состояния индексного узла 16 651 показывает, что узел свободен. Соответствующий бит в битовой карте устанавливается, номер последнего выделенного индексного узла в дескрипторе обновляется, а счетчик свободных индексных узлов в дескрипторе группы и в сводке групп цилиндров уменьшается. Адрес индексного узла заносится в запись каталога filel.dat. На следующем этапе мы находим в таблице индексных узлов узел 139 (относительный адрес узла 16 651) и инициализируем его параметры.
Временные штампы инициализируются текущим временем, а счетчик ссылок задается равным 1. Также заполняются поля UID, GID и режима. Размер файла равен 25 000 байт, для хранения его содержимого требуется выделить один блок и пять фрагментов. Прежде всего из дескриптора группы определяется смещение битовой карты фрагментов, которая хранится со смещением 1200. В дескрипторе группы указан номер последнего выделенного блока 67 896. Мы проверяем блок 67 904 по битовой карте свободных фрагментов и определяем, что он свободен. Бит этого блока в карте обнуляется, а счетчик свободных блоков уменьшается. Также обновляется поле указателя на последний выделенный блок. Пять свободных фрагментов находятся по битовой карте (или одному из служебных списков); в нашем примере это фрагменты 74 242-74 246. Биты фрагментов обнуляются, обновляются соответствующие служебные данные. Адрес блока и начальный фрагмент включаются в индексный узел. Содержимое файла filel.dat записывается в выделенный блок и фрагменты.
Итоговое состояние системы показано на рис. 16.8.
Группа цилиндров 2
Рис. 16.8. Итоговое состояние системы после добавления файла dirl/filel.dat
Пример удаления файла
Перейдем к процедуре удаления файла /dirl/filel.dat с использованием методов, характерных для BSD. Как упоминалось в предыдущем разделе, порядок освобождения структур данных зависит от ОС, и описанная далее процедура может отличаться от той, что используется в вашей конкретной системе. Удаление файла начинается с чтения из суперблока структуры данных объемом 2 Кбайт, которая находится в файловой системе со смещением 64 Кбайт. Из суперблока мы узнаем, что размер блока равен 16 Кбайт, а размер фрагмента — 2 Кбайт. Каждая группа цилиндров состоит из 32 776 фрагментов и 8256 индексных узлов. Мы также узнаем, что дескриптор группы хранится со смещением 40 фрагментов, а таблица индексных узлов — со смещением 56 фрагментов в каждой группе цилиндров.
Далее необходимо обработать индексный узел 2, чтобы найти каталог dirl в корневом каталоге.
Используя информацию о количестве индексных узлов в группе, мы определяем, что индексный узел 2 находится в группе цилиндров 0. Следовательно, таблица индексных узлов с информацией об узле 2 начинается в блоке 56. Из блока 56 читается таблица индексных узлов, в которой обрабатывается третья запись (первая запись соответствует индексному узлу 0). Содержимое индексного узла 2 показывает, что структуры записей каталогов для корневого каталога находятся в блоке 1096. Мы читаем содержимое корневого каталога из блока 1096 и обрабатываем его как список записей каталогов. Последовательно перемещаясь вперед по указанным длинам записей (удаленные файлы нас не интересуют), мы в конечном счете приходим к записи с именем dir 1. В записи указан номер индексного узла 16 549. У корневого каталога обновляется А-время. Местонахождение индексного узла 16 549 определяется делением числа на количество индексных узлов в группе. Так мы определяем, что узел находится в группе цилиндров 2. Группа 2 начинается в блоке 65 552, поэтому ее таблица индексных узлов начинается в блоке 65 608. Из блока 65 608 читается таблица индексных узлов, в которой обрабатывается запись 37 — относительным номером индексного узла 16 549, Содержимое индексного узла показывает, что содержимое dirl находится в блоке 66 816. Мы читаем содержимое dirl из блока 66 816 и обрабатываем его как список записей каталогов. Нас интересует запись файла filel.dat. Мы находим эту запись и узнаем, что ей выделен индексный узел 16 651. Чтобы освободить запись каталога, ее длина прибавляется к длине предыдущей записи каталога, относящейся к файлу 12.jpg. В системе Solaris также пришлось бы стереть содержимое указателя на индексный узел. Для каталога dirl обновляется М-, А- и С-время. В результате удаления имени файла счетчик ссылок в индексном узле 16 651 таблицы индексных узлов группы 2 уменьшается на 1. Значение счетчика становится равным 0; это означает, что индексный узел необходимо освободить. Для этого соответствующий разряд битовой карты индексных узлов обнуляется, а в дескрипторе группы и сводке групп цилиндров обновляются счетчики свободных индексных узлов. В индексном узле стирается поле режима. Также необходимо освободить один блок и пять фрагментов, выделенных для хранения содержимого файла. Для каждого блока или фрагмента устанавливается соответствующий разряд битовой карты блоков/фрагментов и стирается указатель на блок в индексном узле. Размер файла уменьшается при каждом освобождении блока, и в конечном счете он становится равным 0. М~ и С-время индексного узла обновляется в соответствии с внесенными изменениями. В дескрипторе группы и сводке групп цилиндров обновляются счетчики свободных блоков и фрагментов.Итоговое состояние системы показано на рис. 16.9. Жирные линии и значения
представляют изменения файловой системы в результате удаления.
Рис. 16.9. Итоговое состояние системы после удаления файла dirl/filel.dat
Еще по теме Общая картина:
- Общая картина
- Общая картина
- Общая картина
- Общая картина
- КУЛЬТУРНАЯ КАРТИНА МИРА
- Какими мне кажутся картины
- Картина мира.
- Картина мира.
- В. В. Казютинский. Астрономия и современная картина мира, 1996
- Содержание творчества — «картины сердцам
- ОБЩАЯ ЧАСТЬ Раздел I. ОБЩАЯ ХАРАКТЕРИСТИКА УГОЛОВНОГО ПРАВА (ALLGEMAIN GRUNDLAGEN)
- §4. ИСХОДНЫЕ ПОНЯТИЯ КУЛЬТУРОЛОГИИ: КУЛЬТУРА, ЦИВИЛИЗАЦИЯ, МЕНТАЛИТЕТ И МЕНТАЛЬНОСТЬ, КУЛЬТУРНАЯ КАРТИНА МИРА
- ЭТНОС ВОСТОЧНЫХ СЛАВЯН. ДРЕВНЕСЛАВЯНСКАЯ КАРТИНА МИРА. СЛАВЯНСКИЙ ЭТНОЦЕНТРУМ.
- Дискуссия.Место и роль России в современной геополитической картине мира