Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 85
Текст из файла (страница 85)
Важно понимать разницу между получением ссылки (или удержанием) и блокировкой. Блокировка обьекта защищает его от доступа определенным образом, зависящим от того, является ли блокировка эксклюзивной или позволяющей чтение-запись. Удержание ссылки на объект дает гарантию постоянства этого объекта. Код, зависящий от файловой системы, блокирует структуру ыпоое на короткие промежутки времени, обычно равные длительности одной операции с нею. Ссылка, как правило, удерживается в течение большого временного интервала, занимаемого не несколькими операциями над цпотте, а несколькими системными вызовами. Ниже приведены примеры операций, при которых происходит запрос ссылки на чподе. 8.7.
Краткий обзор реализации 361 + Запрос ссылки на чподе (то есть инкремент счетчика ссылок) 'происходит при открытии файла. Закрытие файла приводит к освобождению ссылки (или декременту счетчика). + Процесс удерживает ссылку на текущий рабочий каталог. Если процесс изменяет свой рабочий каталог, то он запрашивает на новый каталог ссылку и освобождает ссылку на предыдущий. + При монтировании новой файловой системы запрашивается ссылка на каталог, являющийся точкой монтирования.
Освобождение такой ссылки происходит при размонтировании системы. + Процедуры преобразования полных имен запрашивают ссылки на каждый промежуточный каталог, с которым они сталкиваются. Удержание ссылки происходит в течение поиска каталога, освобождение — после получения ссылки на следующий компонент полного имени. Счетчики ссылок гарантируют постоянство чпоое, а также файла, с которым эта структура была ассоциирована. Если один процесс удаляет файл, открытый другим процессом (или тем же процессом дважды), то такой файл не удалится с диска физически.
Будет удален элемент каталога для такого файла, что не даст возможности другим процессам открывать его. Файл же продолжает при этом существовать до тех пор, пока счетчик его структуры члоде не станет равным нулю. Процесс, обладающий в текущий момент этим открытым файлом, будет иметь доступ к нему до того момента, пока сам не закроет файл. Такой подход эквивалентен маркировке файла для удаления.
После освобождения последней ссылки независимый от файловой системы код вызовет операцию НОР 1МАСПНс для завершения удаления файла. Например, для файлов ц1з или з5Ь при этом производится освобождение индексного дескриптора и блоков данных. Описанная возможность очень полезна для создания временных файлов. Приложения, такие как компиляторы, используют временные файлы для хранения результатов промежуточных фаз периода выполнения. Такие файлы должны удаляться при ненормальном завершении работы приложения.
Приложение следит за этим посредством открытия файла и последующего его немедленного отсоединения. Тогда счетчик ссылок становится равным нулю, и ядро удаляет элемент каталога. Это защищает от возможности видеть такие файлы и иметь доступ к ним другим пользователям. Пока файл открыт, счетчик, содержащийся в памяти, равен единице. Пока файл существует, приложение может производить чтение или запись в него. При закрытии файла, независимо от того, случилось ли это принудительно, либо произвольно при завершении работы, счетчик ссылок обнуляется. Тогда ядро завершает процесс удаления и освобождает блоки данных и индексный дескриптор. Многие версии 111ч'1Х поддерживают стандартную библиотечную функцию гтрй1е, создающую временный файл.
362 Глава 8, Базовые элементы и интерфейс файловой системы 8.7.5. Объект Фз 5тгцст ч15 ( эсгцст ч15 ч15 пехс;/* следующая структура чгэ в списке */ 5Сгцст чгвсрэ "ч15 ср: /* вектор операций */ 5тгцсс чпсйе *ч15 чпсйессчегещ /* структура чпайе. иснтирсванная на этой файловой систеие */ тпт чтэ гэтуре; /* индекс типа файловой систеиы */ сабйг т ч15 бата; /* закрытые данные */ йеч т ч15 свч; /* идентификатОр уетРойства */ На рис. 8.11 продемонстрированы взаимосвязи между объектами чпот1е и ч15 для ОС, содержащей две файловые системы. Вторая файловая система монтирована в каталоге /'авт корневой файловой системы. Глобальная переменная тоосч15 указывает на заголовок связанного списка всех объектов ч15.
Объект ч15 для корневой файловой системы находится в заголовке списка. Поле ч15 чпооесочетео указывает на структуру чподе, с которой было произведено связывание файловой системы. Монтируемая файловая систвма Корневая файловая система Обьвкт чпойв "вн Объект чпойв "/ивг" Упоев монтируемой файловой систвмы Рис. 8.11. Взаимосвязи мемду объектами чпобе и чтз Поле ч чувр каждой структуры чподе указывает на объект ч15, к которому он относится. Корневые объекты чпос1е каждой файловой системы имеют установленный флаг т/КИН.
Если объект чпос1е является точкой монтирования, то его поле ч ч15птоцптеопете ссылается на объект ч15 файловой системы, на которую он смонтирован. Помните о том, что корневая файловая система никуда не монтируется и не покрывается какой-либо структурой чподе. Объект ч15 (структура чЬ) соответствует файловой системе. Ядро размещает по одному объекту чЬ для каждой активной файловой системы. Структура данных ч15 имеет следующий вид: 8.8.
Обьекты, зависящие от файловой системы ЗбЗ 8.8. Объекты, зависящие от файловой системы В этом разделе вы прочтете описание объектов интерфейса чподе/чЬ, зависящих от файловой системы, а также реализации доступа к этим объектам операциями уровня, независимого от файловой системы. 8.8.1. Закрытые данные каждого файла Объект чпоое является абстрактным. Он не может существовать в изоляции, новый экземпляр чпоое всегда в контексте конкретного файла. Файловая система, к которой относится конкретный файл, предлагает собственную реализацию интерфейса абстрактного объекта чпоое. Поля данных ч ор и ч вата связывают его с зависимой от файловой системы частью кода. Поле ч вага указывает на закрытую структуру данных, хранящую информацию о файле, завися|цую от файловой системы.
Структуры данных используются по-разному в зависимости от конкретной файловой системы, к которой относится обрабатываемый файл. Например, файлы з5Ь или иЬ используют структуры индексных дескрипторов', в ХРЯ применяется гпооез и т. д. Обычное применение Взаимосвязь, обусловленная интерфейсом Рис. 8.12.
Интерфейс члене, зависящий от файловой системы Поле ч дата является непрозрачным указателем. Это означает, что участок кода, не зависящий от файловой системы, не может иметь прямого доступа к объекту, зависимому от нее. Однако зависящий от системы код вправе иметь доступ к базовому объекту чпоое и использует эту возможность. В любом случае необходим способ нахождения чаете через закрытый объект данных. Так как оба объекта всегда размещаются вместе, более эффективно скомбинировать их в одном. В реализации ссылок на уровне чпоое объект чподе ' Структуры индексных дескрипторов для этих двух файловых систем значительно отличаются друг от друга. 364 Глава 8.
Базовые элементы и интерфейс файловой системы просто-напросто является частью объекта, зависящего от файловой системы. Заметим, что описанный метод является превалирующим в существующих реализациях файловых систем. Ои подходит для поддержания отдельных структур данных чпо((е и участка кода, зависящего от файловой системы, если произвести соответствующим образом инициализацию поля ч ((аСа.
Эти взаимосвязи показаны на рис. 8.12. 8.8.2. Вектор чпобеорз Интерфейс чпо((е определяет набор операций над типовым файлом. Независимый от файловой системы код производит манипуляции с файлом, используя только эти операции. Он не может получить прямой доступ к объектам, зависящим от системы. Структура чпо()еор5, используемая для определения набора операций, описана ниже. В каждой файловой системе приведенный интерфейс реализован по-своему. Файловая система предоставляет набор функций для операций, указан- 5СгосС 5ПС !пС !ПС !пС !пС !пС ! пС !пС !пС !пС !пС !пС )пС зпС !пС !пС !пС !ПС !пС !пС !пС !пС !пС !пС !пС !пС чпозеор5 ( (*чар орел)(); (*тор с1озе)(): (*чор геас) О: (арчер нг!Се)(); (*тор !осС1)(); (*чар деСаССг)(); (*чор зеСаССг)(): (*чор ассе55)(); (*чор 1ооКор)(): (*чор сгеаСе)(): (*тор гевоче)(): (*чар 1!ПС) О; (*тор гепаае) О; (*чор аСО1г)().
(*чор гв((!г)(); (*чор геа((г)!г)(): (*чор зуа1!п5) О: (*чор геао1!ПС)(); (*чор !пасС!че)(); (*чор гн1осС)(); (*чор гиоп1ос5) О ', (*чор геа1чр)(); (*чор 9еСРа9е)(); (*чар роСраде)(); (*тор вар)(), (*иор ро11)(): 8.8. Объекты, зависящие от файловой системы 366 ных в нем. Например, в файловой системе пЬ операция УОР РсАО реализована как чтение файла с локального диска, в то время как в ХГБ эта команда производит запрос к удаленному файл-серверу для получения данных. Таким образом, каждая файловая система поддерживает собственный экземпляр структуры чподеор5. Например, в системе ОЬ определен объект 55ГОст чпосеор5 И5 чпопеор5 = ( О15 Преп; ОГ5 с)05е; Поле ч ор структуры чподе указывает на структуру чподеорз для типа файловой системы, ассоциированной с файлом.
Как показано на рис. 8.13, все файлы одной файловой системы разделяют между собой единственный экземпляр структуры и обладают доступом к одному и тому же набору функций. Рис. 8.13. Объекты чпосе, зависящие от файловой системы 8.8.3. Зависящая от файловой системы часть уровня Фв Как и чподе, объект чЬ имеет указатели на свои закрытые данные и на вектор операций. Поле чЬ ()а1а указывает на непрозрачную структуру данных файловой системы. В отличие от чподе сам объект чЬ и его закрытая структура данных обычно размещаются отдельно. Поле чЬ ор указывает на структуру ЧЬор5, описываемую следующим образом: 55ГОст чт5ор5 ( 1пг (*чт5 $поопт)(); )пт (~чт5 Опеоопт)(): 1пй (*чт5 Грот)(); 1'пт (*И5 55аСчт5)(): )пт (*чт5 5упс)(): 366 Глава 8.
Базовые элементы и интерфейс файловой системы Каждый тип файловой системы имеет собственную реализацию перечисленных функций. Таким образом, используется один экземпляр структуры ч1яоря для каждого типа файловой системы: п1я ч1яоря для и1я, пЬ чйоря для ХРВ и т. д. На рис. 8.14 показаны структуры данных уровня чЬ для системы, содержащей две файловые системы п)я и одну ХРВ. Структура чтяоря Рис. 8.1 4. Пример структур данных уровня Фв 8.9. Монтирование файловой системы Разработчики интерфейса ч)я изменили системный вызов Гпопп1 для поддержки существования нескольких файловых систем одновременно.