Compartilhar via


Desfragmentação de arquivos

Quando um arquivo é gravado em um disco, às vezes o arquivo não pode ser gravado em clusters contíguos. Clusters não contíguos retardam o processo de leitura e gravação de um arquivo. Quanto mais distantes em um disco os clusters não contíguos estiverem, pior será o problema, devido ao tempo necessário para mover o cabeçote de leitura/gravação de uma unidade de disco rígido. Um arquivo com clusters não contíguos é fragmentado. Para otimizar arquivos para acesso rápido, um volume pode ser desfragmentado.

A desfragmentação é o processo de mover partes de arquivos em um disco para desfragmentar arquivos, ou seja, o processo de mover clusters de arquivos em um disco para torná-los contíguos. Para obter mais informações, consulte as seções a seguir:

Desfragmentação de um arquivo

Em um sistema operacional simples de tarefa única, o software de desfragmentação é a única tarefa e não há outros processos para ler ou gravar no disco. No entanto, em um sistema operacional multitarefa, alguns processos podem ser lidos e gravados em uma unidade de disco rígido, enquanto outro processo está desfragmentando essa unidade de disco rígido. O truque é evitar gravações em um arquivo que está sendo desfragmentado sem interromper o processo de gravação por muito tempo. Resolver esse problema não é trivial, mas é possível.

Para permitir a desfragmentação sem exigir conhecimento detalhado da estrutura de disco de um sistema de arquivos, um conjunto de três códigos de controle é fornecido. Os códigos de controle oferecem a seguinte funcionalidade:

  • Habilitar que os aplicativos localizem clusters vazios
  • Determinar a localização do disco de clusters de arquivos
  • Mover clusters em um disco

Os códigos de controle também lidam de forma transparente com o problema de inibir e permitir que outros processos leiam e gravem em arquivos durante as movimentações.

Essas operações podem ser executadas sem inibir a execução de outros processos. No entanto, os outros processos têm tempos de resposta mais lentos enquanto uma unidade de disco está sendo desfragmentada.

Para desfragmentar um arquivo:

  1. Use o código de controle FSCTL_GET_VOLUME_BITMAP para localizar um local no volume que seja grande o suficiente para aceitar um arquivo inteiro.

Observação

Se necessário, mova outros arquivos para criar um local grande o suficiente. Idealmente, há clusters não alocados suficientes após a primeira extensão do arquivo para que você possa mover extensões subsequentes para o espaço após a primeira extensão.

  1. Use o código de controle FSCTL_GET_RETRIEVAL_POINTERS para obter um mapa do layout atual do arquivo no disco.

  2. Percorra pela estrutura RETRIEVAL_POINTERS_BUFFER retornada por FSCTL_GET_RETRIEVAL_POINTERS.

  3. Use o código de controle FSCTL_MOVE_FILE para mover cada cluster à medida que você percorre a estrutura.

    Observação

    Talvez seja necessário renovar o bitmap ou a estrutura de recuperação, ou ambos, em vários momentos, à medida que outros processos gravam no disco.

Duas das operações usadas no processo de desfragmentação exigem um identificador para um volume. Somente os administradores podem obter um identificador para um volume, portanto, somente os administradores podem desfragmentar um volume. Um aplicativo deve verificar os direitos de um usuário que tenta executar o software de desfragmentação e não deve permitir que um usuário desfragmente um volume se o usuário não tiver os direitos apropriados.

Ao usar CreateFile para abrir um diretório durante a desfragmentação de um volume do sistema de arquivos FAT ou FAT32, especifique o valor da máscara de acesso GENERIC_READ. Não especifique o valor da máscara de acesso MAXIMUM_ALLOWED. O acesso ao diretório é negado se isso for feito.

Não tente mover clusters alocados em um sistema de arquivos NTFS que se estendam além do tamanho do arquivo arredondado do cluster, pois o resultado é um erro.

Pontos de reanálise, bitmaps e listas de atributos em volumes do sistema de arquivos NTFS podem ser desfragmentados, abertos para leitura e sincronização e nomeados usando a sintaxe arquivo:nome:tipo; por exemplo, dirname:$i 30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT e mrp::$ATTRIBUTE_LIST.

Ao desfragmentar volumes do sistema de arquivos NTFS, é permitido desfragmentar um cluster virtual além do tamanho de alocação de um arquivo.

Minimizando as interações entre a desfragmentação e as cópias de sombra

Quando possível, mova os dados em blocos alinhados uns aos outros em incrementos de 16 quilobytes (KB). Isso reduz a sobrecarga de cópia na gravação quando as cópias de sombra estão habilitadas, pois o espaço de cópia de sombra é aumentado e o desempenho é reduzido quando ocorrem as seguintes condições:

  • O tamanho do bloco de solicitação de movimentação é inferior a 16 KB.
  • O delta de movimentação não está em incrementos de 16 KB.

O delta de movimentação é o número de bytes entre o início do bloco de origem e o início do bloco de destino. Em outras palavras, um bloco que começa no deslocamento X (no disco) pode ser movido para um deslocamento inicial Y se o valor absoluto de X menos Y for um múltiplo par de 16 KB. Portanto, supondo clusters de 4 KB, uma mudança do cluster 3 para o cluster 27 será otimizada, mas uma mudança do cluster 18 para o cluster 24 não. Observe que mod (3,4) = 3 = mod (27,4). O Mod 4 é escolhido porque quatro clusters de 4 KB cada equivalem a 16 KB. Portanto, um volume formatado para um tamanho de cluster de 16 KB resultará na otimização de todos os arquivos de movimentação.

Para obter mais informações sobre cópias de sombra, consulte Serviço de Cópias de Sombra de Volume.

Arquivos, fluxos e tipos de fluxo com suporte para desfragmentação

Embora a maioria dos arquivos possa ser movida usando o código de controle FSCTL_MOVE_FILE, nem todos podem ser movidos. Abaixo está a lista de arquivos, fluxos e tipos de fluxo (também chamados de códigos de tipo de atributo) suportados pelo FSCTL_MOVE_FILE. Outros arquivos, fluxos e tipos de fluxo não são suportados pelo FSCTL_MOVE_FILE.

Tipos de fluxo suportados para qualquer arquivo ou diretório.

  • ::$DATA
  • ::$ATTRIBUTE_LIST
  • ::$REPARSE_POINT
  • ::$EA
  • ::$LOGGED_UTILITY_STREAM

Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: ::$EA e ::$LOGGED_UTILITY_STREAM não são suportados antes do Windows 8 e Windows Server 2012

Tipos de fluxo suportados para qualquer diretório.

  • ::$BITMAP
  • ::$INDEX_ALLOCATION

A seguir estão os tipos de arquivo, fluxo e fluxo do sistema suportados pelo FSCTL_MOVE_FILE no formato "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:$I30:$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