Spostamento di un file mentre è in uso - Come funziona?


31

Ho notato che su sistemi operativi non Windows .... vale a dire linux / mac posso fare cose come: - Invia un zip a un amico per mirare - Elimina il file mentre è in trasferimento

E il trasferimento non fallisce.

Oppure, posso fare operazioni come ... - avviare un film - cancellare il file - il film viene comunque riprodotto fino al completamento (lettura dal disco, non solo bufferizzato in memoria)

Sebbene i file vengano "eliminati", come ho già detto, in realtà vengono spostati in una posizione diversa sul file system ... ovvero una directory Cestino o qualcosa del genere. Quindi mi sembra che il sistema operativo utilizzi un puntatore al file che viene aggiornato quando si sposta anziché accedere direttamente ai file.

Qualcuno può far luce su come questa capacità IMPRESSIONANTE è effettivamente implementata? Non sono nemmeno sicuro di cosa Google per saperne di più.

grazie.


1
In teoria suppongo ci siano 2 modi in cui potrebbe accadere. Entrambi sono realtà. Il file è in memoria. Oppure il file system ha riferimenti ai file e viene eliminato solo il riferimento. Entrambi sono realtà. Il fatto di riferimento è come i programmi non ripristinati possono ripristinare le cose. L'idea che il file venga effettivamente eliminato quando tutti i programmi che lo accedono si chiudono, sembra una sciocchezza. È possibile cercare elenchi collegati (una struttura di dati di programmazione, per comprendere il concetto in modo più approfondito). Oppure potresti cercare particolari file system.
barlop,

Risposte:


29

La voce della directory è solo un puntatore a un inode. L'inode contiene le meta-informazioni sul file (diverso dal nome) e puntatori ai dati del file (se presenti). Quando inizi a copiare un file ottieni un handle nell'inode.

Il sistema operativo mantiene un conteggio di riferimenti all'inode. Finché ci sono riferimenti all'inode, l'inode e i dati del file vengono mantenuti. Una volta rimossi tutti i riferimenti all'inode, l'inode è e lo spazio richiesto dal file viene rilasciato.

Poiché il file è aperto per la copia, verrà mantenuto fino a quando il processo non chiuderà il file. Ciò dovrebbe verificarsi al termine del trasferimento dei file e si verificherà in caso di esito negativo del processo di copia. Se il trasferimento del file non riesce a metà strada e sono stati eliminati tutti i collegamenti fisici al file, non sarà possibile riavviare correttamente il trasferimento.

EDIT: come altri hanno notato, gli spostamenti dei file sullo stesso dispositivo vengono eseguiti senza spostare i dati. Invece viene creata una nuova voce di directory nella directory di destinazione e la voce di directory originale viene rimossa.

È possibile avere più voci di directory per lo stesso file. Questi sono chiamati hard link. Vengono creati creando una nuova voce di directory per il file senza rimuovere la voce originale. L'inode del file system ha un conteggio di riferimento per registrare il numero di voci della directory che puntano al file.

EDIT2: se il processo si arresta in modo anomalo o viene interrotto, il file verrà rimosso in modo pulito poiché il conteggio degli accessi in memoria verrà ridotto a zero. Questa è l'azione che si verifica quando il programma termina normalmente.

In caso di mancanza di corrente o altro arresto anomalo del sistema, il disco avrà bisogno di un fsck(controllo del file system) prima di poter essere montato completamente. A seconda dello stato dell'inode su disco e delle strutture di directory, lo spazio verrà ripristinato, il file rimarrà nella directory o verrà creata una nuova voce nella lost+founddirectory. I risultati dipenderanno da quali modifiche sono state scaricate sul disco o scritte nel journal dei file system.


5
Esattamente. Non potrei metterlo meglio da solo. Per inciso, un trucco comune, se hai bisogno di un po 'di spazio per l'archiviazione dei file all'interno di un programma, è quello di creare un file /tmpe immediatamente unlink(2). A quel punto, non ci sono file in una directory (quindi nulla da ripulire all'uscita o in crash), ma il tuo processo ha ancora accesso al file e nessun altro processo può accidentalmente o deliberatamente rovinarlo. Ciò illustra la proprietà di interesse.
Norman Gray

Ciò significa che se un file aperto viene rimosso mentre un programma lo sta utilizzando e si verifica un'interruzione di corrente, i dati bloccati rimarranno sull'unità occupando spazio? Che dire se il processo che utilizza il file si arresta in modo anomalo o viene ucciso?
Jason C,

1
@JasonC Ho aggiornato la risposta per rispondere alle tue domande.
BillThor,

6

Come spiegato da Matt Jenkins, il sistema operativo (il filesystem) tiene traccia dei file tenuti aperti dalle applicazioni. Finché un processo mantiene un file aperto, i suoi dati rimangono sul disco (anche se è stato eliminato e non è più visibile o accessibile ad altri programmi.

Notare che una conseguenza di ciò è che lo spazio occupato da un file può essere recuperato solo dopo che l'ultimo processo che lo ha utilizzato lo ha chiuso. Questa è una FAQ per le operazioni del file system Linux / Unix: "Il comando 'df' dice che la partizione è piena, mentre 'du' riporta spazio libero" (vedi ad esempio http://batleth.sapienti-sat.org/projects/FAQs/ext3- faq.html ). Se è necessario liberare spazio, non è sufficiente eliminare file di grandi dimensioni (ad es. File di registro), è inoltre necessario assicurarsi che nessun processo li mantenga aperti (in genere un problema con i file di registro).


Non vero nel caso di OS X / HFS +: è possibile spostare i file, ad esempio nel Cestino, ma non attraverso le partizioni o eliminarli (cioè svuotare il Cestino).
Daniel Beck

2

In realtà è abbastanza semplice. Il file mantiene un elenco di riferimenti - processi che accedono al file. Quando elimini il file rimuove semplicemente l'elenco dalla directory ma non il file stesso. I programmi che hanno ancora il file aperto possono ancora accedervi. Il file viene effettivamente eliminato solo quando tutti i programmi che lo accedono lo chiudono.

Inoltre, spostando il file - se si trova all'interno dello stesso filesystem - il file non si sposta effettivamente in quanto tale, cambia semplicemente il puntatore alla directory in cui si trova il file.


"Il file mantiene un elenco di riferimenti"?
Daniel Beck

Dovrebbe essere il "sistema operativo o Explorer" non file.
Moab,

2
Quello sarebbe effettivamente il file system.
JRobert,

Il sistema operativo utilizza il filesystem per memorizzare i riferimenti nel file (collegamenti nella struttura dell'intestazione del file) - lì - siamo tutti contenti;)
Majenko,

1
I "riferimenti" sono entrambi processi con un handle aperto al file e collegamenti reali (incluso il primo nome del file) al file. I blocchi di dati non sono contrassegnati come liberi e disponibili per il riutilizzo fino a quando il conteggio dei riferimenti non è a zero.
mpez0,

0

Nei file system unix, un file può avere uno o più collegamenti fisici ad esso. Il file rimane attivo finché ne esiste almeno uno. Quando l'ultimo viene rimosso, lo spazio del file viene liberato. il link sopra ti darà un punto di partenza per ulteriori letture - vedi in particolare la sezione "Contatore di link".


1
Vero, ma non è quello che sta succedendo qui. Il punto è che anche dopo la rimozione dell'ultimo collegamento fisico, il file rimane comunque fino a quando tutti i pocess non hanno chiuso i loro handle.
sleske,
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.