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

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

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

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

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

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

  • Разрешить приложениям находить пустые кластеры
  • Определение расположения файловых кластеров на диске
  • Перемещение кластеров на диск

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

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

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

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

    Примечание

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

     

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

  3. Пройдите RETRIEVAL_POINTERS_BUFFER структуру, возвращаемую FSCTL_GET_RETRIEVAL_POINTERS.

  4. Используйте код элемента управления 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