Perché il numero di file cambia?
Apparentemente ti stai concentrando esclusivamente sull'aspetto "copia i dati" di "copia un file". Un file è più di un semplice dato; è un'entità in un filesystem . Un file ha un nome, attributi e autorizzazioni. Tutte queste informazioni aggiuntive sul file devono essere duplicate insieme ai dati quando il "file viene copiato". Esiste una quantità significativa di I / O su disco per eseguire questo sovraccarico del filesystem.
La procedura per copiare un (1) file in un filesystem generico sarebbe qualcosa del tipo:
- Trova il file sorgente nel filesystem. (un)
- Leggere dal disco la voce della directory per il file di origine.
- Verifica i permessi di lettura.
- Trova il file di destinazione nel filesystem. (B)
- Verifica le autorizzazioni di scrittura nella directory di destinazione.
- Espandere la directory, se necessario, per accogliere il nuovo file. (C)
- Aggiorna la directory su disco. (C1)
- Trova blocchi gratuiti, allocali e aggiorna nuovamente la tabella. (D)
- Leggere i dati del file e copiarli nel file di destinazione (ovvero copiare il "file").
- Aggiorna la voce della directory per il nuovo file con (dimensione e ora). (E)
- Aggiorna il tempo di accesso della voce della directory di origine. (F)
(a) Almeno questo significa cercare la directory corrente. Oppure il percorso potrebbe iniziare dalla radice del filesystem e devono essere attraversati diversi livelli di directory.
(b) Almeno questo significa cercare la directory corrente. Oppure il percorso potrebbe iniziare dalla radice del filesystem e devono essere attraversati diversi livelli di directory. Se il file di destinazione esiste già, quindi determinare come procedere o interrompere la copia. Se il file di destinazione non esiste, è necessario creare una nuova voce di directory, e forse ciò comporta l'espansione della directory (ovvero l' overhead di allocazione del blocco di file (aka cluster) ).
(c) Se la directory deve essere espansa, allocare un nuovo blocco trovando un blocco libero, modificare la tabella di allocazione con la nuova allocazione, quindi scrivere i blocchi sul disco. Poiché la maggior parte dei filesystem mantiene più copie della tabella di allocazione, ciò significa che più scritture su disco.
(c1) Una volta individuata la directory di destinazione, leggere il blocco di directory dal disco, modificarlo con la nuova voce di directory per il file copiato, quindi scrivere il blocco sul disco.
(d) Per copiare il file, allocare i blocchi trovando blocchi liberi, modificare la tabella di allocazione con le nuove allocazioni, quindi scrivere i blocchi sul disco. Poiché la maggior parte dei filesystem mantiene più copie della tabella di allocazione, ciò significa che più scritture su disco. Per mantenere l'integrità dei dati, il filesystem potrebbe non tentare di unire (ritardare e unire) le operazioni di scrittura su disco per directory e tabelle di allocazione, ma piuttosto eseguire le operazioni di scrittura immediatamente quando i nuovi file vengono creati e allocati a blocchi.
(e) Una volta che la copia dei dati è conforme, aggiornare la nuova voce della directory per il file copiato con la lunghezza e il timestamp del file corretti, quindi scrivere il blocco della directory sul disco.
(f) Aggiorna la voce della directory di origine con un nuovo timestamp di "accesso" e quindi scrivi il blocco della directory sul disco.
Quindi, invece di un solo file, la tua domanda è se fare tutto questo per mille file potrebbe aumentare il tempo necessario per copiare solo la parte di dati dei file? Se copi solo un file di 24 MB, avrai qualcosa da confrontare con il tempo di copia di mille file.
Quando si esegue il backup di un file system, la copia dei singoli file su un altro file system su un disco o una partizione viene utilizzata raramente perché è un processo piuttosto lento, come è stato scoperto. Un metodo più veloce è quello di creare e scrivere un singolo file di archivio che contiene le voci della directory di origine e il contenuto del file in un formato file speciale; i programmi di backup e il comando * nix 'tar' possono generare un simile file di archivio. (Si noti che 'tar' gestisce solo i file di archivio e non usa la compressione come archivio + utilità di compressione.) Il metodo più veloce di backup è scrivere su un dispositivo a blocchi (piuttosto che un filesystem su un dispositivo), in modo che il filesystem di origine sia ignorato (trattato come più dati) e può essere eseguita una copia immagine blocco per blocco del dispositivo sorgente.