Операционные системы
означает, что нужно прочесть ИД родителя и по нему добраться до содержимого
каталога А. Затем в файле-каталоге А надо выбрать строку с именем В и
определить ИД файла В, а затем произвести открытие файла. Вся эта операция
довольно трудоемка, однако учитывая то, что файлы открываются не часто, это
не будет сказываться на скорости работы системы.
Мы говорили, что с одним и тем же содержимым может ассоциироваться
несколько имен, т.е. одновременно могут быть открыты файлы с одним и тем же
ИД. Возникает проблема - как синхронизируется работа с содержимым файла в
случае его открытия разными процессами или с разными именами. В UNIX-е это
решается достаточно корректно (это мы рассмотрим несколько позже).
Специальные файлы устройств
Мы уже знаем два типа файлов: файлы-каталоги и рабочие файлы, в
которых хранятся данные. Есть третья разновидность - файлы устройств. Эта
разновидность характеризуется типом, указанным в ИД. Содержимого у файлов
устройств нет, а есть только ИД и имя. В ИД указывается информация о том,
какой тип устройства ассоциирован с этим файлом: байт-ориентированное
устройство или блок-ориентированное устройство. Байт-ориентированное
устройство - это то устройство, обмен с которым осуществляется по одному
байту (например, клавиатура). Блок-ориентированное устройство - это
устройство, с которым обмен может осуществляться блоками.
Также имеется поле, определяющее номер драйвера, связанного с этим
устройством (у одного устройства может быть несколько драйверов, но не
наоборот). Это поле, на самом деле, есть номер в таблице драйверов
соответствующего класса устройств. В системе имеются две таблицы: для блок-
и для байт-ориентированных устройств. Также в ИД определен некоторый
цифровой параметр, который может быть передан драйверу в качестве
уточняющего информацию о работе.
Организация обмена данными с файлами
Определим сначала, что является низкоуровневым вводом/выводом в
системе. В файловой системе UNIX-а определены некоторые специальные
функции, которые называются системными вызовами. Системные вызовы
осуществляют непосредственное обращение к операционной системе, то есть это
функции, выполняющие некоторые действия операционной системы. Реализация
системных и библиотечных функций (например, математических) в корне
отличается. Если библиотечная функция будет подгружена в тело процесса,
который пользуется этой библиотекой, то все действия в большинстве случаев
будут выполняться в пределах этого процесса, а системный вызов сразу же
передает управление операционной системе и она выполняет заказанное
действие. В UNIX-е для обеспечения низкоуровнего ввода/вывода, т.е.
ввода/вывода, который реализуется посредством системных вызовов, имеется
набор функций. Вот основные из них:
1. open - Открытие имеющегося файла. Одним из параметров этой функции
является строка с именем файла, а возвращает она некоторое число,
которое называется дескриптором файла. В теле процесса пользователя,
а также в данных, ассоциированных с этим процессом, размещается
(кроме кода и данных, разумеется) некоторая служебная информация, в
частности, таблица файловых дескрипторов. Она, как и все таблицы в
системе UNIX, позиционная, т.е. номер дескриптора соответствует
номеру записи в этой таблице. С файловым дескриптором (ФД)
ассоциировано имя файла и все необходимые атрибуты для работы с ним.
Номера ФД уникальны в пределах одного процесса. Есть аналогичная
функция create - функция открытия нового файла.
2. read/write - системные вызовы чтения/записи, параметрами которых
является номер ФД и некоторые атрибуты, которые не так важны для
нашего рассмотрения.
3. close - системный вызов завершения работы с файлом, параметром
которого является номер ФД. После обращения к этой функции ФД
становится свободным, а работа данного процесса с файлом завершается.
Вот некоторые системные вызовы, обеспечивающие ввод/вывод (кстати, они
почти не добавляют кода к вашей программе). Подробности посмотрите
самостоятельно. Я обратил ваше внимание, что это системные вызовы, потому
что ввод/вывод можно осуществлять и через библиотеки ввода/вывода. Для
этого существует, так называемый, файловый обмен и функции fopen, fread, и
т.д. (с префиксом f). Это библиотечные функции. Эти функции сами обращаются
к низкоуровневым функциям внутри себя.
Рассмотрим организацию обмена с системной точки зрения в операционной
системе UNIX. При организации обмена операционная система подразделяет
данные на две категории: данные, ассоциированные с процессом пользователя,
и данные, ассоциированные с операционной системой.
Таблица индексных дескрипторов открытых файлов. Первая таблица данных,
ассоциированных с операционной системой, - таблица индексных дескрипторов
открытых файлов (ТИДОФ). Эта таблица содержит записи, каждая из которых
содержит копию индексного дескриптора для каждого открытого в системе
файла. Через эту копию осуществляется доступ к блокам файлов. Каждая
записей таблицы содержит также поле, характеризующее количество открытых в
системе файлов, использующих данный дескриптор (счетчик). То есть, если
один и тот же файл открыт от имени двух процессов, то запись в ТИДОФ
создается одна, но каждое дополнительное открытие этого файла увеличивает
счетчик на единицу.
Таблица файлов. Таблица файлов (ТФ) содержит информацию об имени
открытого файла, и имеет ссылку на ТИДОФ.
Лекция №9
Мы говорили, что система может работать с содержимым файла в том и
только том случае, если процесс зарегистрировал свое желание работать с
этим файлом. Факт такой регистрации называется открытием файла. При
открытии файла в пределах процесса каждому имени открываемого файла
(открываться может уже существующий файл, либо новый) ставится в
соответствие уникальное целое число, которое называется файловым
дескриптором (ФД). В пределах процесса ФД имеют нумерацию от 0 до k-1.
Значение k - это параметр настройки операционной системы, определяющий,
какое количество одновременно открытых файлов может быть у процесса. Здесь
следует отметить, что мы говорим о количестве одновременно открытых файлов
(так же написано в любой книжке по UNIX-у), однако, на самом деле, k - это
максимальное количество ФД, которые могут быть ассоциированы с одним
файлом, потому что один и тот же файл в пределах процесса можно открыть два
раза, и образуется два ФД. К чему это приведет, мы рассмотрим несколько
позже, но это вполне корректно. После открытия файла, все операции обмена
осуществляются через указания файлового дескриптора (т.е. имя более нигде
не указывается). С каждым файловым дескриптором ассоциирован ряд параметров
(о них чуть позже).
Давайте посмотрим, как организуется ввод/вывод, а точнее обработка
низкоуровнего обмена, с точки зрения операционной системы. Сейчас будет
рассказано о логической схеме организации ввода/вывода, ибо реальная схема
устроена несколько иначе, но это для нас не так важно.
Все данные, с которыми оперирует система, подразделяются на два
класса. Первый тип данных - данные, ассоциированные с операционной
системой, то есть общесистемные данные. К этим данным относится ТИДОФ.
Размер таблицы фиксирован и определяется количеством одновременно открытых
ФД. Каждая запись в этой таблице содержит некоторую информацию, среди
которой нас будет интересовать следующая:
1) Копия ИД открытого файла. Для любого открытого файла, ИД, который
характеризует содержимое этого файла, копируется и размещается в
ТИДОФ. После этого все манипуляции с файлом (например, изменение
адресации файла) происходят с копией ИД, а не с самим ИД на диске.
ТИДОФ размещается в оперативной памяти, т.е. доступ к информации в
ней осуществляется быстро.
2) Счетчик открытых в данный момент файлов, связанных с данным ИД. Это
означает, что для любого количества открытий файла, связанного с
данным ИД, система работает с единственной копией этого ИД.
Теперь перейдем к, так называемой, таблице файлов (ТФ). Таблица файлов
состоит из фиксированного количества записей. Каждая запись ТФ
соответствует открытому в системе файлу {{или точнее ФД}}. При этом в
подавляющем большинстве случаев это есть взаимно однозначное соответствие.
Тот случай, когда это не есть взаимно однозначное соответствие, мы
рассмотрим ниже. Каждая запись ТФ содержит указатели чтения/записи по
файлу. Это означает, что, если открыт один и тот же файл в двух процессах
или дважды в одном процессе, то с каждым открытием связан свой указатель, и
они друг от друга не зависят (почти всегда, за исключением некоторых
случаев). Каждая запись ТФ содержит, так называемый, индекс
наследственности - это есть некоторое целое число.
Это данные уровня операционной системы, т.е. данные, которые описывают
состояние проблемы в системе в целом.
С каждым процессом связана, так называемая, таблица открытых файлов
(ТОФ). Номер записи в данной таблице есть номер ФД. Каждая строка этой
таблицы имеет ссылку на соответствующую строку ТФ. Это означает, что
информация об указателях, связанных с ФД, как бы разорвана. С одной
стороны, файловые дескрипторы - это данные, являющиеся атрибутом процесса,
с другой сторон
| | скачать работу |
Операционные системы |