Структура фс базовых unix-подобных ос
· Классический вариант: S5FS
Суперблок | Массив индексных дескрипторов ilist | Блоки хранения данных |
В суперблоке хранятся:
stype – тип ФС
s_fsize – размер ФС
s_isize – размер массива индексных дескрипторов
s_tfree – число свободных блоков
s_tinode – число свободных индекс блоков Inode
s_fmod – флаги модификации
s_fronly – флаг режима
размер логического блока
размер в логических блоках (512, 1024, …)
список используемых/свободных inode
список адресов свободных блоков
Inode (индексные дескрипторы) – метаданные файла. Хранят информацию о файле, необходимую для обработки данных.
Массив индексных дескрипторов – содержит информацию о файле необходимую для обработки (при открытии файла ядро переписывает структуру данных в ОЗУ и размещает в таблице in_core inode (в ОЗУ)) dinode -> in_core inode (в ОЗУ)
Структура dinode: включает тип файла, доп атрибуты
di_mode – тип файла, доп атрибуты
di_nlinks – число ссылок на файл
di_uid, di_gid – id пользователя и группы
di_size – размер файла в байтах
di_atime, di_ctime – время последнего доступа/модификации
di_mtime – время последней модификации/доступа
di_addr[13] - адрес
di_inod – указатель наличия флага SUID. Чтобы прочитать файл др. польз-ля, не имея права чтения.
IFREG, IFDIR, IFBLK/IFCHR – константы, с помощью которых задаётся тип файла.
di_addr[13] – массив адресов дисковых блоков хранящихся данных.
di_addr[0] - di_addr[9] – непосредственная адресация по номеру блока (10 блоков)
di_addr[10] – косвенная адресация – указатель на блок (блок блоков)
di_addr[11] – двукратная косвенная адресация и т.д.
· Система FFS = ufs
Суперблок | Массив свободных блоков и inode | ilist | Блоки хранения данных | Суперблок | … |
Отличия от S5FS: предусмотрено логическое деление дискового разделения на 1 или несколько групп цилиндров (последовательно расположенных цилиндров).
На группу цилиндров отводится фиксированное число inode. Управляющая информация размешается с различным смещением от начала групп цилиндров (на одной пластине информация о всех группах). Смещение = один сектор относительно предыдущей группы. Для соседних групп информация размещается на различных пластинах диска. Это повышение надежности т.к. потеря одного сектора, цилиндра или пластины не приводит к потере всех копий суперблока.
Производительность ФС зависит от:
- размеров блока информации
- алгоритмов размещения свободных блоков на носителях и inode
Чем больше блок, тем лучше для производительности (меньше обращений к диску), но при этом нерациональное использование дискового пространства (нужна постоянная дефрагментация). Существуют алгоритмы, использующие вес блока или его части (дефрагментация).
Max размер фрагмента – 0,5 размера блока. Min – min единица адресации диска (= сектор)
Алгоритмы размешения зависят от ФС. Правила выбора алгоритма для повышения производительности:
- файл размещается в блоках хранения данных, принадлежащих одной группе цилиндров там, где его метаданные (это снижает tобращения);
- все файлы каталога находятся в одной группе цилиндров (это повышает vпослед. доступа);
- следующий подкаталог находится в группе цилиндров, отличной от родительского каталога (для равномерного распределения по диску);
- последующие блоки размещаются исходя из оптимизации физического доступа к диску (с некоторым смещением друг относительно друга в зависимости от скорости перемещения головки винчестера).
КПД ФС нормальное функционирование при > 10 % свободного места на диске
Запись каталога – структура данных.
Структура каталога:
d_ino - номер inode (индекс в массиве ilist)
d_reclen - длина записи
d_namlen - длина имени
d_name[] - имя файла
Здесь имя файла дополняется нулями до четырёх байтов. При удалении имени запись не удаляется, а присоединяется к предыдущей записи. В предыдущей записи меняется reclen (на длину удаляемого файла). Удаление первой записи (d_ino = NULL) -> не ограничивается длина имени.