menulis ulang file yang sudah ada sehingga diganti dengan versi baru secara atom, hanya sekali ditulis sepenuhnya

18

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?

eudoxos
sumber
Kedengarannya seperti apa yang mungkin dilakukan Plan 9 , tetapi tidak.
Gilles 'SO- stop being evil'
2
Terdengar seperti Files-11 di OpenVMS: "Setiap kali file disimpan, alih-alih menimpa versi yang ada, file baru dengan nama yang sama tetapi nomor versi yang bertambah dibuat."
Mat
Mengapa Anda bertanya? Apakah Anda memerlukan fungsi itu, atau hanya rasa ingin tahu?
Nils
1
Saya akan senang memiliki fungsi itu, dan saya ingat pernah membaca di suatu tempat bahwa itu ada. Jadi campuran keduanya perlu dan rasa ingin tahu.
eudoxos
Semua sistem Unix memungkinkan ini dengan cara lain - buat file baru di direktori yang sama, isi dengan konten yang diubah dan lakukan penggantian nama atom. Ini jauh lebih mahal untuk perubahan kecil tetapi bekerja.
Netch

Jawaban:

14

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 renamesystem call adalah operasi atom. Jadi untuk melakukan ini, Anda akan membuat file baru dengan nama yang berbeda, dan kemudian memanggil renameuntuk 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.

Patrick
sumber
Anda hanya dapat menggunakannya jika program Anda secara khusus ditulis dengan fungsi dalam pikiran. Dalam hal ini, bagaimanapun, itu adalah fitur OS, di mana bahkan program reguler diberi semantik atom ini secara otomatis.
eudoxos
1
@eudoxos komentar Anda tidak masuk akal. Anda mengatakan program harus ditulis khusus untuk melakukan renamehal swap. Bahkan jika 'fitur OS' seperti yang Anda bicarakan ada, program masih harus ditulis untuk memanfaatkan itu juga. Apa bedanya?
Patrick
Ada perbedaan jika Anda mengoper bendera (mungkin tidak didukung) ke opensyscall atau jika Anda harus melakukan apa yang Anda gambarkan dengan tangan.
eudoxos
Ingatlah bahwa untuk menjaga versi baru atau sepenuhnya ditulis baru jika terjadi kerusakan, Anda perlu juga menyinkronkan file baru ke disk dengan fsync atau sejenisnya
textshell
@ teks tanpa sinkronisasi Anda masih mendapatkan atomicity .... hanya saja tidak tahan ... benar? Saya tidak mengerti argumen di goo.gl/qfQQfy dalam kasus ini. Dalam kasus saya, saya memiliki sistem di bawah beban ekstrim dan saya ingin menghindari flush sistem file dan saya tidak peduli jika file tersebut selamat dari kerusakan.
wcochran
6

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:

Siput mekanik
sumber
man 3p renamememberitahu saya bahwa renameitu 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.
hagello
1

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.

dkaragasidis
sumber
2
Apa yang Anda gambarkan adalah teknik sistem file yang seharusnya tidak terlihat dari userspace (dan dengan demikian tidak melakukan apa yang Anda indikasikan) pada sistem POSIX (file) (lihat menulis : "Jika data file read () dapat dibuktikan (dengan cara apa pun) terjadi setelah data () ditulis, itu harus mencerminkan data tersebut (), bahkan jika panggilan dilakukan oleh proses yang berbeda . "). Proses lain tidak akan melihat data lama (pada POSIX).
Mat
Terima kasih atas koreksinya. Saya kira pemahaman saya tentang teknik sistem file ini salah.
dkaragasidis
Benar, ini terlihat seperti sesuatu yang lain. Samar-samar saya ingat sekarang bahwa dalam sebuah wawancara dengan RMS ia menyebutkan fitur ini, mungkin itu adalah sistem kuno yang tidak pernah hidup di luar akademisi ... Terima kasih.
eudoxos