Реклама:

Любая операционная система в первую очередь предназначена для обслуживания пользовательских программ, а основными услугами является ввод-вывод файлов. И UNIX, и Windows ХР предлагают широкий спектр услуг ввода-вывода. Для большинства системных вызовов UNIX в Windows ХР имеется эквивалентный вызов, но обратное неверно, поскольку Windows ХР поддерживает гораздо больше вызовов и каждый из них гораздо сложнее соответствующего вызова UNIX.

Виртуальный ввод-вывод в UNIX

Система UNIX весьма популярна во многом благодаря своей простоте, которая, в свою очередь, является прямым результатом организации файловой системы. Обычный файл представляет собой линейную последовательность 8-разрядных байтов1 от 0 до 232-1 максимум. Сама операционная система не сообщает структуру записей в файлах, хотя многие пользовательские программы рассматривают текстовые файлы в коде ASCII как последовательности строк, каждая из которых завершается символом перевода строки.

С каждым открытым файлом связан указатель на следующий байт, который нужно считать или записать. Системные вызовы read и write считывают и записывают данные, начиная с позиции, которую определяет указатель. После операции оба вызова перемещают указатель в другую позицию, передвигая его ровно на то количество байтов, которое было считано или записано. Возможен и произвольный доступ к файлам, когда файловый указатель устанавливается на заданное значение.

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

Основные системные вызовы для файлов в UNIX приведены в табл. 6.5. Вызов créât (без привычной буквы е в конце) используется для создания нового файла. В настоящее время он не обязателен, поскольку вызов open тоже ведет к созданию нового файла. Вызов unlink удаляет файл (предполагается, что файл существует только в одном каталоге).

Таблица 6.5. Основные системные вызовы UNIX

Системный вызов

Описание

creat(name, mode)

Создание файла; параметр mode определяет режим защиты

unlink(name)

Удаление файла (предполагается, что связь у него единственная)

open(name, mode)

Открытие или создание файла и возвращение дескриптора

 

файла

close(fd)

Закрытие файла

read(fd, buffer, count)

Считывание из файла байтов в buffer в количестве count

write(fd, buffer, count)

Запись в файл байтов из buffer в количестве count

lseek(fd, offset, w)

Перемещения файлового указателя на значения, заданные

 

параметрами offset и w

stat(name, buffer)

Возвращение информации о файле

chmod(name, mode)

Изменение режима защиты файла

fcntl(fd, and, ...)

Выполнение различных управляющих операций (например,

блокирование файла или его части)

1 Для многих слова о 8-разрядных байтах могут показаться странными, однако раньше байт действительно мог быть и 5-, и 7-, и 8-разрядным. Теперь же мы по привычке считаем, что в байте ровно 8 бит. - Примеч. научи, ред.

Вызов open используется для открытия существующих файлов, а также для создания новых. Флаг mode сообщает, как его открывать (для чтения, для записи и т. д.). Вызов возвращает небольшое целое число, которое называется дескриптором файла. Дескриптор файла идентифицирует файл при последующих вызовах.

Сам процесс ввода-вывода осуществляется вызовами read и write, каждый из которых в качестве параметров получает дескриптор файла (он указывает, какой файл использовать), буфер для данных и число передаваемых байтов. Вызов 1 seek используется для перемещения файлового указателя, что делает возможным доступ к произвольному месту в файле.

Вызов stat возвращает информацию о файле (размер, время последнего доступа, имя владельца и т. п.), вызов chmod изменяет режим защиты файла (например, разрешает или, наоборот, запрещает каким-нибудь пользователям читать его), наконец, вызов f cntl позволяет выполнять различные действия с файлом, например, блокировать или разблокировать.

В листинге 6.3 показано, как происходит процесс ввода-вывода. Эта минимальная по объему программа, которая не включает в себя код проверки ошибок. Перед тем как войти в цикл, программа открывает существующий файл data и создает новый файл newf. Каждый вызов возвращает дескриптор файла infd или outfd соответственно. Следующий параметр в обоих вызовах - биты защиты, которые определяют, что файлы нужно считать и записать соответственно. Оба вызова возвращают дескриптор файла. Если вызов open или créât оказывается неудачным, возвращается отрицательный дескриптор файла.

Листинг 6.3. Фрагмент программы для копирования файла с использованием системных вызовов UNIX. Этот фрагмент написан на языке С, поскольку в языке Java нельзя показать необходимые нам низкоуровневые системные вызовы

/* Получение дескриптора файла. */

infd = open("data". 0) ;

outfd = creat("newf", ProtectionBits);

/* Цикл копирования. */

do {

count = readCinfd, buffer, bytes); if (count > 0) write(outfd, buffer, count); } while (count > 0);

/* Закрытие файлов.*/ close(infd); close(outfd);

Вызов read имеет три параметра: дескриптор файла, буфер и число байтов. Данный вызов должен считать нужное число байтов из указанного файла в буфер. Число считанных байтов помещается в переменную count. Значение count может быть меньше, чем bytes, если файл окажется слишком коротким. Вызов write копирует считанные байты в выходной файл. Цикл продолжается до тех пор, пока входной файл не будет прочитан полностью. Тогда цикл завершается, и оба файла закрываются.

Дескрипторы файлов в UNIX представляют собой небольшие целые числа (обычно до 20). Дескрипторы файлов 0, 1 и 2 соответствуют стандартному вводу, стандартному выводу и стандартной ошибке соответственно. Обычно первый из них относится к клавиатуре, а второй и третий - к дисплею, хотя пользоГлава 6. Уровень операционной системы ватель может перенаправить любой стандартный поток ввода-вывода в файл. Многие программы UNIX получают входные данные из стандартного ввода и записывают выходные данные в стандартный вывод. Такие программы называются фильтрами.

Примеры виртуального ввода-вывода

С файловой системой тесно связана система каталогов. Каждый пользователь может иметь несколько каталогов, а каждый каталог может содержать файлы и вложенные каталоги. Система UNIX обычно конфигурируется с главным каталогом, так называемым корневым каталогом, который содержит вложенные каталоги bin (для часто используемых программ), dev (для специальных файлов устройств ввода-вывода), lib (для библиотек) и usr (для пользовательских каталогов, как показано на рис. 6.27). В нашем примере каталог usr содержит вложенные каталоги ast и jim. Каталог ast включает в себя два файла (data и foo.c) и вложенный каталог bin, в который входят 4 файла (gamel, game2, ...).

Чтобы назвать файл, нужно указать его путь из корневого каталога. Путь содержит список всех каталогов от корневого каталога к файлу, для разделения каталогов используется слеш. Например, путь к файлу game2 выглядит следующим образом: /usr/ast/bin/game2. Путь, который начинается с корневого каталога, называется абсолютным.

В каждый момент времени каждая работающая программа имеет текущий каталог. Путь может быть связан с текущим каталогом. В этом случае в начале пути слеш не ставится (чтобы отличить от абсолютного пути). Такой путь называется относительным путем. Если /usr/ast - текущий каталог, то можно получить доступ к файлу датеЗ, использовав путь bin/датеЗ. Пользователь может создать связь с чужим файлом, использовав для этого системный вызов link. В нашем примере пути /usr/ast/bin/датеЗ и /usr/jim/jotto приводят к одному и тому же файлу. Не разрешается применять связи к каталогам, чтобы предотвратить циклы в системе каталогов. В вызовах open и creat могут использоваться как абсолютные, так и относительные пути.

Основные вызовы для манипулирования каталогами UNIX приведены в табл. 6.6. Вызов mkdir создает новый каталог, a rmdir удаляет существующий пустой каталог. Следующие три вызова применяются для чтения элементов каталогов. Первый открывает каталог, второй считывает элементы из него, третий закрывает каталог. Вызов chdir изменяет текущий каталог.

Таблица 6.6. Основные вызовы для работы с каталогами в системе UNIX

Системный вызов

Описание

mkdir(name, mode)

Создание нового каталога

rmdir(name)

Удаление пустого каталога

Opendir(name)

Открытие каталога для чтения

readdir(dirpointer)

Считывание следующего элемента каталога

Closedir(dirpointer)

Закрытие каталога

chdir(dirname)

Смена текущего каталога на каталог с именем dirname

Iink(name1, name2)

Создание связи (элемента каталога пате2, указывающего на

 

каталог патеЧ)

unlink(name)

Удаление связи (элемента пате) из каталога

Вызов 1 i пк создает элемент каталога, который указывает на уже существующий файл. Например, элемент /ивг/^т/^о^о можно создать вызовом

ТтпкС'/иБг/аБт^/Ьтп/датеЗ", "/иБг/^т/аоио")

Того же можно добиться эквивалентным вызовом, используя относительные пути, которые зависят от текущего каталога. Вызов unlink удаляет элемент каталога. Если файл имеет только одну связь, он удаляется. Если файл имеет две и более связей, то он не удаляется. Не имеет никакого значения, была ли удаленная связь создана изначально, или это копия. Следующий вызов делает файл датеЗ доступным только через путь /usr/jim/jotto:

unii nk("/usr/ast/bin/game3")

Вызовы 1 ink и uni ink могут использоваться для перемещения файлов из одного каталога в другой.

С каждым файлом (а также с каждым каталогом, поскольку каталог - это тоже файл) связана битовая карта, которая сообщает, кому разрешен доступ к файлу. Карта содержит три поля RWX (Read, Write, eXecute - чтение, запись, выполнение). Первое из них контролирует разрешение на чтение, запись и выполнение файлов для их владельца, второе - для других пользователей из группы владельца, третье - для всех остальных пользователей. Например, биты RWX R-X -X означают, что владелец файла может читать этот файл, записывать что-либо в него и выполнять его (очевидно, файл является исполняемой программой, иначе не было бы разрешения на его выполнение), другие члены группы могут читать и выполнять его, а все остальные - только выполнять. Таким образом, посторонние пользователи смогут выполнить эту программу, но не смогут ее украсть (скопировать), поскольку им запрещено чтение. Включение пользователей в те или иные группы осуществляется системным администратором, которого обычно называют привилегированным пользователем. Привилегированный пользователь имеет право действовать вопреки механизму защиты и считывать, записывать и выполнять любой файл.

Теперь посмотрим, как файлы и каталоги реализованы в системе UNIX. Более детальное описание см. в [212]. С каждым файлом (и с каждым каталогом, поскольку каталог - это тоже файл) связан информационный блок размером 64 байта, который называется индексным дескриптором (i-node). Индексный дескриптор содержит информацию о том, кто владеет файлом, что разрешено делать с файлом, где найти данные и т. п. Индексные дескрипторы для файлов расположены либо последовательно в начале диска, либо, если диск разделен на группы цилиндров, - в начале группы. Индексные дескрипторы снабжены последовательными номерами. Таким образом, система UNIX может обнаружить i-node просто путем вычисления его адреса на диске.

Элемент каталога состоит из двух частей: имени файла и номера i-node. Когда программа выполняет следующую команду, система ищет текущий каталог файла foo.c, чтобы найти номер индексного дескриптора этого файла:

open("f00.с", 0)

Обнаружив номер i-node, программа может считать его и узнать всю информацию о файле.

При большей длине пути файла процедура повторяется несколько раз, пока не будет пройден весь путь. Например, чтобы найти номер i-node для пути /usr/ast/data, система сначала отыщет корневой каталог для элемента usr. Обнаружив индексный дескриптор usr, она может прочитать файл (каталог в системе

UNIX - это тоже файл). В этом файле она отыщет элемент ast и найдет номер i-node для файла /usr/ast. Считав информацию о местонахождении каталога /usr/ast, система сможет обнаружить элемент для data и, следовательно, - номер i-node для /usr/ast/data. Найдя номер i-node для этого файла, система узнает об этом файле все.

Формат, содержание и размещение индексных дескрипторов несколько различаются в разных системах (особенно когда идет речь о сетевых системах), но следующие элементы присутствуют практически в каждом индексном дескрипторе:

♦ тип файла, три поля RWX (всего 9 бит) и некоторые другие биты;

♦ число связей с файлом (число элементов каталогов);

♦ идентификатор владельца;

♦ группа владельца;

♦ длина файла в байтах;

♦ тринадцать дисковых адресов;

♦ время, когда файл читали в последний раз;

♦ время, когда последний раз производилась запись в файл;

♦ время, когда в последний раз менялся индексный дескриптор.

Типы файлов могут быть разными: обычные файлы, каталоги, два вида особых файлов для блочных и неструктурированных устройств ввода-вывода. Число связей и идентификатор владельца мы уже обсуждали. Длина файла выражается 32-разрядным целым числом, которое показывает самый старший байт файла. Вполне возможно создать файл, перенести указатель на позицию 1 ООО ООО и записать 1 байт. В результате получится файл длиной 1 ООО 001. Однако этот файл потребует сохранения всех "несуществующих" байтов.

Первые 10 адресов на диске указывают на блоки данных. Если размер блока - 1024 байт, то можно работать с файлами размером до 10 240 байт. Адрес И указывает на блок косвенной адресации, который содержит 256 адресов диска. Здесь можно работать с файлами размером до 10 240 + 256 х 1024 = 272 384 байта. Для файлов еще большего размера существует адрес 12, который указывает на 256 блоков косвенной адресации. Здесь допустимый размер файлов составляет 272384 + 256 х 256 х 1024 = 67 381 248 байт. Если и эта схема блока двойной косвенной адресации слишком мала, используется адрес 13. Он указывает на блок тройной косвенной адресации, который содержит адреса 256 блоков двойной косвенной адресации. Используя прямую, косвенную, двойную косвенную и тройную косвенную адресацию, можно обращаться к 16 843 018 блокам. Это значит, что максимально возможный размер файла составляет 17 247 250 432 байта. Поскольку размер файловых указателей ограничен значением 32 бита, реальный верхний предел на размер файла составляет 4 294 967 295 байт. Свободные дисковые блоки хранятся в виде связного списка. Если нужен новый блок, он берется из списка. В результате получается, что блоки каждого файла беспорядочно раскиданы по всему диску.

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

Зная все это, можно понять, как происходит процесс ввода-вывода. Вызов open заставляет систему искать каталоги по определенному пути. Если поиск оказывается успешным, индексный дескриптор считывается во внутреннюю таблицу. Вызовы read и write требуют, чтобы система вычислила номер блока из текущей позиции файла. Адреса первых 10 дисковых блоков всегда находятся в основной памяти (в индексном дескрипторе); для остальных блоков сначала требуется считать один или несколько блоков косвенной адресации. Вызов lseek просто меняет текущую позицию указателя и не производит никакого ввода-вывода.

В первом аргументе вызова link находится номер индексного дескриптора. По этому номеру он создает элемент каталога для второго аргумента и помещает номер i-node первого файла в этот элемент каталога. Наконец, он увеличивает число связей в индексном дескрипторе на 1. Вызов unlink удаляет элемент каталога и уменьшает число связей в индексном дескрипторе. Если это число становится равным 0, файл удаляется, и все его блоки помещаются в список свободных блоков.

Виртуальный ввод-вывод в Windows ХР

Windows ХР поддерживает несколько файловых систем, самые важные из которых - NTFS (NT File System - файловая система NT) и FAT (File Allocation Table - таблица размещения файлов). Первая была разработана специально для Windows ХР. Вторая является устаревшей файловой системой для MS-DOS, которая также используется в Windows 95/98 (хотя и с длинными именами файлов). Поскольку система FAT устарела, мы рассмотрим только файловую систему NTFS.

В NTFS имя файла может быть длиной до 255 символов. Имена файлов написаны в кодировке Unicode, благодаря чему люди в разных странах, где не используется латинский алфавит, могут писать имена файлов на их родном языке. Во всех версиях операционной системы, начиная с Windows 2000, тексты меню, сообщений об ошибках и прочих элементов интерфейса хранятся в выделенных для каждого языка конфигурационных файлах, в то время как двоичные файлы едины для всех вариантов языкового окружения. В NTFS прописные и строчные буквы в именах файлов считаются разными (то есть "foo" отличается от "FOO"). К сожалению, в Win32 API прописные и строчные буквы в именах файлов и каталогов не различаются, поэтому это преимущество теряется для программ, использующих подсистему Win32.

Как и в UNIX, файл представляет собой линейную последовательность байтов, максимальная длина которой составляет 264 - 1. Указатели тоже существуют, но их длина не 32, а 64 бита, чтобы можно было поддерживать максимальную длину файла. Вызовы функций в Win32 API для манипуляций с каталогами и файлами в целом напоминают вызовы функций в UNIX, но большинство из них имеют больше параметров и другую модель защиты. При открытии файла возвращается описатель, который затем используется для чтения и записи файла. В отличие от UNIX, описатели не являются маленькими целыми числами, а стандартный ввод, стандартный вывод и стандартная ошибка не определяются заранее как 0, 1 и 2 (исключение составляет консольный режим). Основные функции Win32 API для управления файлами перечислены в табл. 6.7 (во второй колонке дается эквивалентная функция UNIX).

Таблица 6.7. Основные функции \Мп32 АР1 для ввода-вывода файлов

Функция API

Функция UNIX

Описание

CreateFile

open

Создание файла или открытие существующего файла; функция возвращает описатель

DeleteFile

unlink

Удаление существующего файла

CloseHandle

close

Закрытие файла

ReadFile

read

Считывание данных из файла

WriteFile

write

Запись данных в файл

SetFilePointer

Iseek

Установка файлового указателя на заданное место в файле

SetFileAttributes

stat

Возвращение свойств файла

LockFile

Fcntl

Блокирование области файла, чтобы обеспечить взаимное исключение доступа

UnlockFile

Fcntl

Разблокирование ранее заблокированной области файла

Рассмотрим эти вызовы. Вызов CreateFile используется для создания нового файла и возвращает описатель для них. Эта функция применяется также для открытия уже существующего файла, поскольку в API нет функции open. Мы не будем приводить параметры функций API, поскольку их очень много. Например, функция CreateFile имеет семь параметров:

♦ указатель на имя создаваемого или открываемого файла;

♦ флаги, которые сообщают, какие действия разрешено производить с файлом (читать, записывать или то и другое);

♦ флаги, которые показывают, могут ли несколько процессов открывать файл одновременно;

♦ указатель на дескриптор безопасности, который показывает, кто имеет доступ к файлу;

♦ флаги, которые показывают, что делать, когда файл существует и когда не существует;

♦ флаги, связанные с атрибутами архивации, компрессии и т. д.

♦ описатель файла, атрибуты которого нужно клонировать для нового файла.

Следующие шесть функций API похожи на соответствующие функции UNIX. Последние две позволяют блокировать или разблокировать область файла, чтобы гарантировать процессам исключение доступа к одной и той же области.

Использовав эти функции API, можно написать процедуру копирования файла, аналогичную процедуре из листинга 6.3. Такая процедура (без кода проверки ошибок) представлена в листинге 6.4. На практике программу для копирования файла писать не нужно, поскольку существует функция CopyFile, которая делает примерно то же самое и реализована в виде библиотечной процедуры.

Листинг 6.4. Фрагмент программы для копирования файла с помощью функции API системы Windows ХР. Этот фрагмент написан на языке С, поскольку в языке Java нельзя показать необходимые нам низкоуровневые системные вызовы

/* Открытие файлов для ввода и вывода. */

inhandle = CreateFileC'data". GENERIC_READ, О, NULL,

OPENJXISTING. 0, NULL); outhandle = CreateFileC'newF, GENERICJJRITE, 0, NULL, CREATE_ALWAYS,

FiLE_ATTRIBUTE_N0RMAL, NULL);

/* Копирование файла. */ do {

s = ReadFilednhandle, buffer, BUF_SIZE, &count, NULL); if (s > 0 && count > 0) WriteFile(outhandle, buffer, count, &ocnt, NULL); } while (s > 0 && count > 0);

/* Закрытие файлов. */ CloseHandle(inhandle); CloseHandle(outhandle);

Windows ХР поддерживает иерархическую файловую систему, напоминающую файловую систему UNIX. Однако в качестве разделителя здесь используется не прямой, а обратный слеш (заимствовано из MS-DOS). Здесь тоже существует понятие текущего каталога, а пути могут быть абсолютными и относительными. Однако между Windows ХР и UNIX есть одно существенное различие. UNIX позволяет монтировать в одно дерево файловые системы с разных дисков и машин, скрывая таким образом от программ структуру диска. Windows ХР такой возможности не имеет, поэтому абсолютные имена файлов должны начинаться с буквы диска (например, C:\windows\system\foo.dll). В то же время, возможность монтирования файловых систем в стиле UNIX реализована в Windows 2000.

Основные функции для работы с каталогами перечислены в табл. 6.8 (также вместе с эквивалентами из UNIX).

Таблица 6.8. Основные функции \Мп32 АР1 для работы с каталогами

Функция API

Функция UNIX

Значение

CreateDi recti ry

mkdir

Создание нового каталога

RemoveDi rectory

rmdir

Удаление пустого каталога

FindFirstFile

opendir

Начало чтения элементов каталога

FindNextFile

readdir

Чтение следующего элемента каталога

MoveFile

 

Перемещение файла из одного каталога в другой

SetCurrentDirectory

chdir

Смена текущего каталога

Windows ХР имеет более сложный механизм защиты, чем UNIX. Когда пользователь входит в систему, его процесс получает маркер доступа от операционной системы. Маркер доступа содержит идентификатор безопасности (Security ID, SID), список групп, к которым принадлежит пользователь, имеющиеся привилегии и некоторую другую информацию. Маркер доступа концентрирует всю информацию о защите в одном легко доступном месте. Все процессы, созданные этим процессом, наследуют этот же маркер доступа.

Дескриптор безопасности (security descriptor) - это один из параметров, который дается любому объекту при его создании. Дескриптор безопасности содержит список элементов, который называется списком контроля доступа (Access Control List, ACL). Каждый элемент разрешает или запрещает совершать определенный набор операций с объектом какому-либо пользователю или группе. Например, файл может содержать дескриптор безопасности, который определяет, что Иванов не имеет доступа к файлу вообще, Петров может читать файл, Сидоров может читать и записывать файл, а все члены группы XYZ могут считать только размер файла.

Если процесс пытается выполнить какую-либо операцию с объектом, используя описатель, который он получил при открытии объекта, диспетчер безопасности получает маркер доступа данного процесса и начинает перебирать элементы списка контроля доступа по порядку. Как только он находит элемент, который соответствует нужному пользователю или одной из групп, найденная информация о разрешении или запрещении доступа принимается в качестве заданной. По этой причине элементы, запрещающие доступ, обычно помещаются в список контроля доступа перед элементами, разрешающими доступ (чтобы пользователь, у которого нет доступа, не смог получить его незаконно, будучи членом одной из групп, которой доступ разрешен). Дескриптор безопасности также содержит информацию, используемую для аудита доступов к объекту.

А теперь рассмотрим, как файлы и каталоги реализованы в Windows ХР. Каждый диск разделен на тома, такие же, как дисковые разделы UNIX. Каждый том содержит файлы, битовые карты каталогов и другие структуры данных. Каждый том организован в виде линейной последовательности кластеров. Размер кластера фиксирован для каждого тома. Он может составлять от 512 байт до 64 Кбайт, в зависимости от размера тома. Обращение к кластеру осуществляется по смещению от начала тома. При этом используются 64-разрядные числа.

Основной структурой данных в каждом томе является главная файловая таблица (Master File Table, MFT), в которой содержатся записи для каждого файла и каталога в томе. Эти записи аналогичны элементам индексного дескриптора (i-node) в UNIX. Главная файловая таблица является файлом и может быть помещена в любое место в пределах тома. Это устраняет проблему, возникающую при обнаружении испорченных дисковых блоков среди индексных дескрипторов.

Главная файловая таблица показана на рис. 6.28. Она начинается с заголовка, в котором дается информация о томе (указатели на корневой каталог, файл загрузки, список лиц, пользующихся свободным доступом и т. д.). Затем идет по одному элементу на каждый файл или каталог (1 Кбайт за исключением тех случаев, когда размер кластера составляет 2 Кбайт и более). Каждый элемент содержит все метаданные (административную информацию) о файле или каталоге. Допускается несколько форматов, один из которых показан на рис. 6.28.

Примеры виртуального ввода-вывода

Рис. 6.28. Главная файловая таблица в системе Windows ХР

Поле стандартной информации содержит информацию меток времени, необходимых стандартах POSIX, числе связей, битах "только чтение", битах архивирования и т. д. Это поле имеет фиксированную длину и является обязательным. Имя файла может иметь любую длину в пределах 255 Unicode-символов. Чтобы такие файлы стали доступными для устаревших 16-разрядных программ, они могут снабжаться дополнительным именем MS-DOS, состоящим максимум из 8 символов, за которыми следует точка и расширение из 3 символов. Если реальное имя файла соответствует правилу именования MS-DOS (8 + 3), второе имя в стиле MS-DOS не используется.

Далее следует поле безопасности. Во всех версиях, вплоть до Windows NT 4.0, в поле безопасности содержался дескриптор безопасности. Начиная с Windows 2000, вся информация о безопасности помещается в один файл, а поле безопасности просто указывает на соответствующую часть этого файла.

Для файлов небольшого размера сами данные этих файлов могут содержаться в записи главной файловой таблицы, что упрощает их вызов - для этого не требуется обращаться к диску. Данная концепция получила название непосредственный файл [148]. Для файлов большого размера это поле содержит указатели на кластеры с данными или (что более распространено) на блоки последовательных кластеров, так что номер кластера и его длина могут представлять произвольное количество данных. Если элемент главной файловой таблицы недостаточно велик для хранения нужной информации, с ним можно связать один или несколько дополнительных элементов (записей).

Максимальный размер файла составляет 264 байт. Поясним, что собой представляет файл такого размера. Представим, что файл записан в двоичной системе, а каждый 0 или 1 занимает 1 мм пространства. Величина 267 мм соответствует значению 15 световых лет. Этого хватило бы для того, чтобы выйти за пределы Солнечной системы, достичь Альфа Центавры и вернуться обратно.

Файловая система NTFS имеет много других интересных особенностей, в частности, она поддерживает компрессию данных и механизм отказоустойчивости на основе атомарных транзакций. Дополнительную информацию можно найти в [177].

Примеры виртуальной памяти || Оглавление || Примеры управления процессами