Поделиться через


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

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

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

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

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

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

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

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

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

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

  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::; например, dirname:$i30:$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:$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