“Windows yazma önbellek arabellek sifonunu aygıtta kapat” işlevinin tamamı ve etkisi nedir?


11

Windows 7'de, Aygıt Yöneticisi'ni kullanarak bir diskin özelliklerini açıp İlkeler sekmesine giderek 2 anahtar öğesi vardır. Bu soruyla ilgili olmayan yazma önbelleği.

ve

[X] Aygıtta Windows yazma önbellek arabelleğini temizlemeyi kapatın <--- bu yalnızca!

Microsoft bu öğenin sekmesine bir feragatname ekler. "Veri kaybını önlemek için, aygıtta güç kaybı olması durumunda aygıtın arabelleğini boşaltmasına izin veren ayrı bir güç kaynağı yoksa bu onay kutusunu seçmeyin."

Basit bir ifadeyle, bu dosya yazma, dosya kaydetme, dosya kopyalama için neyi değiştirir?

1. Paranoyak programlar için yazma eylemlerini değiştirme: (gerçek veya kurgu)
Önbellek sifresini zorlayan bir program için yazma sifonlarının çalışma şeklini değiştirir mi? Bazı programlar spekülasyon yapmadan yazmayı bitirmeyi çok amaçlıyorlar, bu programlar koruyucu yazmaya devam edebilir mi, yoksa bu programlar için de değişiyor mu?

2. Etkilenen program türleri:
Değişiklikten etkilenecek veya etkilenmeyecek eylem türleri / programlar nelerdir? Tür, bazı programlar akış, bazıları hızlı yazma, bazıları sürekli, bazıları koruyucu (veya basit terimlerle tanımlayabileceğiniz diğer türler)

3. Herhangi bir şey veya bir karşılaştırma ölçütü gördünüz mü:
Ayar açıksa, yazılı olarak gözlemlenebilir değişiklikler nelerdir? Gözlemlenen davranış değişikliğinin gevşek örnekleri. ya da davranışta herhangi bir değişiklik gözlenmedi?

4. Bekletme veya gecikme nedir:
Bu işlemlerin çoğunun çoğu bilgisayarda çok hızlı olduğunu biliyoruz, veriler eninde sonunda yazılacak. Sürücünün hızına göre, zaman miktarı önemli mi?

Sorumun amacı için, var olan risk sorulardan biri değil, eğer örtmek isterseniz, engel olmaz.

"Yazma önbellek yıkama" ne demek neredeyse bir dupe, ama bağlantı farklı bir işletim sistemi içindir. A'nın bazı bilgileri olmasına rağmen, bağlantıda kullanılan terim bile aynı değildir. Ayrıca, bir kullanıcının bilmek istediği en önemli şeylere, burada ana hatlarıyla anlatmaya çalıştığım yanıtı vermez.



1
NTFS, dosya sistemi meta veri bozulmasına karşı koruma sağlamak için günlük kaydı kullanır (dosya içeriği günlüğe kaydedilmese de), ancak yalnızca belirli yazma işlemlerinin doğru sırada gerçekleşeceği garanti edilebiliyorsa ve Windows, doğru siparişi sağlamak için belirli zamanlarda yazma önbelleğini temizler.
David

Yanıtlar:


9
  1. İlk sorudaki iddianız kurgu. Windows API böyle çağırır olacak hala veri bile özürlü kızarma tampon yazma ile, fiziksel ortama o kadar yolu almasını sağlayın. Yani, "güvenli" ve ne yaptıklarını bilen programlar gayet iyi olacak. .NET vb. Gibi çağrılar sonunda bu API'yı çağırır.FlushFileBuffers() FileStream.Flush()

  2. FlushFileBuffers()Doğrudan arama yapmadan çok fazla disk G / Ç yapan programlar veya sonunda çağrılan herhangi bir yardımcı API en belirgin performans artışını görür. Örneğin, BOINC gibi verilerin kaybolmasının iyi olmadığı durumlarda temel olmayan G / Ç çalıştırıyorsanız (kaybolursa, dosyayı yeniden indirmeniz veya hesaplamaları yeniden hesaplamayı denemeniz), FlushFileBuffers()gibi bir API'yı arayın WriteFile()ve veriler yazılacak şekilde arabelleğe alınacak, ancak dosya tanımlayıcısının kapalı olduğu veya programın çıktığı gibi potansiyel olarak uzun süre yazılamayacak. Ne yazık ki, sistem çökerse (BSOD gibi), tüm verilerin kaybolması da mümkündür, bu yüzden gerçekten önemlidirEğer emin değerli / değiştirilemeyen her türlü veriyi ilgileniyor eğer yapmak çağrıyı FlushFileBuffers()tampon yıkama etkin olup olmadığını,! Aksi takdirde, basit bir sürücü hatası (örneğin grafik sürücünüzde) çok fazla veri kaybetmenize neden olabilir.

  3. Hiçbir kıyaslama bulamıyorum, ancak yukarıdaki ikinci öğedeki açıklamaya uyan programlarla daha fazla fark edeceksiniz.

  4. Verileri diske senkronize etmek, özellikle sıkışık bir döngüde sık sık yapılıyorsa , o kadar hızlı değildir . Varsayılan olarak, Windows Internals kitaplarını okuduğumdan doğru şekilde hatırlarsam, NTFS varsayılan olarak tüm kirli dosya sistemi arabelleklerini her 5 saniyede bir diske eşitler . Görünüşe göre bu istikrar ve performans arasında iyi bir denge. Sık sık veri senkronizasyonu ile ilgili sorun, sabit sürücünün birçok arama ve yazma yapmasını sağlamasıdır.

Aşağıdaki sözde kodu düşünün:

1: seek to a certain block (1)
2: write a couple megabytes of data into blocks starting at (1)
3: wait 2 seconds
4: seek to another block (2)
5: write some more megabytes of data into blocks starting at (2)
6: seek back to block (1)
7: write some more megabytes of data into blocks starting at (1)
8: wait 10 minutes
9: seek to block (1)
10: write some megabytes of data into blocks starting at (1)
11: wait 5 seconds
12: seek to block (2)
13: write some megabytes of data into blocks starting at (2)
14: explicit call to FlushFileBuffers()

Otomatik 5 saniyelik tampon yıkama ile :

  • Satır 2, 5 ve 7'de meydana gelen yazma işlemleri RAM'de gerçekleşir ve disk ilk yazmadan bu yana 5 saniye geçene kadar hareket etmez ve ardından en son veriler (7. satırdan) blok (1) 'e yazılır ve sadece blok (2) 'ye yazılan veriler yazılır.
  • (1) ve (2) bloklarındaki verilerin üzerine yazan satır 10 ve 13'te meydana gelen yazılar tekrar diske yazılmalıdır
  • Blok (1) yazılmış var olduğu toplam sayısı Böylece RAM 3 ve bir diske , 2. Blok (2) yazılır var olduğu toplam sayısı RAM 2 ve diske , 2.

Ateş basması tampon otomatik 5 saniye ile kapalı (sorunuzu onay kutusu etkisini):

  • Satır 2, 5, 7, 10 ve 13'te oluşan yazma işlemleri RAM'de gerçekleşir ve satır 14 yürütülene kadar disk hareket etmez ve sonra en son veriler (satır 10 ve 13'ten) bloklara yazılır (1) ve 2). 2, 5 ve 7. satırlardaki eski veriler sabit diske asla vurmaz!

Meşgul bir sistemin saniyede dosyalara yüzlerce ila on binlerce yazma yaşayabileceği düşünüldüğünde, özellikle geleneksel dönen sabit sürücülerde (SSD'lerde daha az etkileyici) performans için mükemmeldir. RAM, genel bir önlem olarak sabit disklerden 20 kat daha hızlıdır, ancak SSD'lerde bu boşluk daha azdır.

Bir pil yedeği kullanmanız gerektiğini söylemelerinin nedeni, RAM'inizde sadece programcınız tembel olduğu ve aramadığı FlushFileBuffers()ve ardından arama yapmadığı için diske yazılmayan 35 dakikalık değere sahip yazılı verilerin olmasını istememenizdir. elektrik kesintisi. Tabii ki, bir pil yedekleme BSOD neden sürücü hatalara karşı sizi korumaz ....


0

ChatBot John Cavil'in cevabını desteklemek için küçük bir test programı yazdım:

// ...
byteEx btTest;
btTest.resize(1024*1024, 0xff); // 1MB data

CSysFile sfTest(byT("test.bin"));

swTest.Start(); // Begin timing by call `QueryPerformanceCounter` API
for (UINT i=0; i<10000; ++i) // Write 1MB data for 10000 times
{
    sfTest.SeekBegin();
    sfTest.Write(btTest); // Call `WriteFile` API 
//  sfTest.Flush();       // Call `FlushFileBuffers` API
}
swTest.Stop(); // Calculate the time-consuming start from `swTest.Start() `
// ...

Ve Samsung 950pro NVMe diskinde, “Aygıtta Windows yazma önbellek aralığını kapat” seçeneği etkinken çalıştırın.

Sonuç:

D:\tmp> test        // without sfTest.Flush();
00:00:00.729766     // use 0.73 seconds without FlushFileBuffers()

D:\tmp> test        // with sfTest.Flush();
00:00:06.736167     // use 6.74 seconds with FlushFileBuffers()

Böylece FlushFileBuffersisteğin sistem tarafından atlanmadığını görebilirsiniz ( FlushFileBuffersseçenekler etkinleştirilse bile Windows aramayı yok saymaz ).


Lütfen yorumunuzu cevabınızdan kaldırın. Öyle asla bir cevap olarak bir yorum göndermek için kabul edilebilir.
Ramhound

@ASBai: (1) (Ben C ++ biliyorum varsayalım program yazıldığı ne olduğunu 's), ancak Windows API bilmiyorum. Kodunuzu biraz açıklayabilir misiniz? ( Süper Kullanıcı'nın bazı kullanıcılarının kendi başına programcı olmadığını unutmayın .) Özellikle, nedir swTest(ve neden bildirilmedi)? (2) Programınızın biri sfTest.Flush()çağrı da dahil olmak üzere iki kopyası yaptığınızı (yani yorumla birlikte) ve bunları karşılaştırdığınızı mı söylüyorsunuz? Lütfen açıkla. (3) İngilizce biliyorum, ama son cümleni anlayamıyorum.
Scott

@Ramhound ama bir yorum yapmak veya yorum bırakmak için yeterli itibarım yok, nasıl çözülür?
ASBai

@Scott (1), swTest yüksek çözünürlüklü bir zamanlayıcı, zamanlama yapmak için Windows platformunda QueryPerformanceCounter API kullanın (Ben kritik bir nokta olduğunu düşünüyorum :-). (2) Evet, kesinlikle. (3) Kötü İngilizcem için üzgünüm, sadece şunu söylemek istiyorum: ChatBot John Cavil haklı, FlushFileBuffersseçenekler etkinleştirilse bile Windows çağrıyı görmezden geliyor (Bu seçenek etkinleştirildiğinde diğer kaynakların üzgün göründüğünü gördüm ).
Cevaba

@ASBai - Yorumu cevap olarak göndermemelisiniz. Gerçekten önemli değil, yorum göndermek için gereken itibara sahip değilsiniz, çünkü yorum asla cevap olarak gönderilmemelidir.
Ramhound
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.