- •11. Семафоры. Концепция семафоров. Мониторы. Сообщения.
- •12.Условия возникновения тупиков. Основные направления борьбы с тупиками. Игнорирование проблемы тупиков. Способы предотвращения тупиков, алгоритм банкира
- •14.Простейшие схемы управления памятью. Схема с фиксированными разделами. Один процесс в памяти. Оверлейная структура. Динамическое распределение.
- •15.Физическая организация памяти компьютера. Локальность. Логическая память.
- •16.Понятие виртуальной памяти. Архитектурные средства поддержки виртуальной памяти. Страничная виртуальная память.
- •17.Сегментно-страничная организации виртуальной памяти. Структура таблицы страниц. Ассоциативная память. Инвертированная таблица страниц. Размер страницы.
- •18. Реализация директорий. Поиск в директории. Линейный поиск. Хеш-таблица. Монтирование файловых систем. Разделы диска. Связывание файлов.
- •19.Последовательный файл. Файл прямого доступа. Иные формы организации файлов. Операции над файлами.
- •20.Файловая система. Имена файлов. Типы файлов. Атрибуты файлов. Организация файлов и доступ к ним. Защита файлов. Контроль доступа к файлам. Списки прав доступа.
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).
