5.1. Понятие файла, файлового менеджера и файловой системы
Внешняя (энергонезависимая, по терминологии фон Неймана – ЗУ) память, например: диски, EEPROM (electrically erasable programmable read-only memory), ленты и т.п. является неотъемлемой часть любой ЭВМ, иначе любую программу пришлось бы писать заново при каждом включении ЭВМ.
Файл – это совокупность данных во внешней памяти, доступ к которым осуществляется по имени. Файл, таким образом, противопоставляется другим объектам, доступ к которым осуществляется по их адресу, например, записям внутри файла или блокам на диске. ОС семейства UNIX трактуют понятие файла более широко – там файлом называется любой объект, имеющий имя в файловой системе, при этом API предусматривает обращение к таким объектам, как к файлам. Однако файлы, не являющиеся совокупностями данных (каталоги, внешние устройства, именованные программные конвейеры, семафоры), часто называют не простыми файлами, а «специальными».
Назначение файловой системы (ФС) состоит в организации эффективной работы с данными, хранящимися во внешней памяти и обеспечении удобного интерфейса при работе с этими данными. Понятие ФС включает:
- совокупность всех файлов на диске,
- наборы структур, используемых для управления файлами (каталоги файлов, дескрипторы файлов, таблицы распределения свободного и занятого пространства на диске),
- файловый менеджер – комплекс системных программных средств, реализующих управление файлами (создание, уничтожение, чтение, запись, именование, поиск и другие операции над файлами).
5.1.1. Назначение и основные функции файловых систем
Основные функции ФС:
- Идентификация файлов. Связывание имени файла с выделенным ему пространством внешней памяти.
|
- Распределение внешней памяти между файлами.
- Обеспечение надежности и отказоустойчивости при работе с файлами.
- Обеспечение защиты от НСД.
- Обеспечение совместного доступа к файлам.
- Обеспечение высокой производительности.
Примеры ФС: FAT (DOS), HPFS (OS/2), NTFS (Windows NT), EXT2 (Linux), ISO9660 (CD-ROM), Network File System (NFS - UNIX).
Поскольку файловый менеджер, получая от прикладной программы имя файла, организует доступ к данным в ЗУ по адресам (рис.1), например, по номеру сектора, дорожки и поверхности диска, то он должен использовать структуру, сопоставляющую имена и адреса. Эта структура (каталог, директория) – файл, имеющий определенный тип и содержащий список входящих в него файлов. В каталоге хранятся имена файлов, их размер, местоположение на диске, даты создания, даты последней модификации, а в многопользовательских системах – идентификатор хозяина каждого файла и права доступа к нему для других пользователей. Во многих ФС эта информация хранится не в самом каталоге, а в специальной структуре данных - иноде, метафайле и т.д. В этом случае запись в каталоге содержит только имя и указатель на управляющую структуру файла.
Большинство современных ОС позволяет делать вложенные каталоги – файлы, которые сами являются каталогами. В таких системах файл задается полным или путевым именем (path name), состоящим из цепочки имен вложенных каталогов и имени файла в последнем из них.
Иногда на диске размещается только одна файловая система. Современные ОС часто позволяют размещать на одном физическом диске несколько файловых систем, выделяя каждой из них фиксированную часть диска. Такие части диска называются разделами (partition).
|
5.1.2. Блочная и кластерная адресация ФС
Во многих ФС место в ЗУ выделяется по блокам. Размер блока, как правило, совпадает с аппаратным размером сектора ЗУ, однако многие ФС могут использовать логические блоки, состоящие из нескольких секторов (так называемые кластеры). Использование блоков и кластеров вместо адресации с точностью до байта вызвано двумя причинами.
- У большинства устройств произвольного доступа доступ произволен лишь с точностью до блока, то есть нельзя произвольно считать или записать любой байт - нужно считывать или записывать весь блок целиком (блочные устройства, block-oriented).
- Использование крупных адресуемых единиц позволяет увеличить адресуемое пространство. Так, используя 16-битный указатель, с точностью до байта можно адресовать всего 64К, но если в качестве единицы адресации взять 512-байтовый блок, то объем адресуемых данных сможет достигать 32 Мб; если же использовать кластер размером 32К, то можно работать с данными объемом до 2 Гб.
Однако увеличение объема кластера имеет оборотную сторону - оно приводит к внутренней фрагментации, когда записываемый файл занимает не целое число блоков (кластеров). Величина потерь зависит от среднего размера файла на диске. По грубой оценке на каждый файл в среднем теряется полкластера.
Ряд современных ФС использует механизм размещения частей блоков (block suballocation). В этих ФС кластеры имеют большой размер, но есть возможность разделить кластер на несколько блоков меньшего размера и записать в эти блоки «хвосты» от нескольких разных файлов. Это, безусловно, усложняет ФС, но позволяет одновременно использовать преимущества, свойственные и большим, и маленьким блокам.
|
5.2. ФС последовательного доступа
Наиболее простой файловой системой можно считать структуру, создаваемую архиватором системы UNIX - программой tar (Tape ARchive - архив на [магнитной] ленте). Этот архиватор просто пишет файлы один за другим, помещая в начале каждого файла заголовок с его именем и длиной (рис.2).
Для поиска определенного файла надо прочитать первый заголовок; если это не тот файл, то перейти к следующему и прочитать его заголовок и т.д. Это очень трудоемкий метод. Изменение же длины файла в середине архива или его удаление вообще превращается в сложную процедуру.
В настоящее время ФС последовательного доступа используются на хранения данных на CD, поскольку эти носители настолько дешевы, что проблемы удаленяи или перезаписи удлинившегося файла просто не существует.
5.3. ФС произвольного доступа
5.3.1. ФС индексно-последовательной организации
Чтобы не заниматься при каждом поиске файла просмотром всего устройства, удобнее создать каталог, хранящий имена файлов, адреса их первых блоков и длины файлов, и разместить его в определенном месте, например в начале ленты (индексно-последовательный доступ). Наиболее простую ФС такого типа имеет ОС RT-11 (рис.3).
В ОС RT-11 каждому файлу выделяется непрерывная область на диске. При этом порядок записей в каталоге совпадает с порядком файлов на диске, и началом файла считается окончание предыдущего файла. Свободным участкам диска тоже соответствует запись в каталоге. При создании файла система ищет первый свободный участок подходящего размера. Фактически эта структура отличается от формата tar только тем, что каталог вынесен в начало диска, и существует понятие свободного участка внутри области данных. Но эта простая организация имеет очень серьезные недостатки.
-При создании файла программа должна указать его длину, что часто бывает затруднительно, например, при создании объектного файла во время компиляции программы на языке высокого уровня.
-Увеличение размера уже созданного файла потребует создания файла новой длины и копирования содержимое старого файла в него.
-При хаотическом создании и удалении файлов возникает проблема фрагментации свободного пространства. Для ее решения существует специальная программа сжатия (SQUEESE), которая переписывает файлы так, чтобы объединить все свободные фрагменты. Эта программа требует много времени, особенно для больших дисковых томов, и потенциально опасна: если при ее исполнении произойдет сбой системы, то значительная часть данных будет необратимо разрушена.
5.3.2. ФС в виде связанного списка блоков
Для решения проблем индексно-последовательной организации необходимо позволить файлам занимать несмежные области диска. Наиболее простым решением было бы хранить в конце каждого блока файла указатель на следующий, то есть превратить файл в связанный список блоков. При чисто последовательном доступе к файлу такое решение было бы вполне приемлемым, но при попытках реализовать доступ к произвольному блоку файла возникнут неудобства:
- Для поиска i -го блока нужно осуществить несколько обращений к диску, последовательно считывая блоки от 1 до i -1, то есть выборка логически смежных записей, которые занимают физически несмежные секторы, может требовать много времени.
- Низкая надежность. Наличие дефектного блока в списке приводит к потере информации в остаточной части файла и, потенциально, к потере дискового пространства отведенного под этот файл.
- Для указателя на следующий блок внутри файла нужно выделить дополнительное место в ЗУ.
В чистом виде такое решение не используется ни в одной из известных ОС. В MS DOS список есть, но он хранится в отдельной структуре – FAT.
5.3.3. ФС FAT
5.3.3.1. Структура FAT
Отчасти похожее решение было реализовано в операционных системах MS DOS. Эти системы создают на диске таблицу - FAT (File Allocation Table - таблица размещения файлов). В этой таблице (FATn) каждому блоку, предназначенному для хранения данных, соответствует n-битовое значение. Если блок свободен, то значение равно нулю. Если же блок принадлежит файлу, то значение будет равно адресу следующего блока этого файла. Если это последний блок в файле, то значение будет 0xFFF (для FAT12). Существует также специальный код для обозначения плохого (bad) блока, не читаемого из-за дефекта физического носителя. Емкость диска при использовании 12-битной FAT ограничена 212=4096-ю блоками (2Мб при размере блока 512 байт), что приемлемо для дискет, но не годится для жестких дисков. На таких устройствах DOS использует FAT с 16-битовыми элементами. На больших (более 32 Мб) дисках DOS выделяет пространство не блоками, а кластерами из нескольких блоков. Существует также FAT32 с 4 байтовыми элементами.
ФС FAT очень проста и обладает устойчивостью к сбоям (fault tolerance). Это объясняется тем, что в этой ФС удаление блока из списка свободных и выделение его файлу производится одним действием - модификацией элемента FAT. Поэтому если во время этой процедуры произойдет сбой (пусть даже повлекший перезагрузку ЭВМ), то ничего страшного не случится: просто получится файл, которому выделено на один блок больше, чем его длина, записанная в каталоге. При последующем стирании этого файла все его блоки будут помечены как свободные, поэтому вреда практически нет.
Тем не менее, эта ФС имеет ряд серьезных недостатков.
-При каждой операции над файлами система должна обращаться к FAT. Это приводит к частым перемещениям головок дисковода и в результате к резкому снижению производительности. Если же использовать отложенную запись, как в FAT32, то теряется fault tolerance.
-Чем больше диск, тем больше у него FAT, соответственно, тем больше нужно памяти для ее хранения. Увеличение же размера кластера приводит к большим потерям из-за внутренней фрагментации.
5.3.3.2. Каталоги ФС FAT
Имя файла | Расширение | Атрибуты (файл/каталог) | Резерв | Время | Дата | Адрес первого блока | Размер |
Рисунок 4. Каталог FAT |
В ФС FAT каталоги размещены отдельно от самой FAT и хранят имя файла, адрес его первого блока и некоторые другие сведения для некоторой группы файлов (рис.4). В ОС MS-DOS, как и в большинстве современных ОС, каталоги могут содержать подкаталоги (специфицируемые битом атрибута), что позволяет конструировать произвольное дерево каталогов файловой системы
Для доступа к файлу используется путь (pathname). Запись в каталоге связывает имя файла или имя поддиректории с блоками данных на диске. Номер первого блока используется в качестве индекса в таблице FAT. Далее по связанному списку могут быть найдены остальные блоки.
5.4. ФС современных ОС
5.4.1. Общие принципы организации современных ФС
Структуры файловых системсовременных ОС отличаются большим разнообразием, однако можно выделить несколько общих идей. Практически все современные ФС обеспечивают произвольный доступ как к файлам, так и к их блокам, разделяют список свободных блоков и структуры, отслеживающие размещение файлов. Чаще всего вместо списка свободных блоков используется битовая карта, в которой каждому блоку соответствует один бит: занят/свободен. В свою очередь, список блоков для каждого файла обычно связан с управляющей структурой файла.
Такую структуру обычно выносят в отдельные структуры, часто собранные в специальные таблицы описателей файлов – таблицу инодов, метафайл и т.д. Это уменьшает объем каталога и, соответственно, ускоряет поиск файла по имени. К тому же многие ФС с целью ускорения поиска сортируют записи в каталоге по именам файлов.
Основным недостатком такой структуры является неустойчивость к аппаратным сбоям. Если система хранит отдельно список или карту свободных блоков, а отдельно списки блоков, выделенных каждому файлу, то операции выделения и освобождения блоков ЗУ не являются атомарными. Как следствие, при аварийном прерывании операции выделения места могут либо теряться блоки (если сначала удаляется блок из списка свободных), либо могут получаться блоки, которые одновременно считаются и свободными, и занятыми (если сначала выделяется блок файлу).
Первая ситуация достаточно неприятна, вторая же просто недопустима: первый же файл, созданный после перезагрузки системы, может заново занять уже использованный блок. Поэтому все ОС, использующие файловые системы такого типа (системы семейства UNIX, OS/2, Windows NT и т.д.), после аварийной перезагрузки проверяют свои ФС. Это увеличивает время перезагрузки в несколько раз; но снижает риск потерять данные при сбое.
Многие из современных ФС обладают дополнительными функциями, такими как защита от физических ошибок, сжатие данных, шифрование, квоты дискового пространства для пользователей, возможность кодирования имени файла в Unicode и т.д
5.4.2. ФС HPFS
В ФС HPFS (high performance file system - OS/2), каждая запись в каталоге содержит имя файла и указатель на fnode (файловую запись). Каталоги в этой ФС организованы в виде B-деревьев и отсортированы по именам файлов.
Файловая запись размешается перед началом первого экстента файла, хотя это и не обязательно. Она занимает один блок (512 байт) и может содержать до десяти описателей экстентов, выделенных файлу. Описатель каждого экстента задает его начальный блок и длину экстента. Кроме того, fnode содержит информацию о времени создания файла, его имени и расширенных атрибутах. Если для списка экстентов или расширенных атрибутов места не хватает, то для них также выделяются экстенты. Максимальное количество экстентов в файле не ограничено ничем, кроме размера диска. HPFS упрощает произвольный доступ к файлу: вместо прослеживания цепочки блоков нужно проследить цепочку экстентов, которая гораздо короче.
Пользовательская программа может указать размер файла при его создании. В этом случае система сразу попытается выделить место под файл так, чтобы он занимал как можно меньше экстентов. Если программа не сообщила размера файла, используется значение по умолчанию. HPFS размещает место под файл по принципу worst fit (наименее подходящего), начиная выделение с наибольшего непрерывного участка свободного пространства. В результате фрагментированными оказываются только файлы, длина которых увеличивалась во много приемов или те, которые создавались при почти заполненном диске.
Вместо списка свободных блоков используется битовая карта диска, в которой каждому блоку соответствует один бит: занят/свободен.
Экстенты открытых файлов и карта свободных блоков во время работы размещаются в ОЗУ, поэтому производительность такой ФС в большинстве ситуаций намного (в 1.5 - 2 раза и более) выше, чем у FAT без кэша.
5.4.3. ФС NTFS
NTFS включает несколько системных файлов метаданных, которые скрыты от просмотра на томе и используются только файловой системой. Каталоги в NTFS, также как и в HPFS отсортированы по именам файлов в виде B-деревьев.
Системный файл | Имя файла | Описание |
Master File Table (главная файловая таблица) | $Mft | Список содержимого тома NTFS |
Master File Таblе2 (копия главной файловой таблицы) | $MftMirr | Зеркальное отображение наиболее важных частей MFT, используется для гарантирования доступа к MFT в случае сбоя одиночного сектора |
Log File (регистрационный файл) | $LogFile | Список шагов транзакции используемых Log File System для восстановления состояния (recoverability) |
Volume (том) | $Volume | Имя версия и другая информация о томе |
Attribute Definition (определение атрибутов) | $AttrDef | Таблица имен атрибутов номеров и дескрипторов |
Root Filename Index (индекс корня файловых имен) | $ | Корневой каталог |
Cluster Bitmap (битовый массив кластеров) | $Bitmap | Описание содержимого тома показывающее какие кластеры использованы |
Boot File (загрузочный файл) | $Boot | Содержит информацию начальной загрузки для тома если том является загрузочным |
Bad Cluster File (файл плохих кластеров) | $BadClus | Содержит указание положения плохих кластеров тома |
5.4.4. ФС ОС семейства UNIX
В этих ФС каталог не содержит почти никакой информации о файле. Там хранится только имя файла и номер его инода (i-node - index node: индексная запись). Иноды всех файлов в данной ФС собраны в таблицу. В ранних версиях UNIX таблица инодов занимала фиксированное пространство в начале устройства; в современных файловых системах эта таблица разбита на участки, распределенные по диску.
Например, в файловой системе BSD UNIX FFS (Fast File System - быстрая файловая система), которая в UNIX SVR4 называется просто UFS (UNIX File System), диск разбит на группы цилиндров. Каждая группа цилиндров содержит битовую карту свободных блоков для данного участка и таблицу инодов для файлов, расположенных в пределах этого участка.
Инод хранит информацию о самом файле и его размещении на диске. Инод описывает:
- тип файла ( является данный объект файлом данных или специальным файлом). В этом же поле закодированы права доступа к файлу;
- идентификаторы хозяина файла и группы, к которой хозяин принадлежит;
- времена: создания файла, последней модификации файла, последнего доступа к файлу;
- длину файла;
- идентификатор файловой системы, в которой расположен файл;
-счетчик связей файла.
Структура, описывающая физическое размещение файла по диску, недоступна пользовательским программам. В ФС Veritas это список экстентов, похожий на HPFS; в файловых системах s5, Xenix и FFS это массив из 13 чисел, задающих номера физических блоков файла. Если файл в s5 содержит более десяти блоков, то предпоследние три указателя обозначают не блоки данных, а так называемые косвенные блоки (indirection blocks), в которых хранятся указатели на следующие блоки данных и, возможно, на следующие косвенные блоки.
Особенность ФС Unix состоит в том, что инод не содержит имени файла. С другой стороны, он содержит счетчик связей - ссылок на этот файл из каталогов (рис.5). Т.е. на один и тот же инод можно ссылаться из различных каталогов или из одного каталога под различными именами, следовательно, один и тот же файл в этих ФС может иметь несколько различных имен. В частности, структура каталогов в ОС UNIX не обязана являться деревом и иметь статическую структуру (монтирование ФС).
Это свойство предоставляет неограниченную свободу для организации иерархии каталогов, но имеет и некоторые оборотные стороны.
- Создание нескольких связей для каталога потенциально опасно - оно может привести к возникновению кольца, в котором каталог является своим собственным подкаталогом. Отслеживать такую ситуацию сложно, поэтому разработчики ОС UNIX запретили создавать дополнительные имена для каталогов.
- Чтобы удалить файл, нужно проследить все его связи. Поэтому UNIX не имеет средств для удаления файла, а имеет только системный вызов unlink - удалить связь. Когда у файла не остается связей, он действительно удаляется.
При такой организации ФС стирание файла - это операция не над файлом, а над каталогом, поэтому для удаления файла не нужно иметь никаких прав доступа к нему. Достаточно иметь право записи в каталог. Поэтому нельзя защитить индивидуальный файл от стирания: надо либо закрывать на запись весь каталог, либо открывать его на запись и тогда не защищен от случайного удаления.
5.5. Формат имен файлов
В различных ФС допустимое имя файла может иметь различную длину, и в нем могут использоваться различные наборы символов. Так, в RT-11 и RSX-11 имена файлов состоят из символов кодировки RADIX-50 и имеют длину 9 символов: 6 символов - собственно имя, а 3 - расширение. При этом имя имеет вид "XXXXXX.XXX", но символ '.' не является частью имени - это просто знак препинания. Предполагается, что расширение должно соответствовать типу данных, хранящихся в файле:.SAV будет именем абсолютного загружаемого модуля,.FOR - программы на Фортране, …
В CP/M, MS DOS, DR DOS имена файлов хранятся в 8-битной ASCII-кодировке (разрешено использование только букв верхнего регистра, цифр и некоторых печатаемых символов). При этом имя файла имеет 8 символов + 3 символа расширения. Например, имена файла FAT имеют следующую форму:
[ [Диск:]] [[каталог \]] имя файла [[.расширение]]
Параметр «диск» должен быть именем существующего логического диска (А – Z). После имени диска ставится двоеточие (:).
Параметр «каталог» определяет каталог, который содержит файл. Это значение отделяется от имени файла наклонной чертой влево (\). Если указанный каталог не является текущим, то параметр «каталог» должен включать имена всех каталогов в пути файла, разделенных наклонными чертами влево. Имя каталога может состоять из любой комбинации до восьми символов, цифр или следующих специальных символов: $ % ' - _ {} ~ `! * ()
«Имя файла» и «расширение» определяют файл. «Имя файла» - любая комбинация до восьми символов, цифр, или специальных символов, перечисленных выше; «расширение» - любая комбинация до трех символов, цифр, или специальных символов. «Имя файла» может также включать пробелы. Например, строка "диск 1" -правильное имя файла. FAT не делает различия между символами нижнего и верхнего регистра
В ОС семейства UNIX имя файла может состоять из любых символов кодировки ASCII, кроме символов '\000' и '/', например, из восьми символов перевода каретки. При этом '\000' является ограничителем имени, а '/' - разделителем между именем каталога и именем файла. Никакого разделения на имя и расширение нет, и хотя имена файлов с программой на языке C заканчиваются ".c", а объектных модулей - ".o", точка здесь является частью имени. В UNIX SVR3 длина имени файла ограничена 14 символами, а в BSD UNIX, Linux и SVR4 - только длиной блока на диске, т.е. 512 байтами или более. При этом нулевой символ считается концом имени в каталоге.
Современные ОС также поддерживают длинные имена файлов. Например, OS/2, использующая файловую систему HPFS (High Performance File System - высокопроизводительная файловая система), поддерживает имена файлов длиной до 256 символов, содержащие печатаемые символы и пробелы. Точка считается частью имени, как и в UNIX, и можно создавать имена, содержащие несколько точек.
В ФС NTFS длина имени файла до 255 символов; полная длина пути – до 32 767 символами. Имена файлов кодируются в Unicode, что позволяет использовать любые национальные символы. ФС NTFS чувствительна к регистру символов.
Некоторые ОС, например, RSX-11 и VMS, поддерживают также номер версии файла. В каталоге может существовать несколько версий файла с одним именем; если номер версии при открытии файла не задается, то открывается последняя версия.
5.6. Идентификация типа файла
ФС предоставляет системе и программисту информацию о структуре хранящихся данных, но не дает никаких сведений о смысле и форме представления этих данных. Например, с точки зрения ФС исходный текст программы на языке C и документ в формате Word совершенно идентичны: и то и другое представляет собой текстовый файл. Поэтому желательно связать с файлом какую-то метаинформацию: в каком формате хранятся данные, какие операции над ними допустимы, а иногда и сведения о том, кому и зачем эти данные нужны.
5.6.1. Объектно-ориентированный подход
Наиболее общим решением этой проблемы был бы объектно-ориентированный подход, в котором файл данных рассматривается как объект, а допустимые операции – как методы этого объекта. Но ни в одной из ОС эта идея в полной мере не реализована, хотя пользовательские интерфейсы многих современных ОС предоставляют возможность ассоциировать определенные действия с файлами различных типов. Так, например в ФС NTFS ОС Windows можно связать ту или иную программу с файлами, имеющими определенное расширение, например, программу MS Word с файлами, имеющими расширение «DOC» и автоматически запускать MS Word при выборе такого файла.
5.6.2. Расширение имени файла
Первые попытки ассоциировать с файлом признак типа были сделаны еще в 60 гг. При этом идентификатор типа добавлялся к имени файла в виде короткой мнемонической последовательности символов - расширения (extension). В большинстве современных ОС расширение отделяется от имени символом '.'. Многие ОС, разработанные в 70-е гг., такие как RT-11, RSX-11, VAX/VMS, CP/M, навязывают программисту разделение имени на собственно имя и расширение, интерпретируя точку в имени файла как знак препинания. В таких системах имя может содержать только одну точку и соответственно иметь только одно расширение. Напротив, в ОС нового поколения - OS/2, Windows реализована поддержка имен файлов свободного формата, которые могут иметь несколько каскадированных расширений, как и в UNIX.
В ОС семейства UNIX имя файла может содержать несколько символов '.', и, таким образом, файл может иметь несколько каскадированных расширений. Например, файл "main.C" - это программа на языке C; "main.C.gz" – это программа на языке C, упакованная архиватором GNU Zip; "main.C.gz.crypt" – это программа, которую упаковали и потом зашифровали; наконец, "main.C.gz.crypt.uue" - это упакованная и зашифрованная программа, преобразованная в последовательность печатаемых символов кода ASCII.
В принципе расширения являются вполне приемлемым и во многих отношениях даже очень удобным способом идентификации типа файла. Одно из удобств состоит в том, что для использования этого метода не нужно никаких или почти никаких усилий со стороны ОС: просто программы договариваются интерпретировать имя файла определенным образом. Например, стандартный драйвер компилятора в системах семейства UNIX - программа cc - определяет тип файла именно по расширению. Это же является и недостатком, т.к. ФС не контролирует расширений и программисты имеют возможность трактовать их произвольным образом. Похожая ситуация имеет место в системах семейства UNIX, где бинарные загрузочные модули и командные файлы вообще не имеют расширения.
5.6.3. Использование магических чисел
Разработчики UNIX столкнулись с этой проблемой еще в 70 гг. В качестве решения они предложили использовать магические числа (magic number) - соглашение о том, что файлы определенного формата содержат в начале определенный байт или последовательность байтов. Первоначально это были численные коды; файл /etc/magic содержал коды, соответствующие известным типам файлов. Позднее в качестве магических чисел стали использоваться длинные текстовые строки. Так, например, изображения в формате Compuserve GIF 87a должны начинаться с символов GIF87a.
Легко понять, что магические числа ничуть не лучше расширений, а во многих отношениях даже хуже. Например, пользователь, просмотрев содержимое каталога, не может сразу узнать типы содержащихся в ней файлов. Еще хуже ситуация, когда расширение файла не соответствует его реальному типу. Это будет вводить в заблуждение не только пользователя, но и некоторые программы, полагающиеся при определении формата на расширение вместо магического числа.
5.6.4. Использование атрибутов файла
Пытаясь как-то решить проблему идентификации типа файла, разработчики Macintosh отказались как от расширений, так и от магических чисел. В MacOS каждый файл состоит из двух частей или ветвей (forks): ветви данных (data fork) и ветви ресурсов (resource fork). Кроме идентификатора типа файла, ветвь ресурсов хранит информацию о:
-иконке, связанной с этим файлом;
-расположении иконки в открытой папке (folder);
-программе, которую нужно запустить при ``открытии'' этого файла.
Еще дальше в этом же направлении пошли разработчики системы OS/2. В этой системе с каждым файлом связан набор расширенных атрибутов (extended attributes). Атрибуты имеют вид ИМЯ:ЗНАЧЕНИЕ. При этом значение может быть как текстовой строкой, так и блоком двоичных данных произвольного формата и размера. Некоторые расширенные атрибуты используются оболочкой Workplace Shell (WPS) как эквивалент ветви ресурсов в MacOS: для идентификации типа файла, связанной с ним иконы и размещения этой иконы в открытом окне. Тип файла идентифицируется текстовой строкой. Например, программа на языке C идентифицируется строкой C code. Это резко уменьшает вероятность конфликта имен типов - ситуацию, довольно часто возникающую при использовании расширений или магических чисел. Другие атрибуты могут использоваться для других целей. Например, LAN Server - файловый сервер фирмы IBM - использует расширенные атрибуты для хранения информации о собственнике файла и правах доступа к нему. Некоторые текстовые редакторы используют расширенные атрибуты для хранения положения курсора при завершении последней сессии редактирования, так что пользователь всегда попадает в то место, где он остановился в прошлый раз.
5.7.
Большинство современных ОС рассматривают файл как неструктурированную последовательность байт переменной длины. В стандарте POSIX над файлом определены следующие операции:
- i nt open(char * fname, int flags, mode_t mode). Параметр fname задает имя файла. flags - это битовая маска, определяющая режим открытия файла. Файл может быть открыт только на чтение, только на запись и на чтение и запись; кроме того, можно открывать существующий файл, а можно пытаться создать новый файл нулевой длины. Необязательный третий параметр mode используется только при создании файла и задает атрибуты этого файла. Эта операция открывает файл, устанавливая соединение между программой и файлом. При этом программа получает дескриптор файла - целое число, идентифицирующее данное соединение, - индекс в системной таблице открытых файлов для данной задачи. Все остальные операции используют этот индекс для ссылки на файл.
-off_t lseek(int handle, off_t offset, int whence). Эта операция перемещает указатель чтения/записи в файле. Параметр offset задает количество байт, на которое нужно сместить указатель, а параметр whence - откуда отсчитывать смещение. Предполагается, что смещение можно отсчитывать от начала файла, от его конца и от текущего положения указателя. Операция возвращает положение указателя, отсчитываемое от начала файла.
- i nt read(int handle, char * where, size_t how_much). Операция чтения из файла. Указатель where задает буфер, куда нужно поместить прочитанные данные; третий параметр указывает, сколько данных надо считать. Система считывает требуемое число байт из файла, начиная с указателя чтения/записи в этом файле, и перемещает указатель к концу считанной последовательности. Если файл кончился раньше, считывается столько данных, сколько оставалось до его конца. Операция возвращает количество считанных байт. Если файл открывался только для записи, вызов read возвратит ошибку.
- i nt write(int handle, char * what, size_t how_much). Операция записи в файл. Указатель what задает начало буфера данных; третий параметр указывает, сколько данных надо записать. Система записывает требуемое число байт в файл, начиная с указателя чтения/записи в этом файле, заменяя хранившиеся в этом месте данные, и перемещает указатель к концу записанного блока. Если файл кончился раньше, его длина увеличивается. Операция возвращает количество записанных байт. Если файл открывался только для чтения, вызов write возвратит ошибку.
- i nt ioctl(int handle, int cmd,...); int fcntl(int handle, int cmd,...). Дополнительные операции над файлом. Первоначально, по-видимому, предполагалось, что ioctl - это операции над самим файлом, а fcntl - это операции над дескриптором открытого файла, но потом историческое развитие несколько перемешало функции этих системных вызовов. Стандарт POSIX определяет некоторые операции как над дескриптором, например дублирование (в результате этой операции мы получаем два дескриптора, связанных с одним и тем же файлом), так и над самим файлом, например, операцию truncate - обрезать файл до заданной длины. В большинстве версий UNIX операцию truncate можно использовать и для вырезания данных из середины файла. При считывании данных из такой вырезанной области считываются нули, а сама эта область не занимает физического места на диске. Важной операцией является блокировка участков файла. Стандарт POSIX предлагает для этой цели библиотечную функцию, но в системах семейства UNIX эта функция реализована через вызов fcntl. Большинство реализаций стандарта POSIX предлагает и свои дополнительные операции. Так, в UNIX SVR4 этими операциями можно устанавливать синхронную или отложенную запись и т.д.
-caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int handle, off_t offset). Отображение участка файла в виртуальное адресное пространство процесса. Параметр prot задает права доступа к отображенному участку: на чтение, запись и исполнение. Отображение может происходить на заданный виртуальный адрес, или же система может выбирать адрес для отображения сама.
-Еще две операции выполняются уже не над файлом, а над его именем: это операции переименования и удаления файла. В некоторых системах, например в системах семейства UNIX, файл может иметь несколько имен, и существует только системный вызов для удаления имени. Файл удаляется при удалении последнего имени.
======================================================================================
ВОПРОСЫ:
1.Понятие файла, файлового менеджера и файловой системы ОС
2.Назначение и основные функции файловых систем
3.Файловые системы последовательного доступа
4.Блочная и кластерная адресация файлов
5.Файловая система индексно-последовательной организации
6.Недостатки ФС в виде связанного списка блоков
7.Файловая система FAT
8.Организация и использование каталогов в FAT
9.Общие принципы организации современных ФС
10. Файловая система HPFS
11. Файловая система NTFS
12. Файловые системы ОС семейства UNIX
13. Форматы имени файлов разных ОС
14. Идентификация типа файла по его расширению
15. Идентификация типа файла по магическим числам
16. Идентификация типа файла по его атрибутам
17. Операции над файлами по стандарту POSIX
18. Понятие дескриптора файла (по POSIX)