Delphi 6 -программирование


Фрагментация файлов



Фрагментация файлов

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

Если вы работали с персональным компьютером, вам должно быть известно, что файловая система MS-DOS имеет иерархическую структуру. Каждый логический диск имеет корневой каталог, в котором описаны файлы и другие каталоги, которые, в свою очередь, также могут описывать файлы и каталоги. Что значит "описаны"? Это означает, что для каждого файла в каталоге хранится отдельная запись, описывающая файл (или другой каталог). Эту запись мы будем называть дескриптором файла (или, соответственно, дескриптором каталога).

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

Мы уже говорили о том, что физически информация на диске храниться в секторах, которые для MS-DOS имеют размер 512 байт. Сектор - минимальный элемент данных, читаемый с диска или записываемый на диск. Для работы с файлами операционная система MS-DOS пользуется элементами данных, называемых кластерами. Кластер - это просто совокупность секторов, имеющих смежные номера. Кластер может состоять из одного сектора (для дискет) или содержать несколько секторов (для жёсткого диска).

Операционная система выделяет для записываемых на диск файлов некоторое количество кластеров, в зависимости от размера файла. Если файл маленький (например, в нём всего один или два байта), выделяется один кластер. Это, в частности, означает, что при размере кластера, равном 8 секторам, для хранения файла размером в один байт используется 4 килобайта дисковой памяти.

Где же располагаются кластеры, выделяемые файлу?

Номер первого выделенного файлу кластера хранится в дескрипторе файла, т.е. в каталоге. Для выделения остальных кластеров можно использовать две стратегии.

В первом случае можно было бы выделять для каждого файла необходимое количество кластеров, расположенных рядом. Однако в процессе работы с диском при записи и удалении файлов разного размера на диске появятся свободные и занятые области разной длины. Рано или поздно наступит такой момент, когда для записи нового файла операционная система не сможет найти свободный участок достаточной длины, несмотря на то, что суммарная длина свободных областей на диске будет превышать длину записываемого файла.

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

Операционная система MS-DOS поступает по-другому. Для нового файла распределяются любые свободные кластеры, даже если они расположены в разных местах диска. Для каждого файла MS-DOS хранит номера всех занимаемых им кластеров в специальной таблице - таблице размещения файлов. Обычно эту таблицу называют FAT (File Allocation Table).

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

После форматирования диска утилитой MS-DOS FORMAT все кластеры, предназначенные для хранения файлов, помечаются в FAT как свободные. В процессе записи на диск нового файла в FAT записываются номера всех кластеров, распределенных данному файлу. Эти номера хранятся в виде односвязного списка.

Список строится следующим образом. Перед началом записи нового файла на диск MS-DOS просматривает FAT и находит первый свободный кластер. Номер этого кластера записывается в дескриптор файла. Далее в сектора этого кластера записываются данные. Если файл короткий и помещается целиком в один кластер, после записи данных в элементе FAT, соответствующий первому кластеру записывается специальное число, означающее конец цепочки кластеров (0FFFFh или 0FFFh в зависимости от типа FAT).

Если же длина файла больше размера одного кластера, MS-DOS ищет следующий свободный кластер, который может оказаться в любом месте диска. Номер найденного свободного кластера записывается в элемент FAT для первого кластера, распределенного файлу. Таким образом, элемент FAT, соответствующий первому кластеру будет содержать ссылку на второй кластер, распределенный файлу. Ссылка представляет собой просто порядковый номер следующего кластера.

По мере того, как файл записывается на диск, MS-DOS формирует в FAT список кластеров, распределённых файлу. В элементе FAT, соответствующему последнему кластеру, распределённому файлу, записывается число, означающее конец цепочки кластеров.

При удалении файла все кластеры, принадлежащие файлу, помечаются как свободные - в соответствующие элементы FAT записывается нулевое значение. В каталоге первая буква имени файла заменяется на русскую букву "х" (в альтернативной кодировке символов). Это означает, что файл удалён. Те кластеры, которые раньше занимал удалённый файл, становятся доступными для записи новых файлов.

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

Однако при использовании описанного выше метода файл становится фрагментированным - он как бы "размазан" по диску. К чему это может привести?

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

Реально время чтения сильно фрагментированного файла по сравнению с файлом, занимающим непрерывную область на диске, может отличаться в несколько раз! Внешне это выглядит так, как будто все программы стали работать в несколько раз медленнее, при этом наблюдается интенсивное перемещение головок диска от одного участка файла к другому.

Существуют различные методы дефрагментации диска. Наиболее очевидный и наименее удобный - выгрузка всего диска на дискеты или стример, форматирование диска и восстановление всех файлов, соответственно, с дискет или стримера. Лучше всего использовать специальные программы, такие как Norton SPEEDISK. Во второй части главы мы подробно расскажем вам об использовании этой программы.









Начало  Назад  Вперед

Книжный магазин