Дефрагментирование файлов

Если файл записывается на диск, иногда файл не может быть записан в смежных кластерах. Неконтентные кластеры замедляют процесс чтения и записи файла. Чем дальше на диске, тем хуже проблема, так как требуется переместить головку чтения и записи жесткого диска. Файл с неконтигированными кластерами фрагментирован. Чтобы оптимизировать файлы для быстрого доступа, том можно дефрагментировать.

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

Дефрагментация файла

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

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

  • Включение приложений для поиска пустых кластеров
  • Определение расположения дисков файловых кластеров
  • Перемещение кластеров на диске

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

Эти операции можно выполнять без подавления выполнения других процессов. Однако другие процессы имеют более медленное время отклика во время дефрагментации диска.

Для дефрагментации файла:

  1. Используйте код элемента управления FSCTL_GET_VOLUME_BITMAP, чтобы найти место на томе, достаточно большом для принятия всего файла.

Примечание.

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

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

  2. Пошаговые инструкции по структуре RETRIEVAL_POINTERS_BUFFER , возвращаемой FSCTL_GET_RETRIEVAL_POINTERS.

  3. Используйте код элемента управления FSCTL_MOVE_FILE для перемещения каждого кластера при переходе по структуре.

    Примечание.

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

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

При использовании CreateFile для открытия каталога во время дефрагментации тома файловой системы FAT или FAT32 укажите значение маски доступа GENERIC_READ . Не указывайте значение маски доступа MAXIMUM_ALLOWED . Если это сделано, доступ к каталогу запрещен.

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

Повторное синтаксический анализ точек, растровых изображений и списков атрибутов в томах файловой системы NTFS можно дефрагментировать, открывать для чтения и синхронизации и называть их с помощью синтаксиса file:name:type, например dirname:$i 30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT и mrp::$ATTRIBUTE_LIST.

При дефрагментации томов файловой системы 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:$I 30:$INDEX_ALLOCATION
  • $Extend::$ATTRIBUTE_LIST
  • $Extend:$I 30:$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:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata:$I 30:$BITMAP
  • $Extend\$RmMetadata::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair::$DATA
  • $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair:$Config:$DATA
  • $Extend\$RmMetadata\$Txf:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Txf:$I 30:$BITMAP
  • $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
  • $Extend\$RmMetadata\$TxfLog:$I 30:$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