Desfragmentando 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 são, pior é o problema, devido ao tempo necessário para mover o cabeçalho 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.

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

Desfragmentando 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 estar lendo e gravando 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 de uma estrutura de disco do sistema de arquivos, um conjunto de três códigos de controle é fornecido. Os códigos de controle fornecem a seguinte funcionalidade:

  • Habilitar aplicativos para localizar clusters vazios
  • Determinar o local do disco dos 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 escrevam 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 encontrar um local no volume que seja grande o suficiente para aceitar um arquivo inteiro.

    Observação

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

     

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

  3. Ande pela estrutura de RETRIEVAL_POINTERS_BUFFER retornada por FSCTL_GET_RETRIEVAL_POINTERS.

  4. 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 marcar 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 de 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 será negado se isso for feito.

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

Pontos de aná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 file:name:type ; 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 interações entre desfragmentação e cópias de sombra

Quando possível, mova dados em blocos alinhados entre si em incrementos de 16 quilobytes (KB). Isso reduz a sobrecarga de cópia na gravação quando as cópias de sombra sã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 é menor ou igual 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 (em 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 que os 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 será. Observe que mod(3,4) = 3 = mod(27,4). Mod 4 é escolhido porque quatro clusters a 4 KB cada um é equivalente 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ópia 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) compatíveis com FSCTL_MOVE_FILE. Outros arquivos, fluxos e tipos de fluxo não são compatíveis com FSCTL_MOVE_FILE.

Tipos de fluxo com suporte 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 têm suporte antes de Windows 8 e Windows Server 2012

Tipos de fluxo com suporte para qualquer diretório.

  • ::$BITMAP
  • ::$INDEX_ALLOCATION

A seguir estão os tipos de arquivo, fluxo e fluxo do sistema compatíveis com 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:$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