Цели и задачи файловой системы

Файл – это именованная область внешней памяти, в которую можно записывать и из которой можно считывать данные. Файлы хранятся в энергонезависимой памяти, обычно – на магнитных дисках.

Основными целями использования файла являются:

1) Долговременное и надежное хранение информации. Долговременность достигается за счет использования запоминающих устройств, не зависящих от питания, а высокая надежность определяется средствами защиты доступа к файлам и общей организацией программного кода ОС, при которой сбои аппаратуры чаще всего не разрушают информацию, хранящуюся в файлах.

2) Совместное использование информации. Файлы обеспечивают естественный и легкий способ разделения информации между приложениями и пользователями за счет наличия понятного человеку символьного имени и постоянства хранимой информации и расположения файла. Пользователь должен иметь удобные средства работы с файлами, включая каталоги-справочники, объединяющие файлы в группы, средства поиска файлов по признакам, набор команд для создания, модификации и удаления файлов. Файл может быть создан одним пользователем, а затем использоваться другим пользователем, при этом создатель файла или администратор могут определить права доступа к нему других пользователей.

Файловая система, являющаяся неотъемлемой частью любой современной ОС, включает:

 совокупность всех файлов на диске;

 наборы структур данных, используемых для управления файлами (каталоги файлов, дескрипторы файлов, таблицы распределения свободного и занятого пространства на диске);

 комплекс системных программных средств, реализующих различные операции над файлами (создание, уничтожение, чтение, запись, именование и поиск файлов).

Файловая система позволяет программам обходиться набором относительно простых операций для выполнения действий над некоторым абстрактным объектом, представляющим файл. При этом программистам не нужно иметь дело с деталями действительного расположения данных на диске, буферизацией данных и другими низкоуровневыми проблемами передачи данных с долговременного запоминающего устройства – все эти функции файловая система берет на себя. Файловая система распределяет дисковую память, поддерживает именование файлов, отображает имена файлов в соответствующие адреса во внешней памяти, обеспечивает доступ к данным, поддерживает разделение, защиту и восстановление файлов.

Таким образом, файловая система играет роль промежуточного слоя, экранирующего все сложности физической организации долговременного хранилища данных, и создающего для программ более простую логическую модель этого хранилища, а также предоставляя им набор удобных в использовании команд для манипулирования файлами.

Задачи, решаемые файловой системой, зависят от способа организации вычислительного процесса в целом. Самый простой тип файловой системы реализуется в однопользовательских и однопрограммных ОС (например, MS-DOS).

Основные функции в такой файловой системе сведены к следующему перечню:

 именование файлов;

 программный интерфейс для приложений;

 отображение логической модели файловой системы на физическую организацию хранилища данных;

 устойчивость файловой системы к сбоям питания, ошибкам аппаратных и программных средств.

Задачи файловой системы естественным образом усложняются в однопользовательских мультипрограммных ОС, которые, хотя и предназначены для работы одного пользователя, но дают ему возможность запускать одновременно несколько процессов. Одной из первых ОС этого типа стала OS/2. В этом случае к перечисленным выше задачам добавляется новая задача совместного доступа к файлу из нескольких процессов. Файл в этом случае является разделяемым ресурсом, а значит, файловая система должна решать весь комплекс проблем, связанных с такими ресурсами. В частности, в файловой системе должны быть предусмотрены средства блокировки файла и его частей, предотвращения гонок, исключение тупиков, согласование копий и т.п.

В многопользовательских ОС появляется еще одна задача – защита файлов одного пользователя от несанкционированного доступа другого пользователя. Таким образом, основными функциями файловой системы многопользовательской многозадачной ОС являются:

 идентификация файлов – связывание имени файла с выделенным ему пространством внешней памяти;

 распределение внешней памяти между файлами – для работы с конкретным файлом не требуется иметь информацию о местоположении этого файла на внешнем носителе информации (сторона магнитного диска, цилиндр, сектор);

 обеспечение надежности и отказоустойчивости;

 обеспечение защиты от несанкционированного доступа;

 обеспечение совместного доступа к файлам (пользователь не должен прилагать специальных усилий по обеспечению синхронизации доступа);

 обеспечение высокой производительности.

Типы файлов

Файловые системы поддерживают несколько функционально различных типов файлов, в число которых, как правило, входят:

 обычные файлы;

 файлы-каталоги;

 специальные файлы;

 отображаемые в память файлы;

 именованные конвейеры;

 другие.

Рассмотрим каждый из этих типов файлов.

Обычные файлы, или просто файлы, содержат информацию произвольного характера, которую заносит в них пользователь или которая образуется в результате работы системных и пользовательских программ. Большинство современных ОС (например, Unix или MS Windows) никак не ограничивает и не контролирует содержимое и структуру обычного файла. Содержание обычного файла определяется приложением, которое с ним работает. Обычные файлы бывают двух типов – текстовые17 и двоичные18. Обычно прикладные программы, работающие с файлами, распознают тип файла по его имени в соответствии с общепринятыми соглашениями. Например, файлы с расширениями .c, .pas, .txt – ASCII-файлы, файлы с расширениями .exe – исполняемые, файлы с расширениями .obj, .zip – бинарные и т.д. Все ОС должны уметь распознавать хотя бы один тип файлов – собственные исполняемые файлы.

Для пользователей файл обозначается с помощью идентификаторов – внешних имен (могут быть и внутренние имена файлов). Пользователи дают файлам символьные имена, при этом учитываются ограничения ОС как на используемые символы, так и на длину имени. До недавнего времени эти границы были весьма узкими. Так, в популярной файловой системе FAT длина имен ограничивается известной схемой 8.3 (8 символов – собственно имя, 3 символа – расширение имени), а в ОС Unix System V имя не может содержать более 14 символов. Однако пользователю гораздо удобнее работать с длинными именами, посколь-ку они позволяют дать файлу действительно мнемоническое название, по которому даже через достаточно большой промежуток времени мож-но будет вспомнить, что содержит этот файл. Поэтому современные файловые системы, как правило, поддерживают длинные символьные имена файлов. Например, файловая система NTFS, появившаяся в Windows NT, устанавливает, что имя файла может содержать до 255 символов, не считая завершающего нулевого символа.

Файлы-каталоги или просто каталоги – это особый тип файлов, которые содержат системную справочную информацию о наборе файлов, сгруппированных пользователями по какому-либо признаку (например, в одну группу объединяются файлы, содержащие документы одного договора, или файлы, составляющие один программный пакет), с другой стороны – это файл, содержащий системную информацию о группе файлов, его составляющих.

Во многих ОС в каталог могут входить файлы любых типов, в том числе другие каталоги, за счет чего может образовываться древовидная структура, удобная для поиска. Каталоги устанавливают соответствие между именами файлов и их характеристиками, используемыми файловой системой для управления файлами. В число таких характеристик входит, в частности, информация (или указатель на другую структуру, содержащую эти данные) о типе файла и расположении его на диске, правах доступа к файлу и датах его создания и модификации. Во всех остальных отношениях каталоги рассматриваются файловой системой как обычные файлы.

Специальные файлы – это фиктивные файлы, ассоциированные с устройствами ввода-вывода, которые используются для унификации механизма доступа к файлам и внешним устройствам. Специальные файлы позволяют пользователю выполнять операции ввода-вывода посредством обычных команд записи в файл или чтения из файла. Эти команды обрабатываются сначала программами файловой системы, а затем на некотором этапе выполнения запроса преобразуются ОС в команды управления соответствующим устройством.

Специальные файлы, так же как и устройства ввода-вывода, делятся на блок-ориентированные и байт-ориентированные20. Следует помнить, что существуют некоторые внешние устройства, которые не относятся ни к одному из указанных классов, например, часы или таймеры, которые, с одной стороны, не адресуемы, а с другой стороны, не порож-дают потока байтов. Эти устройства только выдают сигналы прерыва-ния в заданные моменты времени.

Отображаемые в память файлы (англ. memory-mapped files) – это мощная возможность ОС, позволяющая приложениям осуществлять доступ к файлам на диске тем же самым способом, каким осуществляется доступ к динамической памяти, то есть через указатели. Смысл отображения файла в память заключается в том, что содержимое файла (или часть содержимого) отображается в некоторый диапазон виртуального адресного пространства процесса, после чего обращение по какому-либо адресу из этого диапазона означает обращение к файлу на диске. Естественно, не каждое обращение к отображенному в память файлу вызывает операцию чтения/записи. Менеджер виртуальной памяти кэширует обращения к диску и тем самым обеспечивает высокую эффективность работы с отображенными файлами.

Именованные конвейеры (именованные каналы) – одно из средств межпроцессного взаимодействия, детали которого рассмотрены в п. 3.3.6.

Атрибуты файла

Кроме имени ОС часто связывают с каждым файлом и другую информацию, например дату модификации, размер и т.д. Эти характеристики файлов называют атрибутами. В разных файловых системах могут использоваться в качестве атрибутов разные характеристики. Например, такими характеристиками, могут быть следующие:

 информация о разрешенном доступе;

 пароль для доступа к файлу;

 владелец файла;

 создатель файла;

 признак «только для чтения»;

 признак «скрытый файл»;

 признак «системный файл»;

 признак «архивный файл»;

 признак «двоичный/символьный»;

 признак «временный» (удалить после завершения процесса);

 признак блокировки;

 длина записи;

 указатель на ключевое поле в записи;

 длина ключа;

 время создания, последнего доступа и последнего изменения;

 текущий размер файла;

 максимальный размер файла.

Доступ к файлам

С точки зрения внутренней структуры (логической организации) файл – это совокупность однотипных записей, каждая из которых информирует о свойствах одного объекта. Записи могут быть фиксированной длины, переменной длины или неопределенной длины. Записи переменной длины в своем составе содержат длину записи, а неопределенной длины – специальный символ конца записи. При этом каждая запись может иметь идентификатор, представляющий собой ключ, который может быть сложным и состоять из нескольких полей.

Существует несколько способов логической организации памяти:

 последовательный;

 индексно-последовательный;

 индексный;

 прямой;

 библиотечный.

Рассмотрим каждый из этих способов подробнее.

При последовательном способе организации памяти записи располагаются в физическом порядке и обеспечивают доступ в физической последовательности. Таким образом, для обработки записи с номером N + 1 необходимо последовательно обратиться к записям с номером 1,2,…,N. Это универсальный способ организации файла периферийного устройства, входного/выходного потока.

При индексно-последовательном способе записи располагаются в логической последовательности в соответствии со значением ключей записи, но физически записи располагаются в различных местах файла. Логическая последовательность файла фиксируется в специальной таблице индексов, в которой значение ключей связывается с физическим адресом записи. При такой организации доступ к записям осуществляется логически последовательно в порядке возрастания или убывания значения ключа или по значению ключа.

При индексном способе место записи в файле ее физический адрес определяется алгоритмом преобразования для ключа. Доступ к записям возможен только прямой, а алгоритм преобразования ключа называется хешированием. Ключ, использующий алгоритм хеширования, преобразуется в номер записи.

Прямой способ организации характеризуется тем, что в соответствии с ним осуществляется прямой доступ по порядковому номеру записи или по физическому адресу.

При библиотечном способе организации памяти файл состоит из последовательных подфайлов (разделов), первый из которых является оглавлением и содержит имена и адреса остальных подфайлов. При такой организации осуществляется комбинированный доступ –индексный прямой к разделу и последовательный в разделах.

В многопользовательских системах, независимо от рассмотренных выше способов логической организации памяти, существует проблема обеспечения раздельных прав доступа к ресурсам. В таких системах в качестве субъектов доступа могут выступать как отдельные пользователи, так и группы пользователей. Определение индивидуальных прав доступа для каждого пользователя позволяет максимально гибко задать политику расходования разделяемых ресурсов в вычислительной системе. Однако этот способ приводит в больших системах к чрезмерной загрузке администратора рутинной работой по повторению одних и тех же операций для пользователей с одинаковыми правами. Объединение таких пользователей в группу и задание прав доступа в целом для группы является одним из основных приемов администрирования в больших системах.

У каждого объекта доступа существует владелец. Владельцем может быть как отдельный пользователь, так и группа пользователей. Владелец объекта имеет право выполнять с ним любые допустимые для данного объекта операции. Во многих ОС существует особый пользователь (superuser, root или administrator), который имеет все права по отношению к любым объектам системы, не обязательно являясь их владельцем. Под таким именем работает администратор системы, которому необходим полный доступ ко всем файлам и устройствам для управления политикой доступа.

Различают два основных подхода к определению прав доступа:

1) Избирательный доступ (англ. discretionary – предоставленный на собственное усмотрение). Для каждого объекта сам владелец может определить допустимые операции с объектами. Между пользователями и группами пользователей в системах с избирательным доступом нет жестких иерархических взаимоотношений, то есть взаимоотношений, которые определены по умолчанию и которые нельзя изменить. Исключение делается только для администратора, по умолчанию наделяемого всеми правами.

2) Мандатный доступ (англ. mandatory – обязательный, принудительный). Система наделяет пользователя определенными правами по отношению к каждому разделяемому ресурсу (файлу) в зависимости от того, к какой группе пользователь отнесен. От имени системы выступает администратор, а владельцы объектов лишены возможности управлять доступом к ним по своему усмотрению. Все группы пользователей в такой системе образуют строгую иерархию, причем каждая группа пользуется всеми правами группы более низкого уровня иерархии, к кото-рым добавляются права данного уровня. Членам какой-либо группы не разрешается предоставлять свои права членам групп более низких уровней иерархии.

Мандатные системы доступа считаются более надежными, но менее гибкими, обычно они применяются в специализированных вычислительных системах с повышенными требованиями к защите информации. В универсальных системах используются, как правило, избирательные методы доступа.

Несмотря на то, что здесь в основном рассматриваются механизмы контроля доступа к таким объектам, как файлы и каталоги, но следует помнить, что эти же механизмы могут использоваться в современных ОС для контроля доступа к объектам любого типа – отличия заключаются лишь в наборе операций, характерных для того или иного класса объектов.

Операции над файлами

Определить права доступа к ресурсу – значит определить для каждого пользователя набор операций, которые ему разрешено применять к данному ресурсу. В разных ОС для одних и тех же типов ресурсов может быть определен свой список дифференцируемых операций доступа. Для файловых объектов этот список может включать следующие операции:

 Создание файла, не содержащего данных. Смысл данного вызова – объявить, что файл существует, и присвоить ему ряд атрибутов. При этом выделяется место для файла на диске и вносится запись в каталог.

 Удаление файла и освобождение занимаемого им дискового пространства.

 Открытие файла. Перед использованием файла процесс должен его открыть. Цель данного системного вызова – разрешить системе проанализировать атрибуты файла и проверить права доступа к нему, а также считать в ОП список адресов блоков файла для быстрого доступа к его данным.

 Закрытие файла. Если работа с файлом завершена, его атрибуты и адреса блоков на диске больше не нужны. В этом случае файл нужно закрыть, чтобы освободить место во внутренних таблицах файловой системы.

 Позиционирование. Возможность специфицировать текущую позицию в файле для считывания/записи данных.

 Чтение данных из файла. Обычно с текущей позиции. Пользователь должен задать объем считываемых данных и предоставить для них буфер в ОП.

 Запись данных в файл с текущей позиции. Если текущая позиция находится в конце файла, его размер увеличивается, в противном случае запись осуществляется на место имеющихся данных.

Наличие в системе многих пользователей предполагает организацию контролируемого доступа к файлам. Выполнение любой операции над файлом должно быть разрешено только в случае наличия у пользователя соответствующих привилегий. Обычно контролируются следующие операции: чтение, запись и выполнение. Другие операции, например копирование файлов или их переименование, также могут контролироваться. Однако чаще эти операции реализуются через перечисленные. Так, операцию копирования файлов можно представить как операцию чтения и последующую операцию записи.

Наиболее общий подход к защите файлов от несанкционированного использования – сделать доступ зависящим от идентификатора пользователя, т.е. связать с каждым файлом или директорией список прав доступа (англ. access control list), где перечислены имена пользователей и типы разрешенных для них способов доступа к файлу.

Любой запрос на выполнение операции сверяется с таким списком. У такой техники есть два нежелательных следствия:

 конструирование подобного списка может оказаться сложной задачей, особенно если пользователи системы не известны заранее;

 запись в директории должна иметь переменный размер (включать список потенциальных пользователей).

Для решения этих проблем создают классификации пользователей, например, в ОС Unix все пользователи разделены на три группы:

 владелец (англ. owner);

 группа (англ. group – набор пользователей, разделяющих файл и нуждающихся в типовом способе доступа к нему);

 остальные (англ. univers).

В рамках такой ограниченной классификации задаются только три поля (по одному для каждой группы) для каждой контролируемой операции. В итоге в ОС Unix операции чтения, записи и исполнения контролируются при помощи 9 бит: rwxrwxrwx.

Наши рекомендации