Samar-samar saya ingat pernah membaca di suatu tempat yang dulunya ada, di beberapa Unes cara untuk membuka file yang ada untuk menulis, dengan bendera yang meminta kernel untuk menggunakan versi lama (untuk proses lain mengaksesnya untuk membaca), sampai "baru" "versi sepenuhnya ditulis (ditutup), dari titik mana file muncul sebagai versi baru.
Dengan kata lain, proses lain baik melihat versi lama, atau yang baru, tidak pernah ditulis secara tidak lengkap.
Bisakah seseorang yang berpengetahuan mengarahkan saya ke referensi?
kernel
open-files
eudoxos
sumber
sumber
Jawaban:
Apa yang Anda gambarkan terdengar persis seperti penggantian nama dasar untuk menimpa file.
Ketika Anda mengganti nama / memindahkan satu file di atas yang lain, file yang lama tidak terhubung. Berarti file tersebut masih ada, tetapi tidak ada di pohon sistem file lagi. Dengan demikian aplikasi lama akan terus dapat mengakses file selama mereka tetap buka. Setelah semua aplikasi menutup file lama, maka sebenarnya tidak teralokasi pada disk.
The
rename
system call adalah operasi atom. Jadi untuk melakukan ini, Anda akan membuat file baru dengan nama yang berbeda, dan kemudian memanggilrename
untuk mengganti nama file sementara sebagai yang ingin Anda ganti. Karena operasi adalah atom, sama sekali tidak ada periode di mana file tersebut hilang. Langsung dari file lama ke file baru.Perhatikan bahwa file sementara dan file yang diganti harus berada pada titik pemasangan yang sama.
sumber
rename
hal swap. Bahkan jika 'fitur OS' seperti yang Anda bicarakan ada, program masih harus ditulis untuk memanfaatkan itu juga. Apa bedanya?open
syscall atau jika Anda harus melakukan apa yang Anda gambarkan dengan tangan.Seperti yang ditulis Patrick , cara biasa untuk melakukan ini adalah menulis versi baru ke file terpisah, dan ketika selesai mengganti nama versi baru dengan nama file lama, menimpa secara atomis. Operasi kedua ini disebut overwrite-by-rename .
Sekarang, beberapa referensi:
ISO C
rename
harus berupa atom. Dari Spesifikasi Basis Grup Terbuka :Versi lama Mac OS X tidak memiliki nama atom; ini dilaporkan diperbaiki di Lion.
Btrfs tampaknya sengaja melanggar standar dengan tidak menjamin penggantian nama atom , karena alasan kinerja. Namun, menimpa-oleh-nama masih atom , yang Anda butuhkan untuk tujuan ini.
sumber
man 3p rename
memberitahu saya bahwarename
itu memang atom, dan saya kira itu dimaksudkan untuk semua sistem file Linux. Dan ketika saya membaca artikel pertama yang Anda tautkan, saya masih berpikir bahwa operasi penggantian nama Btrf adalah atom.Ini mengingatkan saya pada Alokasikan Pada Siram . Ketika sebuah sistem file menggunakan fitur ini, alih-alih menulis data langsung ke disk, itu mengurangi ukuran data yang akan ditulis dari penghitung ruang kosong disk, dan menyimpan data dalam memori sampai panggilan sistem sinkronisasi dilakukan atau kernel memutuskan untuk menyiram buffer kotor.
Dalam hal ini, jika file sedang dimodifikasi oleh satu proses, dan dibuka oleh proses lain, proses terakhir akan "melihat" versi file yang tidak dimodifikasi ( atau "lama" jika Anda suka ).
Tentu saja, di atas adalah teoretis dan tergantung pada berbagai faktor, dan saya akan mengatakan sedikit tidak terduga - karena Anda tidak tahu persis kapan kernel akan menyiram halaman kotor. Sebagai contoh di Linux ( seperti Anda juga dapat membaca di bagian 15.3 dari Memahami Kernel Linux ), halaman-halaman kotor dapat ditulis ke disk dalam kondisi berikut:
Tembolok halaman menjadi terlalu penuh dan lebih banyak halaman dibutuhkan, atau jumlah halaman kotor menjadi terlalu besar.
Terlalu banyak waktu telah berlalu sejak halaman tetap kotor.
Suatu proses meminta semua perubahan yang tertunda dari perangkat blok atau dari file tertentu untuk dihapus; ia melakukan ini dengan menjalankan panggilan sistem sinkronisasi (), fsync (), atau fdatasync ().
Fitur ini dikenal diimplementasikan dalam sistem file HFS +, XFS, Reiser4, ZFS, Btrfs dan ext4.
sumber