Unix Man (Справочное руководство)


FS(4) - часть 3


Список свободного пространства для каждого тома устроен следующим образом. Массив s_free содержит до 50 номеров свободных блоков s_free [0], ..., s_free [s_nfree - 1]. Блок с номером s_free [0] является следующим элементом списка свободного пространства. Нулевое слово (длинное целое) в этом блоке содержит количество (до 50) номеров свободных блоков, указанных в последующих 50 словах, причем первое слово одновременно служит ссылкой на следующий элемент списка свободного пространства с аналогичной структурой. Иными словами, каждый элемент списка свободного пространства располагается в начале свободного блока и устроен так же, как пара полей s_nfree и s_free, играющая роль заголовка списка.

Чтобы занять свободный блок, надо уменьшить значение s_nfree и выделить блок с номером s_free [s_nfree]. Если номер выделенного блока равен 0, это означает, что на томе нет свободных блоков, то есть имеет место ошибка. Если значение s_nfree стало нулевым, нужно прочитать выделенный блок, поместить его нулевое слово в поле s_nfree, а последующие 50 слов - в массив s_free.

При освобождении блока, если значение s_nfree равно 50, следует скопировать пару полей s_nfree и s_free в начало этого блока, записать блок и установить s_nfree равным 0. В любом случае, номер освобождаемого блока помещается в элемент массива s_free [s_nfree], после чего поле s_nfree увеличивается на 1.

Поле s_tfree хранит общее количество свободных блоков, доступных файловой системе.

Поле s_ninode хранит количество номеров свободных описателей файлов в массиве s_inode. Чтобы занять свободный описатель файла в случае, когда s_ninode больше 0, это поле следует уменьшить на 1 и выделить описатель с номером s_inode [s_ninode]. Если же значение s_ninode равно 0, нужно перебрать описатели файлов и номера свободных (не более 100) поместить в массив s_inode, после чего снова попытаться выделить описатель.

При освобождении описателя, если значение s_ninode меньше 100, номер описателя следует поместить в элемент массива s_inode [s_ninode] и увеличить поле s_ninode на 1. Если же значение s_ninode равно 100, не стоит заботиться о регистрации факта освобождения. Дело в том, что таблица номеров свободных описателей предназначена только для ускорения их поиска; В самом описателе есть признак, свободен он или занят.




Начало  Назад  Вперед



Книжный магазин