Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дроздов С.Н. Конспект лекций по ОС.doc
Скачиваний:
297
Добавлен:
02.05.2014
Размер:
1.13 Mб
Скачать
        1. Структуры данных в памяти

Для обеспечения доступа к открытым файлам MS-DOSиспользует системные таблицы двух типов.

Таблица SFT(SystemFileTable) содержит записи о всех файлах, в данный момент открытых программами пользователя и самой ОС. Эта таблица хранится в системной памяти, число записей в ней определяется параметромFILESв файле конфигурацииCONFIG.SYS, но не может превышать 255.

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

Каждая запись содержит подробную информацию о файле, достаточную для выполнения операций с ним. В частности, в записи SFTсодержатся:

  • копия каталожной информации о файле;

  • адрес каталожной записи (сектор и номер записи в секторе);

  • текущее положение указателя чтения/записи;

  • номер последнего записанного или прочитанного кластера файла;

  • адрес в памяти программы, открывшей файл;

  • режим доступа, заданный при открытии.

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

В отличие от единственной SFT, таблицыJFT(JobFileTable) создаются для каждой запускаемой программы, поэтому одновременно может существовать несколько таких таблиц. (А откуда в однозадачнойMS-DOSмогут взяться одновременно несколько программ? Простейший ответ: когда одна программа запускает другую, то в памяти присутствуют обе. Подробнее см. п. 4.4.3.) ТаблицаJFTимеет простейшую структуру: она состоит из однобайтовых записей, причем значение каждой записи представляет собой индекс (номер записи) в таблицеSFT. Неиспользуемые записи содержат значениеFF16. Размер таблицы по умолчанию составляет 20 записей (байт), но может быть увеличен до 255.

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

На рис. 3‑3 показана связь между хэндлами, таблицами JFT, таблицейSFTи открытыми файлами/устройствами.

Рис. 3‑12

В примере, показанном на рисунке, стандартные хэндлы процесса Aиспользуются так, как это по умолчанию делаетMS-DOS: хэндлы 0, 1 и 2 указывают на записьSFT, соответствующую консольному устройствуCON, хэндл 3 – на запись об устройствеCOM1, хэндл 4 –на запись о принтере. У процессаBстандартный вывод перенаправлен на принтер, что отражено в значении элемента 1 изJFTэтого процесса. Хэндлы 3 и 4 для процессаBне показаны, чтобы не захламлять рисунок. Остальные показанные на рисунке элементыJFTобоих процессов указывают на записиSFT, описывающие открытые файлы на дисках.

Заметим, что с файлом PICTURE.BMPсвязаны две записи в таблицеSFT. Это означает, что данный файл был открыт в каждом процессе отдельно (но, очевидно, с использованием одного из режимов разделения файла).

Когда программа вызывает какую-либо из системных функций и передает ей значение хэндла одного из открытых файлов, то система находит адрес таблицы JFTвызвавшей программы, читает указанную хэндлом запись этой таблицы, определяет соответствующий индекс в таблицеSFTи получает таким образом доступ к информации, необходимой для выполнения операции с файлом.

В чем смысл такой двухступенчатой схемы? Не проще ли было, чтобы хэндл указывал непосредственно на запись SFT? Можно привести, по крайней мере, два очевидных аргумента в пользу примененияJFT.

  • Что происходит с файлами при завершении программы, которая их открыла? Правила хорошего программистского тона требуют, чтобы программа перед окончанием работы закрыла за собой все файлы. Однако программист может и не выполнить это требование, или программа может завершиться аварийно. В любом случае ОС должна при завершении программы закрыть все ее файлы. Как ОС узнает, какие файлы следует закрыть? Ответ очень простой: достаточно просмотреть таблицу JFTзавершаемой программы и найти там все записи, отличные отFF16.

  • Использование JFTдает возможность отделить логическое понятие стандартного устройства (в частности, стандартный ввод – хэндл 0 и стандартный вывод – хэндл 1) от конкретных устройств. Перенаправление стандартных устройств выполняется путем изменения значений соответствующих элементовJFT.