Di Windows 7, menggunakan Device Manager, menampilkan properti disk, dan pergi ke tab Kebijakan, ada 2 item switch. Tembolok tulis, yang bukan tentang pertanyaan ini.
dan
[X] Matikan buffer write-cache Windows yang membilas perangkat <--- ini saja!
Microsoft menempatkan penafian pada tab untuk item itu. "Untuk mencegah kehilangan data, jangan pilih kotak centang ini kecuali perangkat memiliki catu daya terpisah yang memungkinkan perangkat untuk menyiram buffernya jika terjadi kehilangan daya."
Secara sederhana, apa perubahan ini untuk penulisan file, penyimpanan file, menyalin file?
1. Mengubah aksi tulis untuk program paranoid: (fakta atau fiksi)
Apakah itu mengubah cara penulisan flush bekerja untuk program yang memaksa terjadi flush cache? Beberapa program sangat ingin menyelesaikan penulisan, tanpa berspekulasi, apakah program-program ini dapat melanjutkan penulisan pelindung mereka, atau apakah ini berubah untuk program-program itu juga?
2. Jenis-jenis program yang dipengaruhi:
Apa jenis tindakan / program yang akan atau tidak akan terpengaruh oleh perubahan? Ketik, beberapa aliran program, beberapa melakukan penulisan cepat, beberapa berkelanjutan, beberapa protektif (atau jenis lain yang dapat Anda tetapkan dalam istilah sederhana).
3. Apakah Anda melihat sesuatu, atau bahkan tolok ukur:
Jika pengaturan aktif, apa saja perubahan yang dapat diamati secara tertulis? Contoh longgar dari perubahan perilaku yang diamati. atau mengamati tidak ada perubahan perilaku?
4. Apa kendala atau penundaan:
Kita tahu sebagian besar dari tindakan ini sangat cepat pada kebanyakan komputer, data akhirnya akan ditulis. Relatif dengan kecepatan drive, apakah jumlah waktu signifikan?
Untuk keperluan pertanyaan saya, risiko yang ada bukanlah salah satu pertanyaan, jika Anda ingin menutupinya, itu tidak akan menghalangi.
Apa yang dimaksud dengan "Write cache buffer flushing" hampir merupakan penipuan ini, tetapi tautannya untuk OS yang berbeda. Meskipun A memiliki beberapa info, bahkan istilah yang digunakan dalam tautan tidak sama. Itu juga tidak menjawab hal-hal paling penting yang ingin diketahui oleh pengguna, yang telah saya coba uraikan di sini.
sumber
Jawaban:
Penegasan Anda dalam pertanyaan pertama adalah fiksi. Panggilan Windows API seperti masih akan memastikan bahwa data sampai ke media fisik, bahkan dengan pembilasan penulisan buffer dinonaktifkan. Jadi, program yang "aman" dan tahu apa yang mereka lakukan akan baik-baik saja. Panggilan seperti .NET, dll. Akhirnya memanggil API ini.
FlushFileBuffers()
FileStream.Flush()
Program yang melakukan banyak I / O disk tanpa menelepon
FlushFileBuffers()
langsung, atau API penolong apa pun yang akhirnya memanggilnya, akan melihat peningkatan kinerja yang paling nyata. Misalnya, jika Anda menjalankan I / O yang tidak penting di mana tidak masalah jika data hilang, seperti BOINC (jika hilang Anda hanya mengunduh ulang file atau mencoba menghitung ulang perhitungan), Anda dapat menghindari panggilanFlushFileBuffers()
, dan panggil saja API sepertiWriteFile()
- data akan mendapat buffered untuk ditulis, tetapi sebenarnya tidak akan ditulis untuk waktu yang lama, seperti ketika deskriptor file ditutup, atau ketika program keluar. Sayangnya mungkin juga bahwa jika sistem crash (seperti BSOD), semua data hilang, jadi itu sangat pentingbahwa jika Anda berurusan dengan jenis data berharga / non-diganti yang Anda lakukan panggilanFlushFileBuffers()
, apakah penyangga pembilasan diaktifkan atau tidak! Kalau tidak, bug driver sederhana (misalnya pada driver grafis Anda) dapat menyebabkan Anda kehilangan banyak data.Tidak dapat menemukan tolok ukur apa pun, tetapi Anda akan lebih memperhatikannya dengan program yang sesuai dengan deskripsi di item kedua di atas.
Menyinkronkan data ke disk sebenarnya tidak secepat itu, terutama jika sering dilakukan dalam loop yang ketat. Secara default, jika saya mengingat dengan benar dari membaca buku-buku Windows Internals, NTFS secara default menyinkronkan semua buffer filesystem kotor ke disk setiap 5 detik . Ini tampaknya merupakan pertukaran yang layak antara stabilitas dan kinerja. Masalah dengan data yang sering disinkronkan adalah hal itu membuat hard drive melakukan banyak pencarian dan penulisan.
Pertimbangkan kodesemu berikut:
Dengan penyiraman otomatis 5 detik aktif :
Dengan buffer 5 detik otomatis luntur (efek kotak centang dalam pertanyaan Anda):
Menimbang bahwa sistem yang sibuk dapat mengalami antara ratusan hingga puluhan ribu file tulis per detik, ini bagus untuk kinerja, terutama pada hard drive pemintalan tradisional (kurang mengesankan pada SSD). RAM 20 kali lebih cepat dari hard drive sebagai ukuran umum, meskipun kesenjangannya kurang dengan SSD.
Alasan mereka mengatakan Anda harus menggunakan cadangan baterai adalah bahwa Anda tidak ingin memiliki data tertulis buffered dalam RAM selama 35 menit yang tidak ditulis ke disk hanya karena programmer Anda malas dan tidak menelepon
FlushFileBuffers()
, dan kemudian memiliki kegagalan daya. Tentu saja, cadangan baterai tidak melindungi Anda terhadap bug driver yang menyebabkan BSOD ....sumber
Untuk mendukung jawaban ChatBot John Cavil , saya telah menulis sebuah program pengujian kecil:
Dan jalankan di Samsung 950pro NVMe disk dengan opsi "Nonaktifkan buffer cache menulis Windows pada perangkat" diaktifkan.
Hasilnya adalah:
Jadi, Anda dapat melihat
FlushFileBuffers
permintaan tidak dihilangkan oleh sistem (Windows tidak mengabaikanFlushFileBuffers
panggilan bahkan jika opsi diaktifkan).sumber
swTest
(dan mengapa tidak dinyatakan)? (2) Apakah Anda mengatakan bahwa Anda membuat dua salinan dari program Anda, satu termasuksfTest.Flush()
panggilan dan satu tidak (yaitu, dengan itu berkomentar), dan membandingkannya? Tolong jelaskan. (3) Saya tahu bahasa Inggris, tetapi saya tidak mengerti kalimat terakhir Anda.FlushFileBuffers
panggilan bahkan jika opsi diaktifkan (saya melihat beberapa sumber lain sedih panggilan akan diabaikan ketika opsi ini telah diaktifkan ). Saya akan menambahkan beberapa komentar lagi dalam jawabannya, terima kasih :-)