Читайте также:
|
|
2.1 Структура файловой системы
Файловая система UNIX характеризуется:
- иерархической структурой;
- согласованной обработкой массивов данных;
- возможностью создания и удаления файлов;
- динамическим расширением файлов;
- защитой информации в файлах;
- трактовкой периферийных устройств (таких как терминалы, принтеры, ленточные устройства и т.п.) как файлов.
Файловая система организована в виде дерева с одной исходной вершиной, которая называется корнем (root – записывается: «/»); каждая вершина в древовидной структуре файловой системы, кроме листьев, является каталогом файлов, а файлы, соответствующие дочерним вершинам, являются либо каталогами, либо обычными файлами, либо файлами устройств. Имени файла предшествует указание пути поиска, который описывает место расположения файла в иерархической структуре файловой системы. Имя пути поиска состоит из компонент, разделенных между собой наклонной чертой (/); каждая компонента представляет собой набор символов, составляющих имя вершины (файла), которое является уникальным для каталога (предыдущей компоненты), в котором оно содержится. Полное имя пути поиска начинается с указания наклонной черты и идентифицирует файл (вершину), поиск которого ведется от корневой вершины дерева файловой системы с обходом тех ветвей дерева файлов, которые соответствуют именам отдельных компонент. Так, пути «/etc/passwd», «/bin/who» и «/usr/src/cmd/who.c» указывают на файлы, являющиеся вершинами дерева, изображенного на Рис.3, а пути «/bin/passwd» и «/usr/src/date.c» содержат неверный маршрут. Имя пути поиска необязательно должно начинаться с корня, в нем следует указывать маршрут относительно текущего для выполняемого процесса каталога, при этом предыдущие символы «наклонная черта» в имени пути опускаются. Так, например, если мы находимся в каталоге «/dev», то путь
«tty01» указывает файл, полное имя пути поиска для которого «/dev/tty01».
Как правило, в каждой UNIX-системе можно найти следующие каталоги:
/bin большинство выполняемых команд и shell-процедур; многие файлы являются объектными и хранятся в двоичной форме (программы, утилиты и т.д.);
/boot каталог с информацией о загрузке;
/dev каталог файлов, представляющих периферийные устройства (диски, принтеры, модемы, терминалы и т.п.);
/etc преимущественно административные утилиты и файлы (дословный перевод с английского – разное);
/home домашние каталоги пользователей системы;
/lib стандатрные библиотеки;
/lost+found место для хранения файлов, системная информация о которых потеряна;
/mnt монтируемые файловые системы (флоппи-диски, CD-ромы и т.п.)
/proc псевдо-файловая система, содержащая инфрмацию о процессах;
/root домашний каталог суперпользователя (системного оператора);
/tmp временные файлы (очищаются при загрузки системы);
/usr каталог пользователей (не путать с домашними каталогами). Здесь хранятся как общие для всех пользователей исполнимые файлы, так и прочая информация;
/var переменные (часто изменяемые) файлы (почтовые пакеты, спул принтера и т.п.)
Программы, выполняемые под управлением системы UNIX, не содержат никакой информации относительно внутреннего формата, в котором ядро хранит файлы данных, данные в программах представляются как бесформатный поток байтов.
Программы могут интерпретировать поток байтов по своему желанию, при этом любая интерпретация никак не будет связана с фактическим способом хранения данных в операционной системе. Так, синтаксические правила, определяющие задание метода доступа к данным в файле, устанавливаются системой и являются едиными для всех программ, однако семантика данных определяется конкретной программой.
Пример
Как известно, в исходных текстах программ на Си символ # в начале строки предшествует команде препроцессора:
#define определение константы или макроса
#include включение в текст программы нового файла
В командных интерпретаторах (shell) и текстовых файлах конфигурации символ # в начале строки обозначает комментарий. Поэтому один и тот же файл будет трактоваться разными программами по-разному.
Пример
Программа форматирования текста troff ищет в конце каждой строки текста символы перехода на новую строку, а программа учета системных ресурсов acctcom работает с записями фиксированной длины. Обе программы пользуются одними и теми же системными средствами для осуществления доступа к данным в файле как к потоку байтов, и внутри себя преобразуют этот поток по соответствующему формату. Если любая из программ обнаружит, что формат данных неверен, она принимает соответствующие меры.
Обычные файлы и каталоги хранятся в UNIX-системе на устройствах ввода-вывода (магнитные ленты или диски) блоками. В системе может быть несколько физических дисков, на каждом из которых может размещаться одна и более файловых систем. Разбивка диска на несколько файловых систем облегчает администратору управление хранимыми данными. На логическом уровне ядро имеет дело с файловыми системами, а не с дисками, при этом каждая система трактуется как логическое устройство, идентифицируемое номером. Преобразование адресов логического устройства (файловой системы) в адреса физического устройства (диска) и обратно выполняется дисковым драйвером.
Файловая система состоит из последовательности логических блоков длиной 512, 1024, 2048 или другого числа байт, кратного 512, в зависимости от реализации системы. Размер логического блока внутри одной файловой системы постоянен, но может варьироваться в разных файловых системах в данной конфигурации. Использование логических блоков большого размера увеличивает скорость передачи данных между диском и памятью, поскольку ядро сможет передать больше информации за одну дисковую операцию, и сокращает количество продолжительных операций. Например, чтение 1 Кбайта с диска за одну операцию осуществляется быстрее, чем чтение 512 байт за две. Однако, если размер логического блока слишком велик, полезный объем памяти может уменьшиться.
Файловая система имеет следующую структуру (Рис.4):
· Блок загрузки (блок номер 0) располагается в начале пространства, отведенного под файловую систему, обычно в первом секторе, и содержит программу начальной загрузки, которая считывается в машину при загрузке или инициализации операционной системы. Хотя для запуска системы требуется только один блок загрузки, каждая файловая система имеет свой (пусть даже пустой) блок загрузки.
· Суперблок (блок номер 1) описывает состояние файловой системы. Он содержит следующую информацию:
· число блоков, составляющих файловую систему;
· число блоков, предназначенных для хранения описателей (индексов) файлов;
· указатель на заголовок списка свободных блоков.
· Группа блоков, начиная с номера 2, является списком индексов или идентификаторов в файловой системе. Администраторы указывают размер списка индексов при генерации файловой системы. Один из индексов является корневым индексом файловой системы: это индекс, по которому осуществляется доступ к структуре каталогов файловой системы после выполнения системной операции mount (монтировать).
· Информационные блоки располагаются сразу после списка индексов и содержат данные файлов и управляющие данные. Отдельно взятый информационный блок может принадлежать одному и только одному файлу в файловой системе.
2.2 Внутреннее представление файлов
Каждый файл в системе UNIX имеет уникальный индекс (дескриптор, идентификатор). Индекс содержит информацию, необходимую любому процессу для того, чтобы обратиться к файлу:
- права собственности на файл;
- права доступа к файлу;
- размер файла;
- расположение данных файла в файловой системе.
Процессы обращаются к файлам, используя четко определенный набор системных вызовов и идентифицируя файл строкой символов, выступающих в качестве составного имени файла. Каждое составное имя однозначно определяет файл, благодаря чему ядро системы преобразует это имя в индекс файла.
2.2.1 Индексы
Индексы существуют на диске в статической форме, и ядро считывает их в память прежде, чем начать с ними работать. Дисковые индексы включают в себя следующие поля:
- Идентификатор владельца файла. Права собственности на каждый файл разделены между индивидуальным владельцем и «групповым», и тем самым помогают определить круг пользователей, имеющих права доступа к файлу. Суперпользователь имеет право доступа ко всем файлам в системе;
- Идентификатор группы владельцев файла. Групповое владение файлом дает возможность предоставить ограниченному кругу лиц, объединенных в группу, иметь доступ к файлу;
- Тип файла. Файл может быть файлом обычного типа, каталогом, специальным файлом, соответствующим устройствам ввода-вывода символами или блоками (символьного и блочного типа), а также абстрактным файлом канала (организующим обслуживание запросов в порядке поступления, «первым пришел – первым вышел»);
- Права доступа к файлу. Система разграничивает права доступа к файлу для трех классов пользователей: непосредственно владельца файла (owner), группового владельца (group) и прочих пользователей (others); каждому классу выделены определенные права на чтение, запись и исполнение файла, которые устанавливаются владельцем. Поскольку каталоги как файлы не могут быть исполнены, разрешение на исполнение в данном случае интерпретируется как право производить поиск в каталоге по имени файла;
- Календарные сведения, характеризующие работу с файлом: время внесения последних изменений в файл, время последнего обращения к файлу, время внесения последних изменений в индекс;
- Число указателей на файл, означающее количество имен, используемых при поиске файла в иерархии каталогов.
- Таблица адресов на диске, в которых располагается информация файла. Хотя пользователи трактуют информацию в файле как логический поток байтов, ядро располагает эти данные в несоприкасающихся дисковых блоках. Дисковые блоки, содержащие информацию файла, указываются в индексе (как правило, 10-12 блоков);
- Размер файла. Данные в файле адресуются с помощью смещения в байтах относительно начала файла, начиная со смещения, равного 0, поэтому размер файла в байтах на 1 больше максимального смещения. Например, если пользователь создает файл и записывает только 1 байт информации по адресу со смещением 1000 от начала файла, размер файла составит 1001 байт.
В индексе отсутствует составное имя файла, необходимое для осуществления доступа к файлу. Имя файла и номер индекса хранится в записи каталога.
На Рис.5 показан дисковый индекс некоторого файла. Этот индекс принадлежит обычному файлу, владелец которого – «mjb» и размер которого – 6030 байт. Система разрешает пользователю «mjb» производить чтение, запись и исполнение файла; членам группы «os» и всем остальным пользователям разрешается только читать или исполнять файл, но не записывать в него данные. Последний раз файл был прочитан 23 октября 1984 года в 13:45, последний раз запись производилась 22 октября 1984 года в 10:30. Индекс изменялся последний раз 23 октября 1984 года в 13:30, хотя никакая информация в это время в файл не записывалась.
2.2.2 Структура файла
Как уже говорилось, индекс включает в себя таблицу адресов расположения информации файла на диске. Так как каждый блок на диске адресуется по своему номеру, в этой таблице хранится совокупность номеров дисковых блоков. Если бы данные файла занимали непрерывный участок на диске (то есть файл занимал бы линейную последовательность дисковых блоков), то для обращения к данным в файле было бы достаточно хранить в индексе адрес начального блока и размер файла. Однако, такая стратегия размещения данных не позволяет осуществлять простое расширение и сжатие файлов в файловой системе без риска фрагментации свободного пространства памяти на диске. Более того, ядру пришлось бы выделять и резервировать непрерывное пространство в файловой системе перед выполнением операций, могущих привести к увеличению размера файла. Ядро могло бы минимизировать фрагментацию пространства памяти, периодически запуская процедуры чистки памяти, уплотняющие имеющуюся память, но это потребовало бы дополнительного расхода временных и системных ресурсов.
Таблица адресов блоков в индексе имеет фиксированную длину, тем самым налагая ограничение на размер файла. Для того, чтобы иметь возможность хранить файлы большой длины, применяется алгоритм косвенной адресации. При косвенной адресации запись в таблице блоков файлового индекса ссылается не на информационный блок, а на блок, в котором хранятся ссылки на информационные блоки (список индексов). При двойной косвенной адресации эти блоки в свою очередь указывают не на действительную информацию, хранящуюся в файле, а на блоки указателей на информационные блоки. Существует также тройная косвенная адресация (но не четырехуровневая и т.д.). На Рис.6 приведены максимальные размеры файлов, для хранения которых используются различные виды адресации (размер блока – 1 КБайт).
10 блоков прямой адресации по 1 Кбайту каждый | 10 КБайт |
1 блок косвеной адресации с 256 блоками прямой адресации | 256 КБайт |
1 блок двойной косвеной адресации с 256 блоками косвенной адресации | 64 МБайта |
1 блок тройной косвеной адресации с 256 блоками двойной адресации | 16 ГБайт |
Рис.6 Объем файла в байтах при размере блока 1 КБайт.
2.3 Каталоги
Каталоги являются файлами, из которых строится иерархическая структура файловой системы; они играют важную роль в превращении имени файла в номер индекса.
Каталог – это файл, содержимым которого является набор записей, состоящих из номера индекса и имени файла, включенного в каталог.
Составное имя – это строка символов, завершающаяся пустым символом и разделяемая наклонной чертой («/») на несколько компонент. Каждая компонента, кроме последней, должна быть именем каталога, но последняя компонента может быть именем файла, не являющегося каталогом.
На Рис.7 показан формат некоторого каталога. В каждом каталоге имеются файлы, в качестве имен которых указаны точка и две точки («.» и «..»). Номера индексов этих файлов совпадают с номерами индексов данного каталога и родительского каталога, соответственно. Номер индекса для файла «.» в рассматриваемом каталоге имеет адрес со смещением 0 и значение 83. Номер индекса для файла «..» имеет адрес со смещением 16 от начала каталога и значение 2. Записи в каталоге могут быть пустыми, при этом номер индекса равен 0. Например, запись с адресом 224 в каталоге «/etc» пустая, несмотря на то, что она когда-то содержала точку входа для файла с именем «crash». Программа mkfs инициализирует файловую систему таким образом, что номера индексов для файлов «.» и «..» в корневом каталоге совпадают с номером корневого индекса файловой системы.
Ядро хранит данные в каталоге так же, как оно это делает в файле обычного типа, используя индексную структуру и блоки с уровнями прямой и косвенной адресации. Процессы могут читать данные из каталогов таким же образом, как они читают обычные файлы, однако исключительное право записи в каталог резервируется ядром, благодаря чему обеспечивается правильность структуры каталога. Права доступа к каталогу имеют следующий смысл:
- право чтения дает процессам возможность читать данные из каталога;
- право записи позволяет процессу создавать новые записи в каталоге или удалять старые, в результате чего изменяется содержимое каталога;
- право исполнения позволяет процессу производить поиск в каталоге по имени файла (поскольку «исполнять» каталог бессмысленно).
2.4 Другие типы файлов
В системе UNIX поддерживаются и два других типа файлов:
- каналы;
- специальные файлы.
Канал отличается от обычного файла тем, что содержит временные данные: информация, однажды считанная из канала, не может быть прочитана вновь. Кроме того, информация читается в том порядке, в котором она была записана в канале, и система не допускает никаких отклонений от данного порядка (принцип fifo – первым пришел, первым вышел). Способ хранения ядром информации в канале не отличается от способа ее хранения в обычном файле, за исключением того, что здесь используются только блоки прямой, а не косвенной, адресации.
Последним типом файлов в системе UNIX являются специальные файлы, к которым относятся специальные файлы устройств ввода-вывода блоками и специальные файлы устройств посимвольного ввода-вывода. Оба подтипа обозначают устройства, и поэтому индексы таких файлов не связаны ни с какой информацией. Вместо этого индекс содержит два номера – старший и младший номера устройства. Старший номер устройства указывает его тип, например, терминал или диск, а младший номер устройства – числовой код, идентифицирующий устройство в группе однородных устройств.
Для пользователя система UNIX трактует устройства так, как если бы они были файлами. Устройства, для которых назначены специальные файлы устройств, становятся вершинами в структуре файловой системы. Обращение программ к устройствам имеет тот же самый синтаксис, что и обращение к обычным файлам; семантика операций чтения и записи по отношению к устройствам в большой степени совпадает с семантикой операций чтения и записи обычных файлов. Способ защиты устройств совпадает со способом защиты обычных файлов: путем соответствующей установки битов разрешения доступа к ним (файлам). Поскольку имена устройств выглядят так же, как и имена обычных файлов, и поскольку над устройствами и над обычными файлами выполняются одни и те же операции, большинству программ нет необходимости различать внутри себя типы обрабатываемых файлов.
2.5 Подсистема управления файлами
Когда процесс обращается к файлу по имени, ядро системы анализирует по очереди каждую компоненту имени файла, проверяя права процесса на просмотр входящих в путь поиска каталогов, и, в конце концов, возвращает индекс файла.
Пример
Если процесс обращается к системе с запросом на открытие файла
open («/fs2/mjb/rje/sourcefile», 1),
то ядро рекурсивно проверяет права пользователя/процесса на просмотр каталогов /fs2, /fs2/mjb, /fs2/mjb/rje, а затем самого файла /fs2/mjb/rje/sourcefile, и если запрашиваемый доступ разрешен, возвращает индекс для файла /fs2/mjb/rje/sourcefile. Все обращения к каталогам и файлам включают обращения к их индексам, та как именно в индексах содержится информация о пользователях и правах доступа.
Если процесс создает новый файл, ядро присваивает этому файлу неиспользуемый индекс. Индексы хранятся в файловой системе, однако при обработке файлов ядро заносит их в таблицу индексов в оперативной памяти.
Ядро поддерживает еще две информационные структуры: таблицу файлов и пользовательскую таблицу дескрипторов файла. Таблица файлов выступает глобальной структурой ядра, а пользовательская таблица дескрипторов файла выделяется под процесс. Если процесс открывает или создает файл, ядро выделяет в каждой таблице элемент, корреспондирующий с индексом файла. Элементы в этих трех структурах – в пользовательской таблице дескрипторов файла, в таблице файлов и в таблице индексов – хранят информацию о состоянии файла и о доступе пользователей к нему. В таблице файлов хранится смещение в байтах от начала файла до того места, откуда начнет выполняться следующая команда пользователя read (читать) или write (записать), а также информация о правах доступа к открываемому процессу. Таблица дескрипторов файла идентифицирует все открытые для процесса файлы. На Рис.8 показаны эти таблицы и связи между ними. В системных операциях open (открыть) и creat (создать) ядро возвращает дескриптор файла, которому соответствует указатель в таблице дескрипторов файла. При выполнении операций read и write ядро использует дескриптор файла для входа в таблицу дескрипторов и, следуя указателям на таблицу файлов и на таблицу индексов, находит информацию в файле. Использование этих таблиц обеспечивает различную степень разделения доступа к файлу.
При работе с файлами ядро копирует индексы в оперативную память, снабжая их дополнительными полями. Кроме полей дискового индекса, индексы в памяти включает в себя и следующие поля:
· Состояние индекса в памяти, отражающее:
- заблокирован ли индекс;
- ждет ли снятия блокировки с индекса какой-либо процесс;
- отличается ли представление индекса в памяти от своей дисковой копии в результате изменения содержимого индекса;
- отличается ли представление индекса в памяти от своей дисковой копии в результате изменения содержимого файла.
· Логический номер устройства файловой системы, содержащей файл.
· Номер индекса. Так как индексы на диске хранятся в линейном массиве, ядро идентифицирует номер дискового индекса по его местоположению в массиве. В дисковом индексе это поле не нужно.
· Указатели на другие индексы в памяти. Ядро связывает индексы в хеш-очереди и включает их в список свободных индексов подобно тому, как связывает буферы в буферные хеш-очереди и включает их в список свободных буферов. Хеш-очередь идентифицируется в соответствии с логическим номером устройства и номером индекса. Ядро может располагать в памяти не более одной копии данного дискового индекса, но индексы могут находиться одновременно как в хеш-очереди, так и в списке свободных индексов.
· Счетчик ссылок, означающий количество активных экземпляров файла (таких, которые открыты).
Индекс может блокироваться, в результате чего другим процессам запрещается работа с ним; эти процессы устанавливают в индексе специальный флаг, возвещающий о том, что выполнение обратившихся к индексу процессов следует возобновить, как только блокировка будет снята.
Индекс активен, когда процесс выделяет его, например, при открытии файла. Индекс находится в списке свободных индексов, только если значение его счетчика ссылок в таблице в памяти равно 0, и это значит, что ядро может переназначить свободный индекс в памяти другому дисковому индексу.
Дата добавления: 2014-12-19; просмотров: 43 | Поможем написать вашу работу | Нарушение авторских прав |