Следующий блок - это суперблок файловой системы. Он содержит оперативную информацию о текущем состоянии операционной системы, а также данные о параметрах настройки файловой системы. В частности, суперблок содержит информацию о количестве, так называемых, индексных дескрипторов в файловой системе. Также суперблок содержит информацию о количестве блоков, составляющих файловую систему, а также информацию о свободных блоках файлов, о свободных индексных дескрипторах, и прочие данные, характеризующие время, дату модификации и другие специальные параметры.
Блок начальной загрузки | Суперблок файловой системы | Область индексных дескрипторов | Блоки файлов | Область сохранения |
0 |
За суперблоком следует область (пространство) индексных дескрипторов. Индексный дескриптор - это специальная структура данных файловой системы, которая ставится во взаимно однозначное соответствие с каждым файлом. Размер пространства индексных дескрипторов определяется параметром генерации файловой системы по количеству индексных дескрипторов, которые указаны в суперблоке. Каждый индексный дескриптор содержит следующую информацию:
1. Поле, определяющее тип файла (каталог или нет).
2. Поле кода защиты.
3. Количество ссылок к данному индексному дескриптору из всевозможных каталогов файловой системы (в ситуации нарушения дерева файловой системы). Если значение этого поля равно нулю, то считается что этот индексный дескриптор свободен.
4. Длина файла в байтах.
5. Статистика: поля, характеризующие дату и время создания и т.п.
6. Поле адресации блоков файлов.
Следующее пространство файловой системы - это блоки файлов. Это пространство на системном устройстве, в котором размещается вся информация, хранящаяся в файлах и о файлах, которая не поместилась в предыдущие блоки файловой системы.
Последняя область данных в разных системах реализуется по-разному, но для простоты изложения, мы будем считать, что эта область находится сразу за блоками файловой системы - это область сохранения.
Такова концептуальная структура файловой системы. Теперь рассмотрим детали.
Суперблок. Наибольший интерес в суперблоке вызывают последние два поля: поля информации о свободных блоках файлов и свободных индексных дескрипторах. В файловой системе UNIX-а заметно влияние двух факторов. Первый фактор - это то, что файловая система разрабатывалась в те времена, когда объем винчестера в 5-10Мб считался очень большим. Внутри структуры файловой системы заметны старания авторов оптимизировать использование пространства внешнего устройства. Второй фактор - свойство файловой системы по оптимизации доступа. Критерий оптимальности доступа - количество обменов файловой системы с внешним устройством, которые она производит для обеспечения нужд.
Список (массив) свободных блоков файлов состоит из пятидесяти элементов и занимает 100 байтов. В буфере, состоящем из пятидесяти элементов, записаны номера свободных блоков пространства блоков памяти. Эти номера записаны со второго элемента по сорок девятый. Первый элемент массива содержит номер последней записи в этом массиве. Нулевой элемент этого списка содержит ссылку на блок пространства блоков файлов, в котором этот список продолжен, и т.д.
Если какому-то процессу требуется для расширения размера его файла дополнительный свободный блок, то система по указателю Номер Блока (НБ) выбирает элемент массива (копия суперблока всегда присутствует в оперативной памяти, поэтому почти при всех таких действиях система не нуждается в обращении к СВЗУ) и этот блок предоставляется соответствующему файлу для расширения (при этом корректируется указатель НБ). Если происходит сокращение размера файла или удаление всего файла, то высвободившиеся номера записываются в массив свободных блоков, при этом также происходит коррекция указателя НБ.
Так как размер массива равен пятидесяти элементам, то возможны две критические ситуации. Первая - когда при освобождении новых блоков не удается поместить их номера в этом массиве, так как он уже полон. В этом случае из файловой системы выбирается один свободный блок (при этом он удаляется из списка свободных блоков) и заполненный массив свободных блоков копируется в этот блок. После этого значение указателя НБ обнуляется, а в нулевой элемент массива записывается номер блока, который мы выбрали для копирования в него нашего массива. В итоге, при постоянном освобождении блоков образуется список, в котором будут размещены номера абсолютно всех свободных блоков файловой системы.
Вторая критическая ситуация - когда нужно получить свободный блок, но содержимое массива исчерпалось. В этом случае система действует так: если нулевой элемент списка равен нулю, то это означает, что исчерпалось все пространство файловой системы, и выдается сообщение об этом. Если он не равен нулю, то его содержимое равно адресу продолжения массива, и операционная система подчитывает соответствующий блок и размещает это продолжение на место массива в суперблоке.
Второй массив, который находится в суперблоке - это массив, состоящий из ста элементов и содержащий номера свободных индексных дескрипторов. Работа с этим массивом осуществляется просто. Пока есть место в этом массиве, то при освобождении индексных дескрипторов свободные индексные дескрипторы записываются на свободные места массива. Если массив заполнен полностью, то запись в этот массив прекращается. Если, наоборот, содержимое массива исчерпалось, то запускается процесс, который просматриваетобласть индексных дескрипторов и соответственно заполняет массив новыми значениями. Возможна ситуация, когда нужно создать файл, т.е. нужен новый индексный дескриптор, а в массиве нет ни одного элемента, и запущенный процесс также не нашел свободных индексных дескрипторов. Это вторая ситуация, когда система вынуждена заявить, что ресурс исчерпан (первая - когда заканчиваются свободные блоки файловой системы).
Лекция №8
Индексные дескрипторы. Индексные дескрипторы занимают несколько подряд идущих блоков на диске. Размер области индексных дескрипторов определяется параметром (который был определен при инсталляции системы), определяющим количество индексных дескрипторов для данной конкретной файловой системы. Размер области равен произведению этого количества на размер индексного дескриптора.
Индексный дескриптор - это объект UNIX-а, который ставится во взаимно однозначное соответствие с содержимым файла, за исключением случаев, когда файл есть некий специальный файл, ассоциированный с внешним устройством. В индексном дескрипторе существуют следующие поля:
1. Поле, определяющее тип файла (каталог или нет).
2. Поле кода защиты.
3. Количество ссылок к данному индексному дескриптору из всевозможных каталогов файловой системы (в ситуации нарушения дерева файловой системы). Если значение этого поля равно нулю, то считается что этот индексный дескриптор свободен.
4. Длина файла в байтах.
5. Статистика: поля, характеризующие дату и время создания и т.п.
6. Поле адресации блоков файлов.
Обратите внимание на то, что в индексном дескрипторе нет имени файла, хотя этот объект характеризует содержимое файла. Давайте посмотрим, как организована адресация блоков, в которых размещается содержимое файла.
В поле адресации находятся номера первых десяти блоков файлов. Если файл небольшой, то вся информация о размещении его блоков находится в индексном дескрипторе. Если файл превышает десять блоков, то начинает работать некая списочная структура. Одиннадцатый элемент поля адресации содержит номер блока из пространства блоков файлов, в котором размещены 128 ссылок на блоки данного файла.
В том случае, если файл еще больше, то используется двенадцатый элемент поля адресации. Он содержит номер блока, в котором содержится 128 записей о номерах блоков, содержащих по 128 номеров блоков файловой системы, т. е. здесь используется двойная косвенность. Если файл еще больше, то используется тринадцатый элемент и используется тройная косвенность (аналогично двойной, но добавляется еще один уровень). Предельный размер файла (при размере блока 512) будет равен (128 + 1282 + 1283) * 512 байт = 1Гб + 8Мб + 64Кб > 1Гб.
Мы с вами договаривались, что в течение нашего курса мы будем обращать внимание на несоответствие скоростей и на сглаживание этого. Первая проблема - если бы файловая система не имела в суперблоке массива свободных блоков, то пришлось бы каким-либо образом каждый раз искать свободные блоки, и эта работа была бы сумасшедшей, и файловая система рухнула бы на идейном уровне. Аналогично со списком свободных индексных дескрипторов, хотя здесь поиск был бы проще, чем для свободных блоков, но тем не менее, здесь также есть элементы оптимизации. Косвенность в адресации блоков файлов позволяет нарастать накладным расходам по чтению блоков файлов соразмерно величине этого файла. То есть если файл маленький, то накладных расходов нет, потому что при открытии файла в оперативной памяти создается копия индексного дескриптора файла, и без дополнительных обращений к ВЗУ можно добраться к любому из десяти блоков файла сразу же. Если необходимо работать с блоками, размещенными на первом уровне косвенной адресации, то появляется один дополнительный обмен, но при этом доступ можно осуществить уже к 128-и блокам. Аналогичные рассуждения и для блоков второго и третьего порядка. Казалось бы, плохо то, что при обмене с большим файлом приходиться осуществлять множество дополнительных обменов, однако система UNIX хитрая - она использует глубокую эшелонированную буферизацию обменов с ВЗУ. То есть если мы и получаем некоторые накладные расходы на одном уровне, то они компенсируются на другом уровне оптимизации взаимодействия системы с внешней памятью.