4. Ввод-вывод и файловая система. Файл С. из - polpoz.ru o_O
Главная
Поиск по ключевым словам:
страница 1
Похожие работы
4. Ввод-вывод и файловая система. Файл С. из - страница №1/1


Тема 4. Ввод-вывод и файловая система. Файл С. из

Тема 4. Ввод-вывод и файловая система

1. Файловая система ОС. Ее задачи


1.1. Понятие файловой системы

1.2. Задачи файловой системы

1.3. Уровни работы с файлами и организации файловой системы

2. Логическая организация файловой системы


2.1. Имена, типы, атрибуты

2.2. Организация каталогов

2.3. Логическая организация файлов

2.4. Файловые операции


3. Физическая организация файловой системы


3.1. Основные термины, касающиеся устройства дискового накопителя

3.2. Физическая организация и адресация файла

3.3. Некоторые файловые системы

4. Задачи подсистемы ввода-вывода. Обобщенная структура подсистемы

1. Файловая система ОС. Ее задачи


1.1. Понятие файловой системы

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

С другой стороны, понятие «файл» относится к объекту, вполне однозначно описываемому следующими признаками:



  • файл объединяет множество данных;

  • обладает именем;

  • с целью долговременного и надежного хранения информации располагается на внешнем устройстве;

  • предполагает многократное использование информации с разрывом во времени;

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

Последнее описание представляется вполне однозначным и при работе с файлами уточняется в зависимости от аспекта рассмотрения.

Файловая система как часть операционной системы – это подсистема, включающая:

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

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

Файловой системой называют также совокупность всех файлов на диске.

Использование одного и того же термина в двух смыслах как правило не приводит к недоразумениям, так как из контекста всегда ясно, о каком аспекте определения файловой системы идет речь – о средствах ОС или совокупности файлов.

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

1.2. Задачи файловой системы

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



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

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

  • поддержка различных типов файлов;

  • задание атрибутов файлов;

  • организация хранения множества файлов;

  • поддержка логической организации файлов;

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

Отображение логической модели на физическую организацию внешнего устройства, или, что то же, реализация этой модели на физическом уровне, предполагает следующее:

  • отображение (трансляция) имен файлов в адреса внешней памяти (сектора диска, адреса флэш-накопителя и т.п.);

  • размещение данных на устройстве;

  • обеспечение доступа к данным;

  • буферизация обмена;

  • организация совместного использования файлов (блокировка; предотвращение гонок и тупиков; согласование копий и др.);

  • защита файлов одного пользователя от несанкционированного доступа другого;

  • восстановление файлов в случае возникновения ошибок различного рода;

  • обеспечение устойчивости файловой системы к сбоям питания и программно-аппаратным ошибкам;

  • обеспечение работы с файлами в сети.

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

1.3. Уровни работы с файлами





Суть понятия «файл»

Средства работы, операции

Кто реализует

Программа

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

Описание представления файла в программе;

открытие, закрытие, чтение, запись осмысленными единицами;

множество операций, воспроизводящих операции ОС на уровне языка


Программист




Именованная область данных на внешнем устройстве.

Связывание логического представления файла с реальным (физическим) файлом

Компилятор, загрузчик

Операционная система

Последовательность байтов, возможно, структурированная с точки зрения ОС

Средства именования и задания свойств файлов;

организация множества файлов;

обеспечение доступа к файлам;

обработка;

обеспечение целостности.


ФС ОС







Организация хранения и обработки файла на устройстве

Средства управления внешней памятью

АпАппаратура

(«железо»)



Область, последовательность байтов на внешнем устройстве


Чтение или запись в заданном диапазоне физических адресов

Контроллеры












2. Логическая организация файловой системы


2.1. Имена, типы, атрибуты

Имена файлов

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

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

Ограничения на длину и структуру имени также различны и до недавнего времени были весьма сильными.

Так, в файловой системе FAT16 (Microsoft) структура имени подчиняется схеме «8.3» (8 символов - собственно имя, 3 символа - расширение имени). В ОС UNIX System V имя не может содержать более 14 символов.

Понятие расширения введено в MS DOS; в ОС UNIX оно отсутствует. Тенденция развития ФС такова, что ограничение на структуру имени снимается и в ОС семейства Microsoft: в имени файла может присутствовать более одной точки; однако в этих ОС последние 1 – 4 символа после точки сохраняют свою роль, так как распознаются приложениями. С другой стороны, в ОС UNIX также используются соглашения об именовании файлов, согласно которым тип файла в имени отделяется точкой.

Современные файловые системы, как правило, поддерживают длинные символьные имена файлов. Например, Windows NT в файловой системе NTFS устанавливает, что имя файла может содержать до 255 символов, не считая завершающего нулевого символа.

В некоторых системах одному и тому же файлу не может быть дано несколько разных имен (например, в ОС семейства Microsoft). В других такое ограничение отсутствует (например, в ОС UNIX). В последнем случае файл не имеет имени как такового. С каждым файлом ФС связывает индексный дескриптор, хранящий метаданные, содержащие все характеристики файла. Имя файла является указателем на его метаданные и, как следствие, на одни и те же метаданные может указывать несколько указателей. Действия по заданию альтернативных имен (псевдонимов) осуществляются командами ОС.

Типы файлов



Обычные файлы содержат информацию произвольного характера, которую заносит в них пользователь или программа, системная или пользовательская. Содержание такого файла определяется приложением, которое с ним работает. Системное или стандартное приложение создает и распознает файлы своего собственного формата (текстовый редактор Word – файлы .doc, графическая программа Photoshop - .psd, .tif и т.п.); пользовательское приложение интерпретирует содержимое файла в соответствии с задачей и способом ее решения.

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



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

Организация каталогов и их содержимое различаются в разных ОС, в частности, в MS DOS, Windows и Unix.

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

Каталог MS DOS хранит имена файлов и целый ряд атрибутов – дату и времена создания, последнего доступа и изменения; текущий размер файла; признаки "только для чтения", "архивный файл", "скрытый файл", "системный файл"; номер начального кластера файла.



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

Символьная связь (Unix) – особый тип файла, позволяющий косвенно адресовать другой файл.

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



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

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

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

Ниже перечислены возможные атрибуты, для некоторых из которых указываются ФС, где они используются:



  • тип файла;

  • владелец файла (NTFS, Unix);

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

  • пароль для доступа к файлу (NTFS, Unix);

  • информация о возможности доступа (права доступа) (NTFS, Unix);

  • времена создания; последнего доступа и последнего изменения (везде);

  • текущий размер файла (везде);

  • максимальный размер файла;

  • признак "только для чтения";

  • признак "скрытый файл"; FAT, NTFS;

  • признак "системный файл"; носят информативно-рекомендательный характер

  • признак "архивный файл";

  • признак "двоичный/символьный" (Unix);

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

  • признак блокировки (NTFS, Unix);

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

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

  • длина ключа.

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

2.2. Организация каталогов

Дерево каталогов

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

В ОС Windows дисковое пространство разбивается пользователем на несколько логических дисководов, каждый из которых содержит свое дерево каталогов, не связанное с деревьями других дисководов.

В ОС UNIX все доступное пользователям файловое пространство объединено в единое дерево каталогов.

Каждый файл регистрируется только в одном каталоге. Каждый каталог имеет имя и может быть зарегистрирован в другом каталоге. Если каталог X зарегистрирован в каталоге Y, то X – подкаталог Y, а Y – надкаталог X.

Каталог высшего уровня – главный, или корневой. Он один, не имеет имени и обозначается в Windows как <имя дисковода>:\ , а в UNIX – как / (прямой слэш), без указания накопителя.

Текущий каталог – тот, с которым в текущий момент работает пользователь.

Простое, полное и относительное имя файла



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

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

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

Полное имя однозначно идентифицирует файл.

Если в некоторой команде указано полное имя файла, то он доступен из любого каталога.

Если путь не указан, то подразумевается текущий каталог. При таком указании имени файлы одного каталога недоступны из другого.



Относительное имя файла – путь от текущего каталога к файлу с приписанным через слэш простым именем файла.

Пример дерева каталогов для Windows приведен на рис. 4.1.





Рис. 4.1. Пример дерева каталогов

Здесь, например, пути от корневого каталога к файлам l.txt и s.doc, не включая корневой каталог:

P\E и C\I\J соответственно.

Пусть изображенная на рисунке система каталогов размещена на диске А:. Тогда полные имена файлов l.txt и s.doc запишутся так:

A:\P\E\ l.txt и A:\C\I\J\ s.doc соответственно.

Монтирование

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

Файловая система ОС UNIX организует единое дерево каталогов путем монтирования, или присоединения произвольной файловой системы к общему дереву каталогов в любой его точке.

Одно из устройств является системным. На нем находятся загрузчик и все основные файлы системы. Корневой каталог этого устройства считается корневым каталогом (root) системы. Пусть соответствующее дерево каталогов – файловая система 1 (ФС1).

Пусть имеется отдельная файловая система 2 (ФС2).

Монтирование ФС2 к некоторому каталогу ФС1 состоит в присоединении ФС2 к этому каталогу как корню. ФС2 станет поддеревом единого дерева ФС1. Соответствующая иллюстрация приведена на рис. 4.2.



Рис. 4.2. Иллюстрация операции монтирования файловых систем в Ос Unix

2.3. Логическая организация файлов

Два подхода к логической организации файлов

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

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

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

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

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

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



Способ доступа к записям файла определяет порядок их обработки (считывания – записи). Возможны два способа доступа:

  • последовательный – доступной для обработки является запись, непосредственно следующая за обработанной; так, если была обработана 3-я запись, то доступной является только 4-я; чтобы получить доступ к 5-й, надо обработать (хотя бы пропустить) 4-ю;

  • прямой – каждая запись имеет некоторый ключ; доступной для обработки является запись с заданным ключом, вне зависимости от того, какая запись была доступна перед этим; так, если ключом является номер записи и была обработана 3-я запись, то получить доступ к 5-й можно, указав ее номер в соответствующих операторах.

Способ доступа к записям и способ структурирования файла взаимосвязаны. Реально операционными системами поддерживается (или поддерживалось) небольшое число схем структурирования, три из которых приведены на рис. 4.3 – 4.5.



Рис. 4.3. Последовательная организация с записями фиксированной длины

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



Рис. 4.4. Последовательная организация с записями переменной длины

Для каждой записи задается ее длина. Возможен только последовательный доступ, так как вычислить адрес некоторой записи по ее номеру нельзя.





Рис. 4.5. Прямая организация. Индексированный файл

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

Расширением этого способа организации является индексно-последовательная организация, когда адрес индексной таблицы указывает на группу записей, просматриваемых последовательно.

На уровне программирования способ доступа определяется операциями языка программирования.

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

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

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

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

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

2.4. Файловые операции

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



  • открытие файла;

  • закрытие файла;

  • создание файла (может быть совмещено с открытием);

  • назначение файла (может быть совмещено с открытием);

  • чтение из файла;

  • запись в файл;

  • прямой доступ к файлу.

Эти операции представлены на уровне операционной системы в виде системных функций. Так, соответствующие функции в ОС Windows предоставляются пользовательским программным интерфейсом WinAPI; ОС Unix предоставляет два основных интерфейса для ввода-вывода: так называемый низкоуровневый, функции которого непосредственно взаимодействуют с ядром системы, и стандартную библиотеку ввода-вывода.

И в том, и в другом случае должна быть написана программа, содержащая вызовы функций, на языке, компилятор с которого понимает системные вызовы. Фактически ведущим системным языком является Си (в том числе для Windows). К функциям WinAPI можно обратиться также из программы на object-паскале и иных языках.

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

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

Тем не менее каждый класс можно распознать по именам функций, которые включают корневую часть термина, определяющего суть функции: open, close, creat, assign, read, get, write, put, seek. Полные описания соответствующих функций относятся к документации операционной системы и требуются при непосредственной работе на системном уровне в конкретной ОС. Здесь мы рассмотрим только суть перечисленных классов системных операций и приведем имена некоторых функций.

Открытие файла

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

Unix: open, fopen (функции с префиксом f относятся к стандартной библиотеке ввода-вывода).

Windows: CreateFile, mmioOpen.

Закрытие файла

Разрывает связь между открытым файлом и указателем на файл.

Unix: close, fclose.

Windows: Функция CloseHandle (используется в том числе и для закрытия файлов).

Создание файла (может быть совмещено с открытием)



Unix: creat.

Windows: CreateFile.

Чтение из файла

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

Unix: read, fread.

Windows: ReadFile.

Запись в файл

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

Unix: write, fwrite.

Windows: WriteFile.

Прямой доступ к файлу

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

Unix: lseek, fseek.

Windows: mmioSeek.

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



1 В UNIX пользователь, желая иметь в некотором каталоге файл из другого каталога, может соответствующей командой установить так называемую символьную связь, т.е. ссылку на существующий файл. В таком случае, если помнить об этой ссылке, дерево преобразуется в сеть. Учитывая, однако, что, установив эту связь, пользователь далее считает нужный файл размещенным в его каталоге и работает с деревом, все же правомернее на логическом уровне считать общую структуру каталогов древовидной (как, кстати, она и представляется в литературе).



izumzum.ru