Компоненты файловой системы
Файлы относятся к абстрактному механизму. Они предоставляют способ сохранять информацию на диске и считывать ее снова позднее. При этом от пользователя должны скрываться такие подробности, как способ и место хранения информации, а также детали работы дисков.
Вероятно, наиболее важной характеристикой любого абстрактного механизма является то, как именуются управляемые объекты, поэтому мы начнем изучение файловой системы с именования файлов. При создании файла процесс дает файлу имя. Когда процесс завершает работу, файл продолжает свое существование, и по его имени к нему могут получить доступ другие процессы.
Многие операционные системы поддерживают различные типы файлов. Например, в системах UNIX и Windows проводится различие между обычными файлами и каталогами. В системе UNIX также различаются символьные и блочные специальные файлы. К обычным (regular) файлам относятся все файлы, содержащие информацию пользователя. Все файлы на рис. 5.1 являются просто файлами. Каталоги — это системные файлы, обеспечивающие структуризацию файловой системы. Мы рассмотрим их подробнее ниже. Символьные специальные файлы имеют отношение к вводу/выводу и используются для моделирования последовательных устройств ввода/вывода, таких как терминалы, принтеры и сети. Блочные специальные файлы находят применение в моделировании дисков. В данной главе мы в первую очередь будем рассматривать стандартные файлы. Эти файлы в основном являются либо последовательностями ASCII-строк, либо двоичными наборами байтов. В некоторых системах каждая ASCII-строка завершается символом возврата каретки. В других (например, UNIX) используется символ перевода строки. Есть системы (например, MS-DOS), где используются оба символа. Строки не обязаны иметь одну и ту же длину.
Файлы позволяют сохранять информацию и получать ее позднее. В различных операционных системах имеются различные наборы файловых операций. Ниже перечислены наиболее часто встречаемые системные вызовы, имеющие отношение к файлам.
- Create (создание). Файл создается без данных.
- Delete (удаление). Когда файл уже более не нужен, его удаляют, чтобы освободить пространство на диске.
- Open (открытие). Прежде чем использовать файл, процесс должен его открыть.
- Close (закрытие). Когда все операиии с файлом закончены, атрибуты и дисковые адреса становятся не нужны, поэтому файл следует закрыть, чтобы освободить пространство во внутренней таблице системы.
- Read (чтение). Чтение данных из файла.
- Write (запись). Запись данных в файл, также в текущую позицию в файле. Если текущая позиция находится в конце файла, размер файла автоматически увеличивается. В противном случае запись производится поверх существующих данных, которые теряются навсегда.
- Append (добавление). Этот системный вызов представляет собой усеченную форму вызова write.
- Seek (позиционирование). Для файлов произвольного доступа требуется способ указать, где располагаются данные в файле.
- Get attributes (получение атрибутов). Процессам часто требуются атрибуты интересующих их файлов.
- Set attributes (установка атрибутов). Некоторые атрибуты файла могут устанавливаться пользователем после создания файла.
В файловых системах файлы обычно организуются в каталоги, которые, в свою очередь, в большинстве операционных систем также являются файлами. В данном разделе мы рассмотрим каталоги, их организацию, свойства и действия, которые могут быть выполнены над ними.
Обычно каталог содержит некоторое число записей, по одной записи на файл. Один из вариантов показан на рис. 5.3. а, где каждая запись каталога включает в себя имя файла, его атрибуты и адрес данных файла на диске. Другой вариант представлен на рис. 5.3, 6". Здесь запись каталога хранит имя файла и указатель на структуру данных с атрибутами и дисковыми адресами. Широко применяются оба этих варианта.
Рис-5.3 а — атрибуты хранятся в каталоге; б — атрибуты хранятся отдельно
Развитием этой идеи является двухуровневая иерархия, когда каждому пользователю выделяется отдельный каталог (рис. 5.4, б). Благодаря двухуровневой иерархии исчезают конфликты имен файлов между различными пользователями, но ее недостаточно для пользователей с большим числом файлов. Обычно пользователям бывает необходимо логически группировать свои файлы. Например, у профессора может быть набор файлов, образующих книгу, которую он пишет для одного курса, другое множество файлов, содержащее программы студентов для иного курса. Третий набор файлов может содержать исходные тексты разрабатываемого профессором нового компилятора, четвертая группа файлов — предложения различных грантов, а также электронная почта, расписание встреч, статьи, игры и т. д. Требуется некий гибкий способ, позволяющий объединять эти файлы в группы.
Рис. 5.4. Три варианта устройства файловой системы:
а — один каталог на всех пользователей;
б — отдельный каталог для каждого пользователя;
в — дерево каталогов для каждого из пользователей. Буквами обозначены владельцы каталога или файла
Следовательно, нужна некая общая иерархия (то есть дерево каталогов). При таком подходе каждый пользователь может сам создать себе столько каталогов, сколько ему нужно, группируя свои файлы естественным образом. Этот подход проиллюстрирован на рис. 5.4, е. Здесь каталоги А, В и С, вложенные в корневой каталог, принадлежат различным пользователям, два из которых создали подкаталоги для проектов, над которыми они работают.
Возможность создавать произвольное количество подкаталогов является мощным структурирующим инструментом, позволяющим пользователям организовать свою работу. По этой причине почти все современные файловые системы реализуются подобным образом.
При организации файловой системы в виде дерева каталогов требуется некоторый способ указания файла. Для этого обычно используется два различных метода. В первом случае обращение к файлу выполняется по абсолютному имени пути, составленному из имен всех каталогов от корневого до того, в котором содержится файл, и имени самого файла.
Применяется и относительное имя пути. Оно используется вместе с концепцией рабочего каталога (также называемого текущим каталогом). Пользователь может назначить один из каталогов текущим рабочим каталогом. В этом случае все имена путей без начального символа разделителя считаются относительными и отсчитываются относительно текущего каталога.