Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 87
Текст из файла (страница 87)
Кэш производит быстрое установление местонахождения элементов путем объединения их в хэш-таблице, основываясь на имени текущего файла и каталога. Если файловая система применяет кэш подстановки имен, то функция 1оо1пр (реализующая операцию УОР (ООКОР) станет при поиске нужного имени файла сначала просматривать кэш. Если такой файл будет обнаружен в нем, функция просто увеличит счетчик ссылок на его объекте чподе и завершит выполнение.
Такой полход лает возможность найти объект без полномасштабного поиска в каталогах, не производя операции чтения с диска. Применение кэша является удобным, так как многие разработчики программ чаще всего производят одни и те же запросы по отношению к одним и тем же файлам и каталогам. Если компонент не будет найден в каше, функция продолжит поиск в каталогах диска. После обнаружения компонента на диске функция добавит его в кэш для дальнейшего использования.
Поскольку файловая система может получить поступ к чпопе не только при просмотре каталогов, то некоторые из ее действий способны привести к тому, что данные элемента каша станут неверными. Например, пользователь может отсоединить файл, а ядро, в свою очередь, передать его чпойе новому файлу. Если затем произвести поиск старого файла, результатом станет запрос неверного элемента каша и получение указателя на чпойе совершенно другого объекта.
Таким образом, становится очевидным, что кэш имен должен обладать некоей методикой проверки правильности вхождений. Кэш подстановки имен реализован как в системе 4.ЗВЯКА, так и в ОС ЪКР4, однако в каждой из них применяются различные средства решения описанной проблемы, В системе 4.ЗВЯКА не используется интерфейс чподе/ч1ж Кэш просмотра каталогов хранится в индексном дескрипторе файла, находящемся в памяти.
Каждый индексный дескриптор представляет собой сгенерированный номер, также называемый характеристикой (сара)ийгу), увеличивающийся каждый 8.10. Операции над файлами 371 раз при назначении дескриптора новому файлу. Кэш основан иа рекомеидациях. При попытке добавления в него файловая система производит копирование генерируемого номера индексного дескриптора файла в этот элемент.
Функция обработки каша сверяет полученный номер с текущим сгенерированным номером индексного дескриптора. Если оии ие совпадают, это означает, что данный элемент каша является неверным. В системе ЯЪ'24 каждый элемент каша удерживает ссылку иа члене кэшируемого файла и освобождает ее, если запись исключается или переиазиачается. Хотя описанный метод и дает гарантию правильности соответствия записей каша, ои обладает некоторыми недостатками. К примеру, ядро должно поддерживать некоторые неактивные объекты чпобе только потому, что существуют элементы каша, обладающие ссылками иа иих. Применяемый метод также защищает другие компоиеиты ядра от получения эксклюзивного права иа использование файла или устройства.
8.10.3. Операция ЧОР ~.ООКОР Операция ЧОР ~ООКОР представляет собой интерфейс доступа к специфичной для файловой системы функции поиска компонента имени файла в каталоге. Функция вызывается при помощи макроса, подобного приведенному ниже. еггог = ЧОР ~ООКОР (~р. соарпаае. 8тчр, ,. Л; где чр — указатель иа родительский каталог чаевое, сошрпаше — компонент имени. В случае удачного завершения переменная ~чр должна указывать иа объект чреде компонента сошрпаще, а его счетчик ссылок окажется увеличеииым иа единицу. Как и другие операции интерфейса чпобе/чгз, применение ЧОР ~ООКОР приведет к вызову функции 1оо1ир, специфичиой для используемой файловой системы.
Функция поиска обычно начинает просмотр с каша имен. Если она находит необходимое вхождение, то следующим шагом увеличивает зиачение счетчика ссылок и возвращает указатель иа чподе искомого компонента. Если в кэше иет данных об объекте поиска, функция продолжит просмотр в родительском каталоге. Локальные файловые системы производят такой поиск путем просмотра элементов каталогов в цикле блок за блоком. В распределенных файловых системах запрос иа поиск посылается серверному узлу.
Если каталог содержит искомый компонент, функция поиска проверит, не находится ли его объект чреде уже в памяти. В каждой файловой системе применяется собственный метод отслеживания объектов, расположенных в памяти. Например, в пЬ результатом поиска каталога станет номер индексного дескриптора, который в дальнейшем используется системой как индекс в таблице хэшироваиия, по которому и ведется поиск индексного дескриптора. Дескриптор, хранящийся в памяти, содержит в себе члене. Если функция поиска обнаруживает объект члене в памяти, то следующим шагом оиа производит иикремеит его счетчика ссылок и возвращает его вызвавшему процессу.
372 Глава 8. Базовые элементы и интерфейс файловой системы Часто возникает ситуация, когда процедура поиска находит соответствие компоненту, ио его объект чпойе ие находится в памяти. В этом случае оиа должна запросить и проииициализировать чпог)е, точно так же, как и закрытую, зависящую от файловой системы структуру данных. Обычно чпобе является частью такой структуры, следовательно, происходит размещение обоих элементов в едином блоке. Оба объекта инициализируются путем чтения атрибутов файла. Функция устанавливает поле ч ор структуры чпобе в значение, указывающее иа вектор чподеорз для данной файловой системы, после чего на чпобе запрашивается ссылка. Последним действием процедуры поиска является добавление нового вхождения в кэш просмотра каталогов и помещение его в конец списка 1К(Т кеша. 8.10.4.
Открытие файла В список входных аргументов вызова ореп входят полное имя, набор флагов и привилегий, устанавливаемых для файла, если его необходимо создать. Набор флагов включает в себя О РЕАО, О ТТРПЕ, О АРРЕМО, О ТРОМС (обрезать до нулевой длины), О СРЕАТ (создать новый файл, если таковой ие существует) и О ЕХС1 (используется совместно с О СРЕАТ для возврата ошибки, если файл с таким именем уже существует). Реализация вызова орел почти полностью находится ва уровне, независимом от файловой системы. Алгоритм функции приведен ниже. 1. Запрос файлового дескриптора (см.
раздел 8.2.3). Если выполнение функции ореп завершается успешно, ее выходным аргументом является индекс, идентифицирующий дескриптор в списке блоков. 2. Запрос объекта открытого файла (зтшст М!е) и сохранение указателя ва него в дескрипторе файла. В системе 8ЧК4 размещение таких объектов происходит динамически. В более ранних реализациях для этой цели используется статическая таблица фиксированного размера. 3. Вызов 1ооРцррп() для получения имени пути и возврата чпопе иа открываемый файл.
Операция 1ооРцррп0 также возвращает указатель ва чапае родительского каталога. 4. Проверка чподе (при помощи операции УОР АССЕ55) на обладание процессом, вызвавшим функцию орел, полномочиями, необходимыми для доступа к файлу в выбранном режиме. 5. Проверка и исключение неверных операций, таких как попытка открытия каталога или активного выполняемого файла иа запись (в противоположном случае пользователь, вызвавший программу, может получить неожиданные результаты).
6. Если файл ие существует, проверка, ие указан ли флаг О СРЕАТ. Если так, то исполняется УОР СРЕАТЕ по отношению к родительскому каталогу для создания файла. В противном случае выполнение завершается с кодом ошибки ЕМОЕМТ. 8.! О. Операции над файлами 373 7. Вызов ЧОР ОРЕМ по отношению к объекту чпог)е для проведения действий, зависящих от файловой системы. Обычно такая процедура не делает ничего, но в некоторых системах именно на этой стадии необходимо производить дополнительные действия. Например, в файловой системе зрес/з, обрабатывающей все файлы устройств, иногда необходимо вызвать процедуру ореп определенного драйвера устройства.
В. Если указана опция 0 ТВОМС, вызывается ЧОР 5ЕТАТТВ для установки размера файла, равного нулю. Необходимую очистку, например освобождение блоков данных файла, производит код, зависящий от конкретной файловой системы. 9. Инициализация объекта открытого файла. Сохранение в нем указателя на чпог)е и флага режима открытия файла. Установка его счетчика ссылок в значение «единица», а указателя смещения — в нулевую позицию. 10.
Возврат индекса дескриптора файла пользователю. Помните о том, что операция 1ооМвррпО производит инкремент счетчика ссылок чпос1е и инициализирует его указатель ч ор. Это гарантирует последующим системным вызовам получение доступа к файлу при помощи его дескриптора (так как объект чподе остается в памяти), а также выполнение нужных функций, зависящих от файловой системы. 8.10.5. Файловый ввод-вывод Для того чтобы произвести операции ввода-вывода с файлом, пользователь предварительно должен его открыть и только после этого вызывать функции гезд или гчпсе (геадч или чгп1еа для ввода-вывода сборкой-разъединением) по отношению к дескриптору, возвращенному ореп. Независимый от файловой системы код помещает параметры вызова в структуру шо, как зто описывалась в разделе В.2,5. В случае применения вызовов геаг) или гчпсе структура шо будет указывать на массив )очес[~, состоящий из одного элемента.
Ядро использует дескриптор файла для обнаружения объекта открытого файла н проверки на то, что данный файл был открыт в нужном режиме доступа. Если режим окажется правильным, ядро отложит указатель чпог)е объекта открытого файла для обнаружения чпог)е. В системе 1))Ч1Х вызовы, осуществляющие ввод-вывод, должны выполняться последовательно. Если два пользователя одновременно вызывают геад или чгг11е по отношению к одному и тому же файлу, ядро прежде завершает одну операцию и только затем начинает выполнение второй.