GNU/Linux >> Belajar Linux >  >> Linux

Apa perbedaan antara fsync dan syncfs?

Pertama, fsync() (dan sync() ) adalah fungsi standar POSIX sementara syncfs() hanya untuk Linux.

Jadi ketersediaan adalah salah satu perbedaan besar.

Dari standar POSIX untuk fsync() :

fsync() fungsi harus meminta bahwa semua data untuk filedescriptor terbuka dinamai dengan fildes akan ditransfer ke perangkat penyimpanan yang terkait dengan file yang dijelaskan oleh fildes . Sifat transfer ditentukan oleh implementasi. fsync() fungsi tidak akan kembali hingga sistem menyelesaikan tindakan tersebut atau hingga kesalahan terdeteksi.

Perhatikan bahwa ini hanya permintaan.

Dari standar POSIX untuk sync() :

sync() fungsi akan menyebabkan semua informasi dalam memori yang memperbarui sistem file dijadwalkan untuk ditulis ke semua sistem file.

Penulisan, meskipun dijadwalkan, belum tentu selesai setelah kembali dari sync() .

Sekali lagi, itu bukan sesuatu yang dijamin akan terjadi.

Halaman manual Linux untuk syncfs() (dan sync() ) menyatakan

sync() menyebabkan semua modifikasi tertunda pada metadata sistem file dan data file yang di-cache ditulis ke sistem file yang mendasarinya.

syncfs() seperti sync() , tetapi hanya menyinkronkan file yang berisi sistem file yang dirujuk oleh deskriptor file terbuka fd .

Perhatikan bahwa ketika pengembalian fungsi tidak ditentukan.

Linux halaman manual untuk fsync() menyatakan:

fsync() mentransfer ("flushes") semua data inti yang dimodifikasi dari (yaitu, halaman cache buffer yang dimodifikasi untuk) file yang dirujuk oleh filedescriptor fd ke perangkat disk (atau perangkat penyimpanan permanen lainnya) sehingga semua informasi yang diubah dapat diambil bahkan jika sistem macet atau di-boot ulang. Ini termasuk menulis melalui atau membilas cache disk jika ada. Panggilan diblokir hingga perangkat melaporkan bahwa transfer telah selesai.

Serta membilas data file, fsync() juga menghapus informasi metadata yang terkait dengan file (lihat inode(7)).

Memanggil fsync() tidak perlu memastikan bahwa entri dalam direktori yang berisi file tersebut juga telah mencapai disk. Untuk itu fsync() yang eksplisit pada deskriptor file untuk direktori juga diperlukan.

Perhatikan bahwa jaminan yang disediakan Linux untuk fsync() jauh lebih kuat daripada yang disediakan untuk sync() atau syncfs() , dan oleh POSIX untuk fsync() dan sync() .

Singkatnya:

  1. POSIX fsync() :"silakan tulis data untuk file ini ke disk"
  2. POSIX sync() :"tulis semua data ke disk saat Anda menyiasatinya"
  3. Linux sync() :"tulis semua data ke disk (ketika Anda melakukannya?)"
  4. Linux syncfs() :"tulis semua data untuk sistem file yang terkait dengan file ini ke disk (ketika Anda menyiasatinya?)"
  5. Linux fsync() :"tulis semua data dan metadata untuk file ini ke disk, dan jangan kembali sampai Anda melakukannya"

Perhatikan bahwa halaman manual Linux tidak menentukan kapan sync() dan syncfs() kembali.


Saya pikir jawaban saat ini tidak lengkap. Untuk Linux:

Menurut spesifikasi standar (misalnya, POSIX.1-2001), sync() menjadwalkan penulisan, tetapi dapat kembali sebelum penulisan sebenarnya selesai. Namun Linux menunggu penyelesaian I/O, dan dengan demikian sync() atau syncfs() memberikan jaminan yang sama seperti fsync dipanggil pada setiap filedalam sistem atau sistem file masing-masing.

dan

Sebelum versi 1.3.20 Linux tidak menunggu I/O selesai sebelum kembali.

Ini disebutkan di sync(2) di bagian "catatan" dan "bug".


Linux
  1. Apa perbedaan antara menulis ke file dan memori yang dipetakan?

  2. Apa perbedaan antara strtok_r dan strtok_s di C?

  3. Apa perbedaan antara fsck dan e2fsck?

  1. Apa perbedaan antara adduser dan useradd?

  2. Apa perbedaan antara `su -` dan` su --login`?

  3. Apa perbedaan antara unlink dan rm?

  1. Perbedaan Antara [[ $a ==Z* ]] Dan [ $a ==Z* ]?

  2. Perbedaan Antara .exrc Dan .vimrc?

  3. Apa perbedaan antara rute dan rute ip?