Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы СПО 11-20!!!.docx
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
419 Кб
Скачать
☆

19.Последовательный файл. Файл прямого доступа. Иные формы организации файлов. Операции над файлами.

Организация файлов и доступ к ним

Программист воспринимает файл в виде набора однородных записей. Запись - это наименьший элемент

данных, который может быть обработан как единое целое прикладной программой при обмене с внеш-

ним устройством. Причем в большинстве ОС размер записи равен одному байту. В то время как прило-

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

(обычно блоками). Поэтому записи объединяются в блоки для вывода и разблокируются - для ввода. Во-

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

ОС поддерживают несколько вариантов структуризации файлов.

Последовательный файл

Простейший вариант - так называемый последовательный файл. То есть файл является последовательно-

стью записей. Поскольку записи, как правило, однобайтовые, файл представляет собой неструктуриро-

ванную последовательность байтов.

Обработка подобных файлов предполагает последовательное чтение записей от начала файла, причем

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

тельным (модель ленты). Если в качестве носителя файла используется магнитная лента, то так и делает-

ся. Текущая позиция считывания может быть возвращена к началу файла (rewind).

Файл прямого доступа

В реальной практике файлы хранятся на устройствах прямого (random) доступа, например на дисках, по-

этому содержимое файла может быть разбросано по разным блокам диска, которые можно считывать в

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

Здесь имеется в виду относительный номер, специфицирующий данный блок среди блоков диска, при-

надлежащих файлу. О связи относительного номера блока с абсолютным его номером на диске рассказы-

вается в следующей лекции.

Естественно, что в этом случае для доступа к середине файла просмотр всего файла с самого начала не

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

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

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

Таким образом, файл, состоящий из однобайтовых записей на устройстве прямого доступа, - наиболее

распространенный способ организации файла. Базовыми операциями для такого рода файлов являются

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

смотрены операторы посимвольной пересылки данных в файл или из него.

Подобную логическую структуру имеют файлы во многих файловых системах, например в файловых

системах ОС Unix и MS-DOS. ОС не осуществляет никакой интерпретации содержимого файла. Эта схе-

ма обеспечивает максимальную гибкость и универсальность. С помощью базовых системных вызовов

(или функций библиотеки ввода/вывода) пользователи могут как угодно структурировать файлы. В част-

ности, многие СУБД хранят свои базы данных в обычных файлах.

Другие формы организации файлов

Известны как другие формы организации файла, так и другие способы доступа к ним, которые использо-

вались в ранних ОС, а также применяются сегодня в больших мэйнфреймах (mainframe), ориентирован-

ных на коммерческую обработку данных.

Первый шаг в структурировании - хранение файла в виде последовательности записей фиксированной

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

операция записи переписывает или добавляет запись целиком. Ранее использовались записи по 80 байт

(это соответствовало числу позиций в перфокарте) или по 132 символа (ширина принтера). В ОС CP/M

файлы были последовательностями 128-символьных записей. С введением CRT-терминалов данная идея

утратила популярность.

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

торых содержит ключевое поле в фиксированной позиции внутри записи (см. рис. 11.1). Базисная опера-

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

ле последовательно (например, отсортированные по значению ключевого поля) или в более сложном по-

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

дексно-последовательным.

Рис. 11.1. Файл как последовательность записей переменной длины

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

Индекс обычно хранится на том же устройстве, что и сам файл, и состоит из списка элементов, каждый

из которых содержит идентификатор записи, за которым следует указание о местоположении данной за-

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

запись. Такие файлы называются индексированными, а метод доступа к ним - доступ с использовани-

ем индекса.

Предположим, у нас имеется большой несортированный файл, содержащий разнообразные сведения о

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

ка по одному из полей, например по фамилии студента. Рис. 11.2 иллюстрирует решение данной пробле-

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

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

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

ность данных.

Способ выделения дискового пространства при помощи индексных узлов, применяемый в ряде ОС (Unix

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

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

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

файла. Для больших файлов индекс может быть слишком велик. В этом случае создают индекс для ин-

дексного файла (блоки промежуточного уровня или блоки косвенной адресации).

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

Операционная система должна предоставить в распоряжение пользователя набор операций для работы с

файлами, реализованных через системные вызовы. Чаще всего при работе с файлом пользователь выпол-

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

ному имени, во-вторых, считать необходимые атрибуты файла в отведенную область оперативной памя-

ти и проанализировать права пользователя на выполнение требуемой операции. Затем следует выполнить

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

примера основные файловые операции ОС Unix [Таненбаум, 2002].

• Создание файла, не содержащего данных. Смысл данного вызова - объявить, что файл существует,

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

в каталог.

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

• Открытие файла. Перед использованием файла процесс должен его открыть. Цель данного сис-

темного вызова - разрешить системе проанализировать атрибуты файла и проверить права доступа

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

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

блока файла. Дескриптор (описатель) файла хранит всю информацию о нем. Иногда, в соответст-

вии с парадигмой, принятой в языках программирования, под дескриптором понимается альтерна-

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

при последующей работе с файлом . Например, на языке Cи операция открытия файла

fd=open(pathname,flags,modes); возвращает дескриптор fd, который может быть задействован при

выполнении операций чтения (read(fd,buffer,count); ) или записи.

• Закрытие файла. Если работа с файлом завершена, его атрибуты и адреса блоков на диске больше

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

файловой системы.

• Позиционирование. Дает возможность специфицировать место внутри файла, откуда будет произ-

водиться считывание (или запись) данных, то есть задать текущую позицию.

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

объем считываемых данных и предоставить для них буфер в оперативной памяти.

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

размер увеличивается, в противном случае запись осуществляется на место имеющихся данных,

которые, таким образом, теряются.

Есть и другие операции, например переименование файла, получение атрибутов файла и т. д.

Существует два способа выполнить последовательность действий над файлами [Олифер, 2001].

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

(схема stateless). Например, последовательность операций может быть такой: open, read1, close, ... open,

read2, close, ... open, read3, close.

Альтернативный способ - это когда универсальные действия выполняются в начале и в конце последова-

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

В этом случае последовательность вышеприведенных операций будет выглядеть так: open, read1, ... read2,

... read3, close.

Большинство ОС использует второй способ, более экономичный и быстрый. Первый способ более устой-

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

щей операции; поэтому он иногда применяется в распределенных файловых системах (например, Sun

NFS).