Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекції ОС.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.02 Mб
Скачать

3.6.4.3. Структури даних у пам'яті

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

Таблиця SFT (System File Table) містить записи про всіх файлах, в даний момент відкритих програмами користувача і самої ОС. Ця таблиця зберігається в системній пам'яті, число записів у ній визначається параметром FILES у файлі конфігурації CONFIG.SYS, але не може перевищувати 255.

Якщо один і той же файл був відкритий кілька разів (неважливо, однієї і тієї ж програм ой чи різними програмами), то для нього буде кілька записів у SFT.

Кожен запис містить докладну інформацію про файл, достатню для виконання операцій з ним. Зокрема, в записі SFT містяться:

· Копія каталожної інформації про файл;

· Адресу каталожної записи (сектор та номер запису в секторі);

· Поточне положення вказівника читання / запису;

· Номер останнього записаного або прочитаного кластера файла;

· Адресу в пам'яті програми, що відкрила файл;

· Режим доступу, заданий при відкритті.

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

На відміну від єдиної SFT, таблиці JFT (Job File Table) створюються для кожної програми, що запускається, тому одночасно може існувати кілька таких таблиць. (А звідки в однозадачной MS-DOS можуть взятися одночасно кілька програм? Найпростіший відповідь: коли одна програма запускає іншу, то в пам'яті присутні обидві. Детальніше див п. 4.4.3.) Таблиця JFT має найпростішу структуру: вона складається з однобайтових записів , причому значення кожного запису являє собою індекс (номер запису) в таблиці SFT. Невживані записи містять значення FF16. Розмір таблиці за замовчуванням становить 20 записів (байт), але може бути збільшений до 255.

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

На рис. 3-3 показано зв'язок між хендл, таблицями JFT, таблицею SFT і відкритими файлами / пристроями.

Рис. 1‑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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]