Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 93
Текст из файла (страница 93)
Например, если пользователь укажет адрес ядра, то ядро системы «затрет» собственные коды или структуры данных. Операция з5геааО заканчивает работу после прочтения всех данных либо при возникновении ошибки. После этого независимый от файловой системы код освобождает объект чпог)е (при помокни ЧОР й)ЧОГтьОСК), увеличивает значение указателя смешения в структуре Ейе на количество прочитанных байтов и завершает свое выполнение.
Возвращаемой переменной функции гезу является общее количество прочитанных байтов. Обычно эта переменная равна запрошенному количеству байтов, кроме случаев достижения конца файла или возникновения ошибки при чтении. Системный вызов тчп1е функционирует сходным образом с несколькими отличиями. Измененные блоки не записываются на диск сразу же. Они хранятся в памяти и переписываются из кэша позже, в зависимости от его эвристических способностей.
Кроме этого, вызов тчпте может увеличивать размер файла, что требует выделения новых дисковых блоков, а иногда и блоков косвенной связи для хранения дисковых адресов. Если запись данных производится только во фрагмент блока, ядру все равно необходимо считать блок с диска целиком, изменить его участок и затем перезаписать блок обратно на диск. 9.3.4. Запрос и возврат индексных дескрипторов Индексный дескриптор остается активным до тех пор, пока его счетчик не станет равным нулю.
В атом случае независимый от файловой системы код обратится к операции ЧОР 1МАСТ1ЧЕ, которая освободит индексный дескриптор. В ЯЧтт2 свободные дескрипторы помечались как недействующие, таким 396 Глава 9. Реализации файловых систем образом, они могли быть заново прочитаны с диска при необходимости. Этот подход недостаточно эффективен, из-за чего в более поздних версиях Шч1Х дескрипторы пртшято по возможности кэшировать. Если дескритггор становится неактивным, ядро помешает его в список свободных дескрипторов, но оставляет его действующим. Существует возможность найти этот дескриптор при помощи функции 19ег(), так как он хранится в корректной таблице хэширования до тех пор, пока не будет использован заново.
В каждой файловой системе имеется таблица ицдексных дескрипторов фиксированного размера, ограничивающая общее количество активных дескрипторов в ядре. В эЪ'ттЗ механизм кэширования дескрипторов использует алгоритм замены последнего, недавно использовавшегося элемента. Ядро освобождает дескрипторы, размещенные в конце списка, и размещает другие, взятые из его начала. Такая схема является стандартной методикой работы каша и оптимальным решением для каша дескрипторов из-за того, что именно неактивные дескрипторы используются чаше всего. Если файл часто используется, то его индексный дескриптор является прикрепленным (р(ппег() к таблице.
При доступе к файлу происходит кэширование его страниц в памяти. После того как файл становится неактивным, вероятно нахождение некоторых его страниц в памяти. Такие страницы могут быть обнаружены через список страниц объекта упот)е (с использованием поля у райе структуры). Система управления страницами производит хэшировапие также на основе указателя на чпот1е и смешения страницы в файле.
Когда ядро использует индексный дескриптор заново, его предыдущие страницы могут уже не быть идентичными данным файла. Если процессу нужна страница, сформированная из данных этого файла, ядру необходимо будет прочесть се с диска заново, даже в том случае, если страница уже находится в памяти. ПРИМЕЧАНИЕ Говорят, что объект закреплен в памяти, если его нежелательно удалять или освобождать. Обьекты со счетчиками ссылок являются прикрепленными до тех пор, пока не освободится последняя ссылка. Процесс также может закрепить часть своего адресного пространства в памяти при помощи системного вызова пяосж В любом случае для повторного использования лучше применять дескрипторы, не имекпцие страниц, кэшированных в памяти.
При достижении счетчиком ссылок на упог1е нуля, ядро вызывает операцию НОР 11тйСТ1НЕ для освобождения уводе и его закрытого объекта данных (в рассматриваемой файловой системе — индексного дескриптора). При освобождении дескриптора ядро проверяет список страниц чпот1е. Освобожденный дескриптор помещается в начало списка, если его список страниц пуст, либо в конец списка, если какие-либо странипы файла до сих пор находятся в памяти. Если индексный дескриптор будет оставаться неактивным, система управления страницами произведет удаление страниц из памяти.
9.4. Анализ файловой системы в51в 397 В работе [31 описываются правила размещения и возврата индексных дескрипторов, позволяющие регулировать загруженность системы управлением количеством дескрипторов в памяти, Вместо применения таблицы фиксированного размера файловая система производит размещение дескрипторов динамически при помощи диспетчера памяти ядра.
Это позволяет увеличивать или уменьшать количество индексных дескрипторов в системе по мере необходимости. Системному администратору больше не нужно угадывать наиболее подходящее число дескрипторов при установке системы. Если функция 1де1() не может обнаружить дескриптор в своей таблице хэширования, то она выбирает первый дескриптор из списка. Если окажется, что он имеет страницы в памяти, функция возвратит такой дескриптор обратно в список и вызовет диспетчер памяти ядра для размещения новой структуры 1поое.
Алгоритм проверки списка свободных дескрипторов можно сделать более универсальным, если производить поиск обьектов, не обладающих странипами в памяти, однако реализация, описываемая в этом разделе, является простой, но достаточно эффективной. Ее единственным недостатком является размещение в памяти несколько большего количества дескрипторов, чем это реально требуется. Эксперименты с применением многопользовательского теста загрузки, работающего в режиме разделения времени, показали, что новый алгоритм сокращает использование системного времени (проведенного процессором в режиме ядра) с 16 до 12 Ж. Хотя описанный алгоритм был изначально реализован для з5Ь, он оказался настолько универсальным, что был взят на вооружение и в других файловых системах, в том числе и в ГГБ. 9.4.
Анализ файловой системы абаев Файловая система з5Ь отличается простотой дизайна. Однако это свойство создает определенные проблемы, связанные с надежностью, производительностью и функциональностью. В этом разделе мы обсудим некоторые отрицательные стороны з5Ь, которые стали причиной разработки новой быстрой файловой системы в ВЯР, Основным камнем преткновения в отношении надежности з5Ь является суперблок. Он содержит важнейшую информацию обо всей файловой системе, в том числе список свободных блоков и информацию о размере списка свободных индексных дескрипторов. В каждой файловой системе имеется только одна копия суперблока.
Если она окажется поврежденной, вся файловая система станет непригодной к использованию. На производительность работы файловой системы негативно влияют сразу же несколько вещей. В з5Ь все индексные дескрипторы группируются в начале файловой системы, остальная часть диска обычно занимается блоками данных файлов. Операция доступа к файлу включает в себя чтение его 398 Глава 9. Реализации файловых систем дескриптора и данных, поэтому такое разделение приводит к длительной задержке при проведении поиска информации на диске, что увеличивает общее время ввода-вывода. Дескрипторы располагаются на диске в произвольном порядке.
Система никак не группирует связанные между собой дескрипторы, например относящиеся к файлам одного каталога. Следовательно, вызов операций, производящих доступ ко всем файлам в каталоге (например, 1з-1) приводит к необходимости чтения блоков из произвольных мест диска. Размещение блоков на диске также не является оптимальным. При создании новой файловой системы (с использованием программы шктз) производится оптимальная настройка расположения блоков на диске в порядке последовательного размещения.
Однако по мере создания и удаления файлов новые блоки помещаются в список уже в произвольном порядке. После некоторого периода использования файловой системы порядок расположения блоков на диске становится абсолютно произвольным. Это уменьшает скорость доступа к файлам, так как логически смежные блоки могут физически находиться далеко друг от друга. Еще одним немаловажным фактором, влияющим на производительность системы, является размер дискового блока. В ВЪ'гс2 использовались блоки размером в 512 байт, в 5ЧВЗ их длина была увеличена до 1024 байт. Увеличение размера блока позволяет считывать больший объем данных при каждой операции доступа к диску, что увеличивает производительность.
В то же время это нарагцивает потери дискового пространства, так как в каждом файле не используется примерно около половины размера блока. Перечисленные проблемы показывают необходимость существования более гибкого механизма предоставления дискового пространства для размещения файлов. Файловая система збгз имеет важные функциональные ограничения. Короткие имена файлов до 14 символов не беспокоили пользователей ранних вариантов (3)ч)1Х, однако для мощных коммерческих систем такое условие является абсолютно неприемлемым.
Некоторые приложения создают имена файлов автоматически, добавляя часто при этом определенные расширения к уже существующим файлам. При использовании всего 14 символов сложно добиться какой-либо степени эффективности. Максимальное число индексных дескрипторов на одну файловую систему в з5(з равняется 65 535, что также ограничивает функциональность системы.