ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 24.12.2021
Просмотров: 12186
Скачиваний: 10

498 Глава 6. Уровень операционной системы
вой каталог для элемента
usr.
Обнаружив индексный дескриптор для
usr,
она мо-
жет прочитать этот файл (директория в системе UNIX — это тоже файл). В этом
файле она ищет элемент
ast
и находит номер индексного дескриптора для файла
/usr/ast. Считав информацию о местонахождении директории /usr/ast, система
может обнаружить элемент для
data
и, следовательно, номер индексного дескрипто-
ра для /usr/ast/data. Найдя номер индексного дескриптора для этого файла, систе-
ма может узнать все об этом файле.
Формат, содержание и размещение индексных дескрипторов несколько разли-
чаются в разных системах (особенно когда идет речь о сети), но следующие харак-
теристики присущи практически каждому дескриптору:
1. Тип файла, 9 битов защиты RWX и некоторые другие биты.
2. Число связей с файлом (число элементов директорий).
3. Идентификатор владельца.
4. Группа владельца.
5. Длина файла в байтах.
6. Тринадцать адресов на диске.
7. Время, когда файл читали в последний раз.
8. Время, когда последний раз производилась запись в файл.
9. Время, когда в последний раз менялся индексный дескриптор.
Типы файлов бывают следующие: обычные файл, директории и два вида осо-
бых файлов для устройств ввода-вывода с блочной структурой и неструктуриро-
ванных устройств ввода-вывода соответственно. Число связей и идентификатор
владельца мы уже обсуждали. Длина файла выражается 32-битным целым чис-
лом, которое показывает самый старший байт файла. Вполне возможно создать
файл, перенести указатель на позицию 1 000 000 и записать 1 байт. В результате
получится файл длиной 1 000 001. Тем не менее этот файл не требует сохранения
всех отсутствующих байтов.
Первые 10 адресов на диске указывают на блоки данных. Если размер блока —
1024 байта, то можно работать с файлами размером до 10 240 байтов. Адрес 11
указывает на блок
косвенной
адресации, который содержит 256 адресов диска.
Здесь можно работать с файлами размером до 10 240+256x1024=272 384 байта.
Для файлов еще большего размера существует адрес 12, который указывает на
256 блоков косвенной адресации. Здесь допустимый размер файлов составляет
272384+256x256x1024=67 381 248 байтов. Если и эта схема
блока двойной кос-
- венной адресации
слишком мала, то используется адрес 13. Он указывает на блок
тройной косвенной адресации, который содержит адреса 256 блоков двойной кос-
венной адресации. Используя прямую, косвенную, двойную косвенную и тройную
косвенную адресацию, можно обращаться к 16 843 018 блокам. Это значит, что
максимально возможный размер файла составляет 17 247 250 432 байта. Посколь-
ку размер указателей файлов ограничен до 32 битов, реальный верхний предел на
размер файла составляет 4 294 967 295 байтов. Свободные блоки диска хранятся
в связном списке. Если нужен новый блок, он берется из списка. В результате по-
лучается, что блоки каждого файла беспорядочно раскиданы по всему диску.

Примеры операционных систем 499
Чтобы повысить скорость ввода-вывода с диска, нужно сделать следующее.
После открытия файла его индексный дескриптор копируется в таблицу в основ-
ной памяти и хранится там, пока файл остается открытым. Кроме того, в памяти
находится набор блоков, к которым недавно производилось обращение. Так как
большинство файлов считывается последовательно, часто при обращении к фай-
лу требуется тот же блок, что и при предыдущем обращении. Чтобы увеличить
скорость, система считывает следущий блок в файл еще до того, как к нему произ-
ведено обращение. Все эти моменты скрыты от пользователя. Когда пользователь
выдает вызов
read,
работа программы приостанавливается, пока требуемые дан-
ные не появятся в буфере.
Зная все это, мы теперь можем рассмотреть, как происходит процесс ввода-вы-
вода.
Open
заставляет систему искать директории по определенному пути. Если
поиск успешен, то индексный дескриптор считывается во внутреннюю таблицу.
Вызовы
read
и
write
требуют, чтобы система вычислила номер блока из текущей
позиции файла. Адреса первых 10 блоков диска всегда находятся в основной па-
мяти (в индексном дескрипторе); для остальных блоков сначала требуется счи-
тать один или несколько блоков косвенной адресации.
Lseek
просто меняет теку-
щую позицию указателя и не производит никакого ввода-вывода.
Link
смотрит на свой первый аргумент, чтобы обнаружить номер индексного
дескриптора. Затем он создает элемент директории для второго аргумента и поме-
щает номер индексного дескриптора первого файла в этот элемент директории. На-
конец, он увеличивает число связей в индексном дескрипторе на 1.
Unlink
удаляет
элемент директории и уменьшает число связей в индексном дескрипторе. Если это
число равно 0, файл удаляется и все блоки помещаются в список свободных блоков.
Виртуальный ввод-вывод в Windows NT
NT поддерживает несколько файловых систем, самые важные из которых —
NTFS
(NT File Sysytem — файловая система Windows NT)
и
FAT (File Allocation Table —
таблица размещения файлов).
Первая была разработана специально для NT. Вто-
рая является старой файловой системой для MS-DOS, которая также использует-
ся в Windows 95/98 (хотя и с длинными именами файлов). Поскольку система
FAT устарела, ниже мы рассмотрим только файловую систему NTFS. FAT32 начала
использоваться с NT 5.O. Она подерживалась и в более позних версиях Windows 95
и Windows 98.
В файловой системе NT длина имени файла может быть до 255 символов. Име-
на файлов написаны в коде Unicode, благодаря чему люди в разных странах, где не
используется латинский алфавит, могут писать имена файлов на их родном языке.
В файловой системе NT заглавные и строчные буквы в именах файлов считаются
разными (то есть foo отличается от FOO). К сожалению, в системе Win32 API за-
главные и строчные буквы в именах файлов и директорий не различаются, поэтому
это преимущество теряется для программ, которые используют Win32.
Как и в системе UNIX, файл представляет собой линейную последовательность
байтов, максимальная длина 2
м
-1. Указатели тоже существуют, но их длина не 32,
а 64 бита, чтобы можно было поддерживать максимальную длину файла. Вызовы
функций в Win32 API для манипуляций с директориями и файлами в целом схо-
жи с вызовами функций в системе UNIX, но большинство из них имеют больше

500
Глава 6. Уровень операционной системы
параметров, и модель защиты другая. При открытии файла возвращается иденти-
фикатор (handle), который затем используется для чтения и записи файла. В отли-
чие от системы UNIX, идентификаторы не являются маленькими целыми числа-
ми, а стандартный ввод, стандартный вывод и стандартная ошибка не определяются
заранее как 0,1 и 2 (исключение составляет пультовый режим работы). Основные
функции Win32 API для управления файлами приведены в табл. 6.11.
Таблица 6 . 1 1 .
Основные функции Win32 API для ввода-вывода файлов.
Во второй колонке дается эквивалент из UNIX
Функция API UNIX Значение
CreateFile open Создает файл или открывает существующий файл; возвращает
идентификатор
DeleteFile unlink Удаляет существующий файл
CloseHandle close Закрывает файл
ReadFile read Считывает данные из файла
WriteFile write Записывает данные в файл
SetFilePointer Iseek Устанавливает указатель файла на определенное место в файле
SetFileAttributes stat Возвращает свойства файла
LockFile Fcntl Блокирует область файла, чтобы обеспечить взаимное исключение
доступа
UnlockFile Fcntl Снимает блокировку с ранее заблокированной области файла
Рассмотрим эти вызовы.
CreateFile
используется для создания нового файла и
возвращает идентификатор (handle) для него. Эта функция применяется и для от-
крытия уже существующего файла, поскольку в системе API нет функции
open.
Мы не будем приводить параметры функций API, поскольку их очень много. На-
пример,
CreateFile
имеет семь параметров:
1. Указатель на имя файла, который нужно создать или открыть.
2. Флаги, которые сообщают, какие действия разрешено производить с фай-
лом: читать, записывать или и то и другое.
3. Флаги, которые сообщают, могут ли несколько процессов открывать файл
одновременно.
4. Указатель на дескриптор безопасности, который сообщает, кто имеет до-
ступ к файлу.
5. Флаги, которые сообщают, что нужно делать, если файл существует или не
существует.
6. Флаги, связанные с атрибутами архивации, компрессии и т. д.
7. Идентификатор файла (handle), атрибуты которого нужно клонировать для
нового файла.
Следующие шесть функций API сходны с соотвествующими функциями в сис-
теме UNIX. Последние две позволяют блокировать и разблокировать область фай-
ла, чтобы обеспечить взаимное исключение доступа.
Используя эти функции API, можно написать процедуру для копирования фай-
ла, аналогичную процедуре в листинге 6.3. Такая процедура (без проверки оши-

Примеры операционных систем
5 0 1
бок) приведена в листинге 6.4. На практике программу для копирования файла
писать не нужно, поскольку существует функция
CopyFile.
Листинг 6.4.
Фрагмент программы для копирования файла с применением
функции API из системы Windows NT. Фрагмент написан на языке С,
язык Java не показывает системные вызовы низкого уровня,
а нам нужно было продемонстрировать их
/* Открытие файлов для ввода и вывода. */
inhandle - CreateFileCdata". GENERIC_READ. 0, NULL. OPENJXISTING, 0. NULL);
outhandle = CreateFileC'newF. GENERIC.WRITE. 0. NULL. CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL.
NULL);
/* Копирование файла. */
do{
s = ReadFiIe(inhandle. buffer. BUF_SIZE. «count. NULL);
if (s > 0 && count > 0) WriteFile(outhandle, buffer, count. Socnt. NULL);
while (s > 0 && count > 0);
/* Закрытие файлов. */
CloseHandle(inhandle);
CloseHandle(outhandle);
NT поддерживает иерархическую систему файлов, сходную с системой файлов
UNIX. Однако в качестве разделителя здесь используется не /, а \ (заимствовано
из MS-DOS). Здесь тоже существует понятие текущего каталога, а пути могут быть
абсолютными и относительными. Однако между NT и UNIX есть одно существен-
ное различие. UNIX позволяет монтировать в одно дерево системы файлов с разных
дисков и машин, скрывая таким образом структуру диска от программного обеспе-
чения. NT 4.0 не имеет этого качества, поэтому абсолютные имена файлов должны
начинаться с буквы, которая указывает на диск (например, C:\windows\system\
foo.dll). Свойство монтирования систем файлов появилось с NT 5.O.
Основные функции для работы с директориями приведены в табл. 6.12 (также
вместе с эквивалентами из UNIX). Думаем, что раскрывать их значение не требуется.
Отметим, что NT 4.0 не поддерживает связи файлов. На уровне графического
рабочего стола поддерживаются клавишные комбинации быстрого вызова, но эти
структуры не имели соответствий в самой системе файлов. Прикладная програм-
ма не могла войти в файл во второй директории, не скопировав весь файл. Начи-
ная с NT 5.0 к системе файлов были добавлены файловые связи.
Таблица 6.12.
Основные функции Min32 API для работы с директориями. Во втором
столбце даны эквиваленты из UNIX, если они существуют
Функция API UNIX Значение
CreateDirectiry mkdir Создает новую директорию
RemoveDirectory rmdir Удаляет пустую директорию
FindFirstFile opendir Инициализирует чтение элементов директории
FindNextFile readdir Читает следующий элемент директории
MoveFile Перемещает файл из одной директории в другую
SetCurrentDirectory chdir Меняет текущую директорию
NT имеет более сложный механизм защиты, чем в UNIX. Когда пользователь
входит в систему, его процесс получает
маркер доступа
от операционной системы.

5 0 2 Глава 6. Уровень операционной системы
Маркер доступа содержит
идентификатор безопасности
(SID
— Security ID),
список групп, к которым принадлежит пользователь, имеющиеся привилегии и
некоторую другую информацию. Маркер доступа концентрирует всю информа-
цию о защите в одном легко доступном месте. Все процессы, созданные этим про-
цессом, наследуют этот же маркер доступа.
Дескриптор защиты
— это один из параметров, который дается при создании
любого объекта. Дескриптор защиты содержит список элементов, который назы-
вается
списком контроля доступа (ACL — Access Control List).
Каждый элемент
разрешает или запрещает совершать определенный набор операций над объектом
какому-либо отдельному человеку или группе. Например, файл может содержать
дескриптор защиты, который определяет, что Иванов не имеет доступа к файлу
вообще, Петров может читать файл, Сидоров может читать и записывать файл, а
все члены группы XYZ могут прочитать только размер файла.
Если процесс пытается выполнить какую-либо операцию над объектом с ис-
пользованием идентификатора (handle), который он получил при открытии объек-
та, диспетчер безопасности получает маркер доступа данного процесса и начинает
перебирать элементы списка контроля доступа по порядку. Как только он находит
элемент, который соответствует нужному пользователю или одной из групп, ин-
формация о разрешении или запрещении доступа, найденная там, принимается
в качестве заданной. По этой причине элементы, запрещающие доступ, обычно по-
мещаются в список контроля доступа перед элементами, разрешающими доступ
(чтобы пользователь, у которого нет доступа, не смог получить его незаконно, бу-
дучи членом одной из групп, которой доступ разрешен). Дескриптор защиты так-
же содержит информацию, используемую для аудита доступов к объекту.
А теперь рассмотрим, как файлы и директории реализуются в NT. Каждый диск
разделен на тома, такие же как разделы диска в UNIX. Каждый том содержит фай-
лы, битовые отображения директорий и другие структуры данных. Каждый том
организован в виде линейной последовательности
кластеров.
Размер кластера
фиксирован для каждого тома. Он может быть от 512 байтов до 64 Кбайт, в зависи-
мости от размера тома. Обращение к кластеру осуществляется по смещению от
начала тома. При этом используются 64-битные числа.
Основной структурой данных в каждом томе является
MFT (Master File Table —
главная файловая таблица),
в которой содержится элемент для каждого файла и
директории в томе. Эти элементы аналогичны элементам индексного дескриптора
(i-node) в системе UNIX. Главная файловая таблица является файлом и может
быть помещена в любое место в пределах тома. Это устраняет проблему, возни-
кающую при наличии испорченных блоков на диске в середине индексных де-
скрипторов.
Главная файловая таблица показана на рис. 6.28. Она начинается с заголовка,
в котором дается информация о томе (указатели на корневой каталог, файл загруз-
ки, список лиц, пользующихся свободным доступом и т. д.). Затем идет по одному
элементу на каждый файл или директорию (1 Кбайт за исключением тех случаев,
когда размер кластера составляет 2 Кбайт и более). Каждый элемент содержит все
метаданные (административную информацию) о файле или директории. Допус-
кается несколько форматов, один из которых изображен на рис. 6.28.