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 a parte su un disco i cluster non contigui sono, il problema è peggiore, a causa del tempo necessario per spostare la testa di lettura/scrittura di un disco rigido. Un file con cluster non non contigui viene frammentato. Per ottimizzare i file per l'accesso rapido, un volume può essere deframmentato.

La deframmentazione è il processo di spostamento di parti di file in un disco per deframmentare i file, ovvero il processo di spostamento dei cluster di file in un disco per renderli contigui. Per altre 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 sono presenti altri processi da leggere o scrivere sul disco. Tuttavia, in un sistema operativo multitasking, alcuni processi possono essere letti da e scritti in un disco rigido mentre un altro processo sta deframmentando tale disco rigido. Il trucco consiste nell'evitare di scrivere in un file che viene deframmentato senza arrestare il processo di scrittura per molto tempo. La risoluzione di questo problema non è semplice, ma è possibile.

Per consentire la deframmentazione senza richiedere informazioni dettagliate sulla 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 i 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 abbastanza grande per accettare un intero file.

    Nota

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

     

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

  3. Seguire la struttura RETRIEVAL_POINTERS_BUFFER restituita da FSCTL_GET_RETRIEVAL_POINTERS.

  4. 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 in cui 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 in 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 del 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 viene eseguito.

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

È possibile analizzare di nuovo i punti, le bitmap e gli elenchi di attributi nei volumi del file system NTFS, aperti per la lettura e la sincronizzazione e denominati 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 il deframmentamento di un cluster virtuale oltre le dimensioni di allocazione di un file.

Riduzione al minimo delle interazioni tra la deframmentazione e le copie shadow

Quando possibile, spostare i dati in blocchi allineati tra loro in 16-kilobyte (KB). Ciò riduce il sovraccarico di copia in 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 della richiesta di spostamento sono inferiori o uguali 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 numero pari a 16 KB. Quindi, supponendo che i cluster a 4 KB, un passaggio da cluster 3 a cluster 27 sarà ottimizzato, ma uno spostamento da cluster 18 a cluster 24 non verrà ottimizzato. Si noti che mod(3,4) = 3 = mod(27,4). Mod 4 è scelto perché quattro cluster a 4 KB ogni è equivalente a 16 KB. Pertanto, un volume formattato in una dimensione del cluster di 16 KB comporta 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 (chiamati 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_UTILITÀ_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, di flusso e di flusso supportati da FSCTL_MOVE_FILE nel formato "nome file: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