большая часть отведенного пространства пустует. Альтернативный подход – когда поле записи, содержащее имя файла име-
ют переменную длину. В этом случае первое поле записи каталога хранит длину записи либо имени файла, далее следуют
поля фиксированной длины с атрибутами файла, далее – имя файла, выровненное на границу слова. Недостаток такого под-
хода – при удалении файла остается свободная область переменной длины, в которую далеко не всегда можно поместить
новую запись каталога, т.е. каталог фрагментируется. Еще один недостаток – запись может занимать несколько страниц па-
мяти. При чтении такой записи нужной страницы может не оказаться в памяти. Еще один вариант реализации длинных имен
– сделать записи каталога одинаковой длины, и хранить в нем не имя файла, а указатель на него, сами имена же хранить в
куче. В этом случае фрагментация каталога отсутствует, но будет фрагментироваться память в куче. Все рассмотренные
схемы предусматривают при поиске файла просмотр каталога линейно сверху вниз. Для очень больших каталогов такой по-
иск требует много времени. Часто для поиска используют хэш-таблицы для каждого каталога. В зависимости от имени фай-
ла ему присваивается некоторый номер из диапазона 0 - N-1, где N – длина хэш-таблицы. При добавлении файла, если эле-
мент хэш-таблицы с данным номером свободен, туда помещается указатель на запись каталога для данного файла, если же
элемент занят, то создается связный список, объединяющий все записи каталога с данным хэш-кодом. аналогично выполня-
ется поиск: вычисляется хэш, и просматривается список, соответствующий ему.
Совместно используемые файлы. Часто удобно, чтобы один и тот же физический файл содержался в разных каталогах. В
этом случае между каталогом и совместно используемым файлом устанавливается связь. Сама файловая система представ-
ляет теперь не дерево, а ориентированный ациклический граф. Такая схема создает новые проблемы. Если в каталоге содер-
жать указатели на блоки файла, то при изменении файла из одного каталога, соответствующая ему запись другого каталога
не будет содержать измененной цепочки блоков. Первый вариант решения – содержать указатели на блоки файла в особой
структуре, а в каталоге содержать только ссылку на эту структуру. В этом случае даже при перемещении файла (но не i-узла)
все связи останутся действующими. Второй вариант – при создании связи, во втором каталоге создается новый файл типа
связь (link). Он просто содержит путь к файлу, с которым он связан. Это называется символьным связыванием. Дополни-
тельное преимущество символьных связей – в том, что их можно использовать для ссылок на файлы, расположенные на уда-
ленных машинах. Оба способа имеют проблемы. В первом случае, если файл существует в нескольких каталогах, то при уда-
лении его из одного каталога, ОС не может найти все связи, поэтому может только удалить запись в одном каталоге, оставив
и сам файл и записи других каталогов, ему соответствующих, уменьшая счетчик связей. При символьном связывании такой
проблемы не возникает. Однако при этом увеличивается время поиска – поскольку сначала находится лишь файл связи, а
затем, взяв из него правильный путь, ищется собственно файл. Кроме того, при перемещении файла ссылка становится нере-
левантной, т.е. связь теряется.
При разработке файловой системы важным показателем является размер блока. Чем он больше, тем выше скорость чтения-
записи файла, но тем ниже эффективность использования дискового пространства. Учет свободных блоков может произво-
диться двумя разными способами – либо связный список свободных блоков, либо битовая карта, в которой один бит соот-
ветствует одному блоку диска.
Для качественной работы ФС требуется вести учет свободных блоков. Используются два подхода, как и в случае учета сво-
бодных блоков памяти – битовый вектор и связный список. Первый вариант эффективен, если битовая карта помещается в
памяти целиком. Например, для диска 40 Гб и блоке в 512 б размер битового вектора составляет 10 Мб. Связный список не
эффективен, если требуется получить адреса нескольких свободных блоков, поскольку это ведет к увеличению обращений к
диску при поиске блоков. Используют и модифицированный вариант связного списка. В этом случае в первом свободном
блоке хранятся адреса N-свободных блоков. N-1 из них действительно являются свободными, а последний адрес указывает
на следующий блок с адресами свободных блоков.
Монтирование. Файловая система, хранящаяся на разделе диска, должна быть связана с существующей иерархией файловых
систем, чтобы стать доступной процессам системы. Mount, umount. В общем случае, в Windows монтирование происходит
автоматически, раздел подключается на корневом уровне, и ему присваивается определенная буква, являющаяся начальным
путем. ФС UNIX организована иначе. На корневом уровне находится ряд каталогов – usr, bin, home, dev и т.д. Файловый сис-
темы монтируются в каталог mnt.
Непротиворечивость файловой системы. Этот вопрос относится к проблеме непротиворечивости ФС. ФС обычно читают
блоки данных, изменяют их и записывают обратно. Если в системе произойдет сбой прежде, чем все измененные блоки бу-
дут записаны на диск, ФС может оказаться в противоречивом состоянии. Это особенно важно, если таким измененным и не
сохраненным блоком оказывается блок i-узла, каталога или списка свободных блоков. Всоставе ОС имеется специальная
утилита, проверяющая ФС на непротиворечивость. В UNIX это fsck, в Windows – scandisk. Fsck работает следующим обра-
зом. Для проверки непротиворечивости блоков создается две таблицы, каждая из которых содержит счетчик для каждого из
блоков, изначально нулевые. Счетчики первой таблицы учитывают, сколько раз каждый блок присутствует в файлах. Во
второй – сколько раз блок учитывается в списке свободных блоков. Считываются все i-узлы. При считывании каждого номе-
ра блока соответствующий счетчик увеличивается на 1. Далее анализируется список свободных блоков, при считывании но-
мера блока увеличивается соответствующий счетчик во второй таблице. Если ФС непротиворечива, то каждый блок будет
встречаться только один раз, либо в первой, либо во второй таблице. В случае. если для какого-то блока содержится 0 в обе-
их таблицах, это говорит о недостающем блоке. Ошибка корректируется добавлением этого блока в список свободных. Если
какой-то блок появляется многократно в списке свободных блоков, проблема также легко решается. Хуже, если один и тот
же блок окажется в разных файлах. При удалении любого из этих файлов, блок будет перемещен в список свободных, оста-
ваясь в тоже время используемым в остальных файлах. В этом случае такой блок копируется нужное количество раз в сво-
бодные, и блок заменяется на них в этих файлах. Проверяется и структура каталогов. Используется таблица счетчиков, но не
для блоков, а для файлов. Проверка идет рекурсивно начиная с корневого каталога. Символьная связь счетчик не изменяет. В
результате сканирования образуется список, с информацией, в скольких каталогах содержится тот или иной файл. Эти числа
сравниваются с действительным числом использований, хранящимся в i-узле. В непротиворечивой ФС счетчики совпадают.