GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è la differenza tra fsync e syncfs?

Primo, fsync() (e sync() ) sono funzioni standard POSIX mentre syncfs() è solo per Linux.

Quindi la disponibilità è una grande differenza.

Dallo standard POSIX per fsync() :

Il fsync() la funzione deve richiedere che tutti i dati per il descrittore di file aperto denominato da fildes deve essere trasferito al dispositivo di archiviazione associato al file descritto da fildes . La natura del trasferimento è definita dall'implementazione. Il fsync() la funzione non deve tornare finché il sistema non ha completato l'azione o finché non viene rilevato un errore.

Nota che è solo una richiesta.

Dallo standard POSIX per sync() :

Il sync() La funzione farà in modo che tutte le informazioni in memoria che aggiornano i file system siano pianificate per la scrittura su tutti i filesystem.

La scrittura, sebbene pianificata, non è necessariamente completa al ritorno da sync() .

Ancora una volta, non è garantito che ciò accada.

La pagina man di Linux per syncfs() (e sync() ) dichiara

sync() fa in modo che tutte le modifiche in sospeso ai metadati del filesystem e ai dati dei file memorizzati nella cache vengano scritti nei filesystem sottostanti.

syncfs() è come sync() , ma sincronizza solo il file system contenente il file indicato dal descrittore di file aperto fd .

Nota che quando la funzione restituita non è specificata.

Il Linux pagina man per fsync() afferma:

fsync() trasferisce ("svuota") tutti i dati in-core modificati di (ovvero, pagine di cache buffer modificate per) il file a cui fa riferimento il descrittore di file fd al dispositivo disco (o altro dispositivo di archiviazione permanente) in modo che tutte le informazioni modificate possano essere recuperate anche se il sistema si arresta in modo anomalo o viene riavviato. Ciò include la scrittura o lo svuotamento della cache di un disco, se presente. La chiamata viene bloccata finché il dispositivo non segnala che il trasferimento è stato completato.

Oltre a svuotare i dati del file, fsync() scarica anche le informazioni sui metadati associate al file (vedi inode(7)).

Chiamando fsync() non garantisce necessariamente che anche la voce nella directory contenente il file abbia raggiunto il disco. Per questo un esplicito fsync() è necessario anche un descrittore di file per la directory.

Si noti che le garanzie fornite da Linux per fsync() sono molto più forti di quelli forniti per sync() o syncfs() , e da POSIX per entrambi fsync() e sync() .

In sintesi:

  1. POSIX fsync() :"per favore scrivi i dati per questo file su disco"
  2. POSIX sync() :"scrivi tutti i dati su disco quando ci riesci"
  3. Linux sync() :"scrivi tutti i dati su disco (quando ci riesci?)"
  4. Linux syncfs() :"scrivi tutti i dati per il filesystem associato a questo file su disco (quando ci arrivi?)"
  5. Linux fsync() :"scrivi tutti i dati e i metadati per questo file su disco e non tornare finché non lo fai"

Si noti che la pagina man di Linux non specifica quando sync() e syncfs() ritorno.


Penso che la risposta attuale non sia completa. Per Linux:

Secondo le specifiche standard (ad esempio, POSIX.1-2001), sync() pianifica le scritture, ma può tornare prima che la scrittura effettiva sia terminata. Tuttavia Linux attende il completamento dell'I/O, e quindi sync() osyncfs() fornire le stesse garanzie di fsync chiamato rispettivamente su ogni file nel sistema o nel filesystem.

e

Prima della versione 1.3.20 Linux non attendeva il completamento dell'I/O prima di tornare.

Questo è menzionato nel sync(2) pagina nelle sezioni "note" e "bug".


Linux
  1. Qual è la differenza tra InnoDB e MyISAM?

  2. La differenza tra [[ $a ==Z* ]] e [ $a ==Z* ]?

  3. La differenza tra .exrc e .vimrc?

  4. Qual è la differenza tra ls e l?

  5. Qual è la differenza tra `fallocate --dig-holes` e `fallocate --punch-hole` in Linux?

Qual è la differenza tra Linux e Unix?

Qual è la differenza tra Login e Non-Login Shell

Qual è la differenza tra il comando apt e apt-get?

Che cos'è un hypervisor? Qual è la differenza tra il tipo 1 e 2?

Qual è la differenza tra curl e Wget?

Qual è la differenza tra route e ip route?