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

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

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

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

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

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

Чтобы дефрагментировать файл, используйте следующие шаги:

  1. Используйте управляющий код FSCTL_GET_VOLUME_BITMAP, чтобы найти достаточно большое  место на томе, которое примет весь файл. Если необходимо, переместите другие файлы, чтобы сделать это место достаточно большим. Идеально, там должно быть достаточно много незанятых кластеров после первого экстента (непрерывной области) файла, в которые Вы можете запросто переместить последующие экстенты в пространство после первого экстента.
  2. Используйте управляющий код FSCTL_GET_RETRIEVAL_POINTERS, чтобы получить схему текущего размещения файла на диске. 
  3. Обход структуры RETRIEVAL_POINTERS_BUFFER, которая  возвращает FSCTL_GET_RETRIEVAL_POINTERS. Используйте управляющий код FSCTL_MOVE_FILE, чтобы переместить каждый кластер, поскольку Вы обходите структуру. Вам, время от времени, может потребоваться возвратить в прежнее состояние или битовый образ, или структуру поиска, или и то и другое, когда другие  процессы записывают на диск.

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

При использовании функции CreateFile, чтобы открыть каталог в ходе дефрагментации тома файловой системы FAT или FAT32, не устанавливайте значение маски доступа MAXIMUM_ALLOWED. В доступе к каталогу будет отказано, если это произойдет. Определите вместо него значение маски доступа GENERIC_READ.

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

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

При дефрагментации томов NTFS, дефрагментация виртуального кластера за пределами назначенного размера файла - разрешается.

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz