Deframmentazione di file

Quando un file viene scritto in un disco, a volte il file non può essere scritto in cluster contigui. I cluster non contigui rallentano il processo di lettura e scrittura di un file. L'ulteriore differenza su un disco i cluster non contigui sono, il peggio è il problema, a causa del tempo necessario per spostare la testa di lettura/scrittura di un'unità disco rigido. Un file con cluster non contigui viene frammentato. Per ottimizzare i file per l'accesso rapido, è possibile deframmentare un volume.

La deframmentazione è il processo di spostamento di parti di file in un disco per deframmentare i file, ovvero il processo di spostamento di cluster di file su un disco per renderli contigui. Per ulteriori informazioni, vedere le sezioni seguenti:

Deframmentazione di un file

In un semplice sistema operativo a singola attività, il software di deframmentazione è l'unica attività e non ci sono altri processi da leggere o scrivere sul disco. Tuttavia, in un sistema operativo multitasking, alcuni processi possono leggere e scrivere in un'unità disco rigido mentre un altro processo deframmenta l'unità disco rigido. Il trucco consiste nell'evitare scritture in un file deframmentato senza interrompere il processo di scrittura per molto tempo. La risoluzione di questo problema non è semplice, ma è possibile.

Per consentire la deframmentazione senza richiedere una conoscenza dettagliata della struttura del disco del file system, viene fornito un set di tre codici di controllo. I codici di controllo forniscono le funzionalità seguenti:

  • Abilitare le applicazioni per individuare cluster vuoti
  • Determinare il percorso del disco dei cluster di file
  • Spostare i cluster in un disco

I codici di controllo gestiscono anche in modo trasparente il problema di inibire e consentire ad altri processi di leggere e scrivere nei file durante gli spostamenti.

Queste operazioni possono essere eseguite senza impedire l'esecuzione di altri processi. Tuttavia, gli altri processi hanno tempi di risposta più lenti mentre un'unità disco viene deframmentata.

Per deframmentare un file:

  1. Usare il codice di controllo FSCTL_GET_VOLUME_BITMAP per trovare una posizione nel volume di dimensioni sufficienti per accettare un intero file.

Nota

Se necessario, spostare altri file per creare un posto abbastanza grande. Idealmente, dopo il primo extent del file è possibile spostare gli extent successivi nello spazio dopo il primo extent.

  1. Usare il codice di controllo FSCTL_GET_RETRIEVAL_POINTERS per ottenere una mappa del layout corrente del file sul disco.

  2. Esaminare la struttura RETRIEVAL_POINTERS_BUFFER restituita da FSCTL_GET_RETRIEVAL_POINTERS.

  3. Usare il codice di controllo FSCTL_MOVE_FILE per spostare ogni cluster durante la procedura dettagliata della struttura.

    Nota

    Potrebbe essere necessario rinnovare la bitmap o la struttura di recupero oppure entrambe le volte come altri processi scrivono sul disco.

Due delle operazioni usate nel processo di deframmentazione richiedono un handle per un volume. Solo gli amministratori possono ottenere un handle per un volume, in modo che solo gli amministratori possano deframmentare un volume. Un'applicazione deve controllare i diritti di un utente che tenta di eseguire il software di deframmentazione e non deve consentire a un utente di deframmentare un volume se l'utente non dispone dei diritti appropriati.

Quando si usa CreateFile per aprire una directory durante la deframmentazione di un volume di file system FAT o FAT32, specificare il valore della maschera di accesso GENERIC_READ . Non specificare il valore della maschera di accesso MAXIMUM_ALLOWED . L'accesso alla directory viene negato se questa operazione viene eseguita.

Non tentare di spostare i cluster allocati in un file system NTFS che si estende oltre le dimensioni del file arrotondate al cluster, perché il risultato è un errore.

È possibile deframmentare i punti, le bitmap e gli elenchi di attributi nei volumi del file system NTFS, aprire per la lettura e la sincronizzazione e assegnare un nome usando la sintassi file:name:type, ad esempio dirname:$i 30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT e mrp::$ATTRIBUTE_LIST.

Quando si deframmenta i volumi del file system NTFS, è consentito deframmentare un cluster virtuale oltre le dimensioni di allocazione di un file.

Riduzione al minimo delle interazioni tra deframmentazione e copie shadow

Quando possibile, spostare i dati in blocchi allineati l'uno rispetto all'altro in incrementi di 16 kilobyte (KB). Ciò riduce il sovraccarico di copia su scrittura quando le copie shadow sono abilitate, perché lo spazio di copia shadow è aumentato e le prestazioni vengono ridotte quando si verificano le condizioni seguenti:

  • Le dimensioni del blocco di richieste di spostamento sono inferiori a 16 KB.
  • Il delta di spostamento non è in incrementi di 16 KB.

Il delta di spostamento è il numero di byte tra l'inizio del blocco di origine e l'inizio del blocco di destinazione. In altre parole, un blocco a partire dall'offset X (su disco) può essere spostato in un offset iniziale Y se il valore assoluto di X meno Y è un multiplo pari a 16 KB. Supponendo quindi che i cluster da 4 KB, il passaggio dal cluster 3 al cluster 27 sarà ottimizzato, ma non sarà possibile passare dal cluster 18 al cluster 24. Si noti che mod(3,4) = 3 = mod(27,4). Mod 4 viene scelto perché quattro cluster a 4 KB ciascuno equivale a 16 KB. Pertanto, un volume formattato con dimensioni del cluster di 16 KB comporterà l'ottimizzazione di tutti i file di spostamento.

Per altre informazioni sulle copie shadow, vedere Servizio Copia Shadow del volume.

File, flussi e tipi di flusso supportati per la deframmentazione

Anche se la maggior parte dei file può essere spostata usando il codice di controllo FSCTL_MOVE_FILE , non tutti possono essere spostati. Di seguito è riportato l'elenco di file, flussi e tipi di flusso (detti anche codici di tipo attributo) supportati da FSCTL_MOVE_FILE. Altri file, flussi e tipi di flusso non sono supportati da FSCTL_MOVE_FILE.

Tipi di flusso supportati per qualsiasi file o directory.

  • ::$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 non sono supportati prima di Windows 8 e Windows Server 2012

Tipi di flusso supportati per qualsiasi directory.

  • ::$BITMAP
  • ::$INDEX_ALLOCATION

Di seguito sono riportati i tipi di file di sistema, flusso e flusso supportati da FSCTL_MOVE_FILE nel formato "nomefile:nomefile:$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