Чтение онлайн

ЖАНРЫ

Архитектура операционной системы UNIX
Шрифт:

считать следующую компоненту имени пути поиска;

проверить соответствие рабочего индекса каталогу и права доступа;

if (рабочий индекс соответствует корню и компонента имени «..»)
 continue; /* цикл с условием продолжения */

поиск компоненты:

считать каталог (рабочий индекс), повторяя алгоритмы bmap, bread и brelse;

if (компонента соответствует записи в каталоге (рабочем индексе)) 
{

получить номер индекса для совпавшей компоненты;

if (найденный индекс является индексом корня и рабочий индекс является индексом корня и имя компоненты «..») 
{

/*
пересечение точки монтирования */

получить запись в таблице монтирования для рабочего индекса;

освободить рабочий индекс (алгоритм iput);

рабочий индекс = индексу точки монтирования;

заблокировать индекс точки монтирования;

увеличить значение счетчика ссылок на рабочий индекс;

перейти к поиску компоненты (для «..»);

}

освободить рабочий индекс (алгоритм iput);

рабочий индекс = индексу с новым номером (алгоритм iget);

}

else /* компонента отсутствует в каталоге */
 return (нет индекса);

 }

 return (рабочий индекс);

}

Рисунок 5.26. Модификация алгоритма синтаксического анализа имени файла

В вышеприведенном примере (cd «../../..») предполагается, что в начале процесс имеет текущий каталог с именем «/usr/src/uts». Когда имя пути поиска подвергается анализу в алгоритме namei, начальным рабочим индексом является индекс текущего каталога. Ядро меняет текущий рабочий индекс на индекс каталога с именем «/usr/src» в результате расшифровки первой компоненты «..» в имени пути поиска. Затем ядро анализирует вторую компоненту «..» в имени пути поиска, находит корневой индекс смонтированной (перед этим) файловой системы — индекс каталога «usr» — и делает его рабочим индексом при анализе имени с помощью алгоритма namei. Наконец, оно расшифровывает третью компоненту «..» в имени пути поиска. Ядро обнаруживает, что номер индекса для «..» совпадает с номером корневого индекса, рабочим индексом является корневой индекс, а «..» является текущей компонентой имени пути поиска. Ядро находит запись в таблице монтирования, соответствующую точке монтирования «usr», освобождает текущий рабочий индекс (корень файловой системы, смонтированной в каталоге «usr») и назначает индекс точки монтирования (каталога «usr» в корневой файловой системе) в качестве нового рабочего индекса. Затем оно просматривает записи в каталоге точки монтирования «/usr» в поисках имени «..» и находит номер индекса для корня файловой системы («/»). После этого системная функция chdir завершается как обычно, вызывающий процесс не обращает внимания на тот факт, что он пересек точку монтирования.

5.14.2 Демонтирование файловой системы

Синтаксис вызова системной функции umount:

umount(special filename);

где special filename указывает демонтируемую файловую систему. При демонтировании файловой системы (Рисунок 5.27) ядро обращается к индексу демонтируемого устройства, восстанавливает номер устройства для специального файла, освобождает индекс (алгоритм iput) и находит в таблице монтирования запись с номером устройства, равным номеру устройства для специального файла. Прежде чем ядро действительно демонтирует файловую систему, оно должно удостовериться в том, что в системе не осталось используемых файлов, для этого ядро просматривает таблицу индексов в поисках всех файлов, чей номер устройства совпадает с номером демонтируемой системы. Активным файлам соответствует положительное значение счетчика ссылок и в их число входят текущий каталог процесса, файлы с разделяемым текстом, которые исполняются в текущий момент (глава 7), и открытые когда-то файлы, которые потом не были закрыты. Если какие-нибудь файлы из файловой системы активны, функция umount завершается неудачно: если бы она прошла успешно, активные файлы сделались бы недоступными.

Буферный пул все еще содержит блоки с «отложенной записью», не переписанные на диск, поэтому ядро «вымывает» их из буферного пула. Ядро удаляет записи с разделяемым текстом, которые находятся в таблице областей, но не являются действующими (подробности в главе 7), записывает на диск все недавно скорректированные суперблоки

и корректирует дисковые копии всех индексов, которые требуют этого. Казалось, было бы достаточно откорректировать дисковые блоки, суперблок и индексы только для демонтируемой файловой системы, однако в целях сохранения преемственности изменений ядро выполняет аналогичные действия для всей системы в целом. Затем ядро освобождает корневой индекс монтированной файловой системы, удерживаемый с момента первого обращения к нему во время выполнения функции mount, и запускает из драйвера процедуру закрытия устройства, содержащего файловую систему. Впоследствии ядро просматривает буферы в буферном кеше и делает недействительными те из них, в которых находятся блоки демонтируемой файловой системы; в хранении информации из этих блоков в кеше больше нет необходимости. Делая буферы недействительными, ядро вставляет их в начало списка свободных буферов, в то время как блоки с актуальной информацией остаются в буферном кеше. Ядро сбрасывает в индексе системы, где производилось монтирование, флаг «точки монтирования», установленный функцией mount, и освобождает индекс. Пометив запись в таблице монтирования свободной для общего использования, функция umount завершает работу.

алгоритм umount

входная информация: имя специального файла, соответствующего демонтируемой файловой системе

выходная информация: отсутствует

{

 if (пользователь не является суперпользователем)
 return (ошибку);

 получить индекс специального файла (алгоритм namei);

 извлечь старший и младший номера демонтируемого устройства;

 получить в таблице монтирования запись для демонтируемой системы, исходя из старшего и младшего номеров;

 освободить индекс специального файла (алгоритм iput);

 удалить из таблицы областей записи с разделяемым текстом для файлов, принадлежащих файловой системе;

 /* глава 7ххх */

 скорректировать суперблок, индексы, выгрузить буферы на диск;

 if (какие-то файлы из файловой системы все еще используются) return (ошибку);

 получить из таблицы монтирования корневой индекс монтированной файловой системы;

 заблокировать индекс;

 освободить индекс (алгоритм iput);

 /* iget был при монтировании */

 запустить процедуру закрытия для специального устройства;

 сделать недействительными (отменить) в пуле буферы из демонтируемой файловой системы;

 получить из таблицы монтирования индекс точки монтирования;

 заблокировать индекс;

 очистить флаг, помечающий индекс как «точку монтирования»;

 освободить индекс (алгоритм iput);

 /* iget был при монтировании */

 освободить буфер, используемый под суперблок;

 освободить в таблице монтирования место, занятое ранее;

}

Рисунок 5.27. Алгоритм демонтирования файловой системы

Рисунок 5.28. Файлы в дереве файловой системы, связанные с помощью функции link

5.15 LINК

Системная функция link связывает файл с новым именем в структуре каталогов файловой системы, создавая для существующего индекса новую запись в каталоге. Синтаксис вызова функции link:

link(source file name, target file name);

где source file name — существующее имя файла, а target file name — новое (дополнительное) имя, присваиваемое файлу после выполнения функции link. Файловая система хранит имя пути поиска для каждой связи, имеющейся у файла, и процессы могут обращаться к файлу по любому из этих имен. Ядро не знает, какое из имен файла является его подлинным именем, поэтому имя файла специально не обрабатывается. Например, после выполнения набора функций:

Поделиться с друзьями: