Дефрагментирование файлов
Если файл записывается на диск, иногда файл не может быть записан в смежных кластерах. Неконтентные кластеры замедляют процесс чтения и записи файла. Чем дальше на диске расположены неконтигуозные кластеры, тем больше проблема, потому что требуется больше времени для перемещения головки чтения и записи жесткого диска. Файл с неконтигированными кластерами фрагментирован. Чтобы оптимизировать файлы для быстрого доступа, том можно дефрагментировать.
Дефрагментация — это процесс перемещения частей файлов на диске, чтобы дефрагментировать их. То есть, это процесс перемещения кластеров файлов на диске для их упорядочения и создания непрерывной области хранения. Дополнительные сведения см. в следующих разделах:
- Дефрагментация файла
- Минимизация взаимодействий между дефрагментацией и теневыми копиями
- Файлы, потоки и типы потоков, поддерживаемые для дефрагментации
Дефрагментация файла
В простой однозадарной операционной системе программное обеспечение дефрагментации является единственной задачей, и другие процессы для чтения или записи на диск отсутствуют. Однако в многозадающей операционной системе некоторые процессы могут считываться с жесткого диска и записывать их на жесткий диск, а другой процесс дефрагментировать этот жесткий диск. Способ заключается в том, чтобы избежать записи в файл, который находится в процессе дефрагментации, не останавливая запись надолго. Решение этой проблемы не является тривиальным, но это возможно.
Чтобы разрешить дефрагментацию без подробных знаний о структуре диска файловой системы, предоставляется набор из трех кодов управления. Коды элементов управления предоставляют следующие функциональные возможности:
- Включение приложений для поиска пустых кластеров
- Определение расположения дисков файловых кластеров
- Перемещение кластеров на диске
Коды управления также прозрачно обрабатывают проблему подавления и позволяют другим процессам считывать и записывать файлы во время перемещения.
Эти операции можно выполнять без подавления выполнения других процессов. Однако другие процессы имеют более медленное время отклика во время дефрагментации диска.
Для дефрагментации файла:
- Используйте код элемента управления FSCTL_GET_VOLUME_BITMAP, чтобы найти место на томе, достаточно большом для принятия всего файла.
Примечание.
При необходимости переместите другие файлы, чтобы сделать место достаточно большим. В идеале после первого экстента файла должно быть достаточно нераспределенных кластеров, чтобы вы могли перемещать последующие экстенты в пространство за первым экстентом.
Используйте код элемента управления FSCTL_GET_RETRIEVAL_POINTERS, чтобы получить карту текущего макета файла на диске.
Изучите структуру RETRIEVAL_POINTERS_BUFFER, возвращаемую FSCTL_GET_RETRIEVAL_POINTERS.
Используйте код элемента управления FSCTL_MOVE_FILE для перемещения каждого кластера при переходе по структуре.
Примечание.
Возможно, потребуется обновить либо растровое изображение, либо структуру извлечения, или оба в разное время по мере того, как другие процессы пишут на диск.
Для двух операций, используемых в процессе дефрагментации, требуется дескриптор тома. Только администраторы могут получить дескриптор тома, поэтому только администраторы могут дефрагментировать том. Приложение должно проверять права пользователя, который пытается запустить программное обеспечение дефрагментации, и он не должен разрешать пользователю дефрагментировать том, если у пользователя нет соответствующих прав.
При использовании CreateFile для открытия каталога во время дефрагментации тома файловой системы FAT или FAT32 укажите значение маски доступа GENERIC_READ . Не указывайте значение маски MAXIMUM_ALLOWED доступа. Если это сделано, доступ к каталогу запрещен.
Не пытайтесь переместить выделенные кластеры в файловой системе NTFS, которая выходит за рамки округленного размера файла кластера, так как результатом является ошибка.
Повторный синтаксический анализ точек, битмапов и списков атрибутов в томах файловой системы NTFS можно дефрагментировать, открыть для чтения и синхронизации и назвать с помощью синтаксиса file:
При дефрагментации томов файловой системы NTFS дефрагментирование виртуального кластера за пределами размера выделения файла допускается.
Минимизация взаимодействий между дефрагментацией и теневыми копиями
По возможности перемещайте данные в блоках, выровненных друг относительно друга с шагом 16 килобайтов (КБ). Это снижает затраты на копирование во время включения теневых копий, так как теневое пространство копирования увеличивается и производительность снижается при возникновении следующих условий:
- Размер блока запроса перемещения меньше 16 КБ.
- Дельта перемещения не должна быть кратна 16 КБ.
Разность перемещения представляет собой количество байтов между началом исходного блока и началом целевого блока. Другими словами, блок, начинающийся со смещения X (на диске), можно переместить на начальное смещение Y, если абсолютное значение разницы X и Y является четным кратным 16 КБ. Предположим, что кластеры размером 4 КБ. Тогда переход из кластера 3 в кластер 27 будет оптимизирован, но переход от кластера 18 к кластеру 24 не будет. Обратите внимание, что mod(3,4) = 3 = mod(27,4). Мод 4 выбран, так как четыре кластера в 4 КБ каждый из них эквивалентен 16 КБ. Таким образом, том, отформатированный с размером кластера 16 КБ, обеспечит оптимизацию всех файлов перемещения.
Дополнительные сведения о теневых копиях см. в разделе Служба теневого копирования томов.
Файлы, потоки и типы потоков, поддерживаемые для дефрагментации
Хотя большинство файлов можно переместить с помощью кода элемента управления FSCTL_MOVE_FILE , не все можно переместить. Ниже приведен список файлов, потоков и типов потоков (также называемых кодами типов атрибутов), поддерживаемых FSCTL_MOVE_FILE. Другие файлы, потоки и типы потоков не поддерживаются FSCTL_MOVE_FILE.
Типы потоков, поддерживаемые для любого файла или каталога.
- ::$DATA
- ::$ATTRIBUTE_LIST
- ::$REPARSE_POINT
- ::$EA
- ::$LOGGED_UTILITY_STREAM
Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: ::$EA и ::$LOGGED_UTILITY_STREAM не поддерживаются до Windows 8 и Windows Server 2012
Типы потоков, поддерживаемые для любого каталога.
- ::$BITMAP
- ::$INDEX_ALLOCATION
Ниже приведены системные файлы, потоки и типы потоков, поддерживаемые FSCTL_MOVE_FILE в формате filename:streamname:$typename.
- $MFT::$DATA
- $MFT::$ATTRIBUTE_LIST
- $MFT::$BITMAP
- $AttrDef::$DATA
- $AttrDef::$ATTRIBUTE_LIST
- $Secure:$SDS:$DATA
- $Secure::$ATTRIBUTE_LIST
- $Secure:$SDH:$INDEX_ALLOCATION
- $Secure:$SDH:$BITMAP
- $Secure:$SII:$INDEX_ALLOCATION
- $Secure:$SII:$BITMAP
- $UpCase::$DATA
- $UpCase::$ATTRIBUTE_LIST
- $Extend:$I30:$INDEX_ALLOCATION
- $Extend::$ATTRIBUTE_LIST
- $Extend:$I30:$BITMAP
- $Extend\$UsnJrnl:$J:$DATA
- $Extend\$UsnJrnl::$ATTRIBUTE_LIST
- $Extend\$UsnJrnl:$Max:$DATA
- $Extend\$Quota:$Q:$INDEX_ALLOCATION
- $Extend\$Quota::$ATTRIBUTE_LIST
- $Extend\$Quota:$Q:$BITMAP
- $Extend\$Quota:$O:$INDEX_ALLOCATION
- $Extend\$Quota:$O:$BITMAP
- $Extend\$ObjId:$O:$INDEX_ALLOCATION
- $Extend\$ObjId::$ATTRIBUTE_LIST
- $Extend\$ObjId:$O:$BITMAP
- $Extend\$Reparse:$R:$INDEX_ALLOCATION
- $Extend\$Reparse::$ATTRIBUTE_LIST
- $Extend\$Reparse:$R:$BITMAP
- $Extend\$RmMetadata:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata:$I30:$BITMAP
- $Extend\$RmMetadata::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Repair::$DATA
- $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Repair:$Config:$DATA
- $Extend\$RmMetadata\$Txf:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Txf:$I30:$BITMAP
- $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
- $Extend\$RmMetadata\$TxfLog:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$TxfLog:$I 30:$BITMAP
- $Extend\$RmMetadata\$TxfLog\$Tops::$DATA
- $Extend\$RmMetadata\$TxfLog\$Tops::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$TxfLog\\$Tops:$T:$DATA
- $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$DATA
- $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$ATTRIBUTE_LIST