карта свободного места тома
|
$Boot
|
загрузочный сектор (если раздел загрузочный)
|
$Quota
|
файл, в котором записаны права пользователей на
использование дискового пространства (начал работать лишь в NT5)
|
$Upcase
|
файл - таблица соответствия заглавных и прописных букв в
имен файлов на текущем томе. Нужен в основном потому, что в NTFS имена файлов
записываются в Unicode, что составляет 65 тысяч различных символов, искать
большие и малые эквиваленты которых очень нетривиально.
|
Файлы
и потоки
Итак, у системы есть файлы - и ничего кроме файлов. Что включает в себя это понятие
на NTFS?
Прежде
всего, обязательный элемент - запись в MFT, ведь, как было сказано ранее, все
файлы диска упоминаются в MFT. В этом месте хранится вся информация о файле, за
исключением собственно данных. Имя файла, размер, положение на диске отдельных
фрагментов, и т.д. Если для информации не хватает одной записи MFT, то
используются несколько, причем не обязательно подряд.
Опциональный
элемент - потоки данных файла. Может показаться странным определение
"опциональный", но, тем не менее, ничего странного тут нет.
Во-первых, файл может не иметь данных - в таком случае на него не расходуется
свободное место самого диска. Во-вторых, файл может иметь не очень большой
размер. Тогда идет в ход довольно удачное решение: данные файла хранятся прямо
в MFT, в оставшемся от основных данных месте в пределах одной записи MFT.
Файлы, занимающие сотни байт, обычно не имеют своего "физического"
воплощения в основной файловой области - все данные такого файла хранятся в
одном месте - в MFT.
Довольно
интересно обстоит дело и с данными файла. Каждый файл на NTFS, в общем-то, имеет несколько абстрактное строение - у него нет как таковых данных, а есть
потоки (streams). Один из потоков и носит привычный нам смысл - данные файла.
Но большинство атрибутов файла - тоже потоки! Таким образом, получается, что
базовая сущность у файла только одна - номер в MFT, а всё остальное опционально.
Данная абстракция может использоваться для создания довольно удобных вещей -
например, файлу можно "прилепить" еще один поток, записав в него
любые данные - например, информацию об авторе и содержании файла, как это
сделано в Windows 2000 (самая правая закладка в свойствах файла, просматриваемых из проводника). Интересно, что эти дополнительные потоки не
видны стандартными средствами: наблюдаемый размер файла - это лишь размер
основного потока, который содержит традиционные данные. Можно, к примеру, иметь
файл нулевой длинны, при стирании которого освободится 1 Гбайт свободного места
- просто потому, что какая-нибудь хитрая программа или технология прилепила в
нему дополнительный поток (альтернативные данные) гигабайтового размера. Но на
самом деле в текущий момент потоки практически не используются, так что
опасаться подобных ситуаций не следует, хотя гипотетически они возможны. Просто
имейте в виду, что файл на NTFS - это более глубокое и глобальное понятие, чем
можно себе вообразить просто просматривая каталоги диска. Ну и напоследок: имя
файла может содержать любые символы, включая полый набор национальных
алфавитов, так как данные представлены в Unicode - 16-битном представлении, которое дает 65535 разных символов. Максимальная длина имени файла - 255
символов.
Каталоги
Каталог
на NTFS представляет собой специфический файл, хранящий ссылки на другие файлы
и каталоги, создавая иерархическое строение данных на диске. Файл каталога
поделен на блоки, каждый из которых содержит имя файла, базовые атрибуты и
ссылку на элемент MFT, который уже предоставляет полную информацию об элементе
каталога. Внутренняя структура каталога представляет собой бинарное дерево. Вот
что это означает: для поиска файла с данным именем в линейном каталоге, таком, например, как у FAT-а, операционной системе приходится просматривать все
элементы каталога, пока она не найдет нужный. Бинарное же дерево располагает
имена файлов таким образом, чтобы поиск файла осуществлялся более быстрым
способом - с помощью получения двухзначных ответов на вопросы о положении
файла. Вопрос, на который бинарное дерево способно дать ответ, таков: в какой
группе, относительно данного элемента, находится искомое имя - выше или ниже?
Мы начинаем с такого вопроса к среднему элементу, и каждый ответ сужает зону
поиска в среднем в два раза. Файлы, скажем, просто отсортированы по алфавиту, и
ответ на вопрос осуществляется очевидным способом - сравнением начальных букв.
Область поиска, суженная в два раза, начинает исследоваться аналогичным
образом, начиная опять же со среднего элемента.
Вывод
- для поиска одного файла среди 1000, например, FAT придется осуществить в
среднем 500 сравнений (наиболее вероятно, что файл будет найден на середине
поиска), а системе на основе дерева - всего около 12-ти (2^10 = 1024). Экономия
времени поиска налицо. Не стоит, однако думать, что в традиционных системах
(FAT) всё так запущено: во-первых, поддержание списка файлов в виде бинарного
дерева довольно трудоемко, а во-вторых - даже FAT в исполнении современной
системы (Windows2000 или Windows98) использует сходную оптимизацию поиска. Это
просто еще один факт в вашу копилку знаний. Хочется также развеять
распространенное заблуждение (которое я сам разделял совсем еще недавно) о том, что добавлять файл в каталог в виде дерева труднее, чем в линейный каталог: это
достаточно сравнимые по времени операции - дело в том, что для того, чтобы
добавить файл в каталог, нужно сначала убедится, что файла с таким именем там
еще нет :) - и вот тут-то в линейной системе у нас будут трудности с поиском
файла, описанные выше, которые с лихвой компенсируют саму простоту добавления
файла в каталог.
Какую
информацию можно получить, просто прочитав файл каталога? Ровно то, что выдает
команда dir. Для выполнения простейшей навигации по диску не нужно лазить в MFT
за каждым файлом, надо лишь читать самую общую информацию о файлах из файлов
каталогов. Главный каталог диска - корневой - ничем не отличается об обычных
каталогов, кроме специальной ссылки на него из начала метафайла MFT.
Журналирование
NTFS
- отказоустойчивая система, которая вполне может привести себя в корректное
состояние при практически любых реальных сбоях. Любая современная файловая
система основана на таком понятии, как транзакция - действие, совершаемое
целиком и корректно или не совершаемое вообще. У NTFS просто не бывает
промежуточных (ошибочных или некорректных) состояний - квант изменения данных
не может быть поделен на до и после сбоя, принося разрушения и путаницу - он
либо совершен, либо отменен.
Пример
1: осуществляется запись данных на диск. Вдруг выясняется, что в то место, куда
мы только что решили записать очередную порцию данных, писать не удалось -
физическое повреждение поверхности. Поведение NTFS в этом случае довольно
логично: транзакция записи откатывается целиком - система осознает, что запись
не произведена. Место помечается как сбойное, а данные записываются в другое
место - начинается новая транзакция.
Пример
2: более сложный случай - идет запись данных на диск. Вдруг, бах - отключается
питание и система перезагружается. На какой фазе остановилась запись, где есть
данные, а где чушь? На помощь приходит другой механизм системы - журнал
транзакций. Дело в том, что система, осознав свое желание писать на диск, пометила в метафайле $LogFile это свое состояние. При перезагрузке это файл
изучается на предмет наличия незавершенных транзакций, которые были прерваны
аварией и результат которых непредсказуем - все эти транзакции отменяются:
место, в которое осуществлялась запись, помечается снова как свободное, индексы
и элементы MFT приводятся в с состояние, в котором они были до сбоя, и система
в целом остается стабильна. Ну а если ошибка произошла при записи в журнал?
Тоже ничего страшного: транзакция либо еще и не начиналась (идет только попытка
записать намерения её произвести), либо уже закончилась - то есть идет попытка
записать, что транзакция на самом деле уже выполнена. В последнем случае при
следующей загрузке система сама вполне разберется, что на самом деле всё и так
записано корректно, и не обратит внимания на "незаконченную"
транзакцию.
И
все-таки помните, что журналирование - не абсолютная панацея, а лишь средство
существенно сократить число ошибок и сбоев системы. Вряд ли рядовой
пользователь NTFS хоть когда-нибудь заметит ошибку системы или вынужден будет запускать
chkdsk - опыт показывает, что NTFS восстанавливается в полностью корректное
состояние даже при сбоях в очень загруженные дисковой активностью моменты. Вы
можете даже оптимизировать диск и в самый разгар этого процесса нажать reset -
вероятность потерь данных даже в этом случае будет очень низка. Важно понимать, однако, что система восстановления NTFS гарантирует корректность файловой
системы, а не ваших данных. Если вы производили запись на диск и получили
аварию - ваши данные могут и не записаться. Чудес не бывает.
Сжатие
Файлы
NTFS имеют один довольно полезный атрибут - "сжатый". Дело в том, что NTFS имеет встроенную поддержку сжатия дисков - то, для чего раньше
приходилось использовать Stacker или DoubleSpace. Любой файл или каталог в
индивидуальном порядке может хранится на диске в сжатом виде - этот процесс
совершенно прозрачен для приложений. Сжатие файлов имеет очень высокую скорость
и только одно большое отрицательное свойство - огромная виртуальная
фрагментация сжатых файлов, которая, правда, никому особо не мешает. Сжатие
осуществляется блоками по 16 кластеров и использует так называемые
"виртуальные кластеры" - опять же предельно гибкое решение, позволяющее добиться интересных эффектов - например, половина файла может быть
сжата, а половина - нет. Это достигается благодаря тому, что хранение
информации о компрессированности определенных фрагментов очень похоже на
обычную фрагментацию файлов: например, типичная запись физической раскладки для
реального, несжатого, файла:
кластеры
файла с 1 по 43-й хранятся в кластерах диска начиная с 400-го
кластеры
файла с 44 по 52-й хранятся в кластерах диска начиная с 8530-го ...
Рекомендуем скачать другие рефераты по теме: конспект статьи, курсовые.
Предыдущая страница реферата |
1
2
3
4
5
6 |
Следующая страница реферата