Quale algoritmo di allocazione dei blocchi utilizza NTFS?


10

Su Windows XP 64, ho scaricato un file da 1,2 GB e si è frammentato, come mostra l'immagine. Sfortunatamente, prima di prendere l'istantanea di Piriform Defraggler ho deframmentato gli altri file, quindi non puoi vedere lo stato esatto nel punto in cui il file è stato scritto. Tuttavia, il disco era sempre vuoto come ora (usato il 25%) e appena frammentato.

screenshot 1

Quale algoritmo di allocazione dei blocchi utilizza NTFS? Sembra casuale o forse mettendolo dove si trova la testa del disco.

AGGIORNARE:

Questo è quello che è successo oggi dopo aver scritto 67 MiB di un nuovo file. È stato diviso in 731 frammenti, dimensione media di soli 95 KiB. Il file è stato usato per colmare alcune lacune, ma non tutte, non utilizza nemmeno l'enorme spazio libero continuo. Strano, vero?

screenshot 2

AGGIORNAMENTO 2:

A differenza di PC Guru , non credo proprio che Opera sia il colpevole. Penso che (al contrario di Google Chrome) non dica a Windows le dimensioni previste, tuttavia, ci sono molti casi in cui non è possibile ed è responsabilità del sistema operativo gestirlo in modo sano. L'immagine seguente mostra cosa è successo dopo un paio di giorni con me non facendo quasi nulla su questa partizione: la directory TEMP e tutti i miei dati (tranne quelli gestiti da Windows) si trovano entrambi altrove. Windows stesso sembra non usare SetEndOfFilee frammenta i propri file in modo terribile (600 frammenti per un paio di piccoli file di circa 40 MB). NTFS non sembra utilizzare il primo settore disponibile, poiché ci sono di nuovo file nel mezzo e anche vicino alla fine del disco piuttosto vuoto (utilizzo del 23%),

screenshot 3

Risposte:


12

IIRC, il filesystem NTFS tenta di allocare il file in una memoria contigua. Tuttavia, può farlo solo se il filesystem conosce la dimensione del file. Se apri un file e inizi a scriverlo, scriverà nel posto "migliore" per adattarlo al file (in genere verso l'esterno del piatto). Ma quel posto "migliore" potrebbe non essere abbastanza grande da contenere il file.

Se l'applicazione indica a NTFS le dimensioni effettive del file (con SetEndOfFile ()), NTFS può fare un lavoro migliore nel trovare spazio contiguo per il file (l'API SetEndOfFile fa sì che NTFS assegni l'archiviazione per l'intero file).


Ma sembra che NTFS abbia colmato tutte le lacune e abbia distribuito il resto in modo uniforme su tutto il disco. Come ho detto, il disco non è mai stato molto più pieno di adesso, parti del file sono state scritte in alcuni degli ultimi settori (ovvero nelle posizioni peggiori). Altre parti furono schiacciate in piccole aree tra due settori occupati sebbene ci fosse molto spazio libero altrove.
maaartinus,

Hai chiamato setEndOfFile prima di scrivere il file sul disco? in caso contrario, NTFS non ha modo di conoscere le dimensioni effettive del file, quindi il file verrà cresciuto utilizzando la memoria disponibile.
Ripristina Monica Larry Osterman il

Non ero io, era Opera. Molto probabilmente no. Tuttavia, non è un motivo per fare qualcosa di così strano.
maaartinus,

Cosa intendi con "quello strano"? Se NTFS conosce la dimensione del file che stai scrivendo, farà cose intelligenti sul file. Se non conosce le dimensioni del file, non può svolgere altrettanto bene un lavoro di allocazione della memoria.
Ripristina Monica Larry Osterman il

@ Larry Osterman: Certo, senza conoscere la dimensione del file è difficile farlo bene. Ma farlo è anche difficile.
maaartinus,

2

Il tuo problema deve essere con Opera. Ho appena visto un mucchio di file su un disco molto pieno e frammentato. I file di grandi dimensioni scaricati utilizzando Chrome erano tutti contigui.

Ciò suggerisce che Chrome conosceva le dimensioni del file all'inizio del download, quindi ha detto a NTFS le dimensioni del file da aspettarsi. Se lo fai NTFS proverà a posizionare il file in un singolo frammento, o quando nessun frammento è abbastanza grande, nei frammenti più grandi disponibili. È interessante notare che usa sempre questi frammenti in ordine decrescente di dimensioni, quindi i file di grandi dimensioni copiati da Explorer su un'unità frammentata, possono saltare su tutto il disco.

Laddove il programma non conosce le dimensioni del file o non si preoccupa di dire NTFS, ma invece apre semplicemente un file e inizia a scrivere dati sequenziali, sembra che NTFS agisca in modo molto simile a FAT32, che inizia semplicemente dal primo cluster disponibile (o il primo disponibile dopo l'ultimo allocato in quella sessione) utilizza quindi tutto ciò che è disponibile da lì in poi. Ad esempio, all'incirca nello stesso momento ho chiesto a CCleaner di scansionare il registro, facendogli eseguire il backup su un grande file ".Reg" txt. Questo file è iniziato vicino all'inizio dell'unità e poi è stato sparso su 127 frammenti diversi. A differenza dei file copiati con Explorer o scaricati con Chrome, in ogni file che ho visto, i cluster sono stati allocati in ordine crescente.

Per questa ricerca ho usato Winhex (versione di prova gratuita disponibile da Winhex.com). Quando si guarda una voce della directory. fare clic con il tasto destro del mouse su un nome file e selezionare Posizione, Elenco cluster, per visualizzare l'elenco dei cluster utilizzati da quel file.


Ho commentato la tua risposta alla mia domanda, dal momento che il mio commento è diventato lungo e ho aggiunto un'immagine.
maaartinus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.