In Windows 7 gibt es unter Verwendung des Geräte-Managers, Aufrufen der Eigenschaften eines Datenträgers und Aufrufen der Registerkarte Richtlinien zwei Optionen. Den Schreibcache, um den es bei dieser Frage nicht geht.
und
[X] Deaktivieren Sie das Leeren des Windows-Schreibcache-Puffers auf dem Gerät & lt; --- nur dieser!
Microsoft stellt einen Haftungsausschluss auf die Registerkarte für dieses Element. "Um Datenverlust zu vermeiden, aktivieren Sie dieses Kontrollkästchen nur, wenn das Gerät über ein separates Netzteil verfügt, mit dem das Gerät seinen Puffer im Falle eines Stromausfalls leeren kann."
Was ändert sich in einfachen Worten für das Schreiben, Speichern und Kopieren von Dateien?
1. Schreibaktionen für paranoide Programme ändern: (Fakt oder Fiktion)
Ändert es die Art und Weise, wie Schreiblöschvorgänge für ein Programm ausgeführt werden, bei dem ein Cache-Leeren erzwungen wird? Einige Programme sind sehr darauf bedacht, den Schreibvorgang zu beenden, ohne zu spekulieren. Können diese Programme ihr Schutzschreiben fortsetzen, oder ändert sich dies auch für diese Programme?
2. Arten der betroffenen Programme:
Welche Arten von Aktionen / Programmen wären von der Änderung betroffen oder nicht betroffen? Typ, manche Programme streamen, manche schreiben schnell, manche sind fortlaufend, manche sind schützend (oder jeder andere Typ, den Sie in einfachen Worten definieren könnten).
3. Haben Sie etwas gesehen oder sogar einen Benchmark:
Wenn die Einstellung aktiviert ist, welche schriftlichen Änderungen sind zu beobachten? Alle losen Beispiele einer beobachteten Verhaltensänderung. oder keine Verhaltensänderung festgestellt?
4. Was ist die Verzögerung oder Verzögerung:
Wir wissen, dass die meisten dieser Aktionen auf den meisten Computern sehr schnell sind. Die Daten werden möglicherweise geschrieben. Ist der Zeitaufwand im Verhältnis zur Geschwindigkeit des Laufwerks von Bedeutung?
Für die Zwecke meiner Frage ist das vorhandene Risiko nicht eine der Fragen. Wenn Sie es abdecken möchten, würde es nicht stören.
Was bedeutet "Cache-Puffer leeren"? ist fast ein Trick, aber der Link ist für ein anderes Betriebssystem. Obwohl das A einige Informationen enthält, ist selbst der im Link verwendete Begriff nicht derselbe. Es beantwortet auch nicht die wichtigsten Dinge, die ein Benutzer wissen möchte, die ich hier zu skizzieren versucht habe.
quelle
Antworten:
Ihre Behauptung in der ersten Frage ist Fiktion. Windows API-Aufrufe wie
FlushFileBuffers()
werden Stellen Sie dennoch sicher, dass die Daten vollständig auf den physischen Datenträger gelangen, auch wenn das Löschen des Schreibpuffers deaktiviert ist. Programme, die "sicher" sind und wissen, was sie tun, werden also in Ordnung sein. Anrufe wieFileStream.Flush()
Rufen Sie in .NET usw. diese API auf.Programme, die viele Datenträger-E / A-Vorgänge ausführen, ohne aufzurufen
FlushFileBuffers()
Direkt oder jede Helfer-API, die sie schließlich aufruft, würde die deutlichste Leistungssteigerung verzeichnen. Wenn Sie beispielsweise nicht unbedingt erforderliche E / A-Vorgänge ausführen, bei denen es in Ordnung ist, wenn Daten verloren gehen, z. B. BOINC (wenn Daten verloren gehen, laden Sie einfach die Datei erneut herunter oder versuchen Sie, die Berechnungen erneut zu berechnen), können Sie einen Aufruf vermeidenFlushFileBuffers()
, und rufen Sie einfach eine API wieWriteFile()
- Die Daten werden erhalten gepuffert geschrieben werden, aber es wird möglicherweise für eine lange Zeit nicht geschrieben, beispielsweise wenn der Dateideskriptor geschlossen wird oder wenn das Programm beendet wird. Leider ist es auch möglich, dass bei einem Systemabsturz (z. B. BSOD) alle Daten verloren gehen wirklich wichtig das, wenn Sie mit irgendeiner Art von wertvollen / nicht ersetzbaren Daten zu tun haben, die Sie tun tun AnrufFlushFileBuffers()
, ob die Pufferspülung aktiviert ist oder nicht! Andernfalls kann ein einfacher Treiberfehler (z. B. in Ihrem Grafiktreiber) dazu führen, dass Sie viele Daten verlieren.Ich kann keine Benchmarks finden, aber Sie werden es bei Programmen bemerken, die der Beschreibung im zweiten Punkt oben entsprechen.
Das Synchronisieren von Daten auf die Festplatte ist eigentlich nicht so schnell. insbesondere wenn es häufig in einer engen Schleife gemacht wird. Wenn ich mich beim Lesen von Windows Internals-Büchern korrekt erinnere, synchronisiert NTFS standardmäßig alle fehlerhaften Dateisystempuffer auf alle Datenträger 5 Sekunden . Dies ist anscheinend ein angemessener Kompromiss zwischen Stabilität und Leistung. Das Problem beim häufigen Synchronisieren von Daten besteht darin, dass die Festplatte viele Such- und Schreibvorgänge ausführt.
Betrachten Sie den folgenden Pseudocode:
Mit automatischer 5 Sekunden Pufferspülung auf :
Mit automatischer 5 Sekunden Pufferspülung aus (die Auswirkung des Kontrollkästchens in Ihrer Frage):
In Anbetracht der Tatsache, dass ein ausgelastetes System Hunderte bis Zehntausende Schreibvorgänge in Dateien pro Sekunde ausführen kann, ist dies für die Leistung hervorragend. insbesondere auf herkömmlichen rotierenden Festplatten (auf SSDs weniger beeindruckend). RAM ist im Allgemeinen 20-mal schneller als Festplatten, obwohl diese Lücke bei SSDs geringer ist.
Der Grund, warum sie sagen, dass Sie eine Batteriesicherung verwenden sollten, ist, dass Sie keine geschriebenen Daten im Wert von 35 Minuten im RAM haben möchten, die nicht auf die Festplatte geschrieben wurden, nur weil Ihr Programmierer faul war und nicht anrief
FlushFileBuffers()
und dann einen Stromausfall haben. Natürlich schützt Sie ein Batterie-Backup nicht vor Treiberfehlern, die einen BSOD verursachen ....quelle
Zugunsten Antwort von ChatBot John Cavil , Ich habe ein kleines Testprogramm geschrieben:
Führen Sie es auf einer Samsung 950 pro NVMe-Festplatte mit aktivierter Option "Deaktivieren Sie das Leeren des Windows-Schreibcache-Puffers auf dem Gerät" aus.
Das Ergebnis ist:
So können Sie das sehen
FlushFileBuffers
Anforderung wird vom System nicht ausgelassen (Windows wird nicht ignoriertFlushFileBuffers
anrufen, auch wenn die Optionen aktiviert sind).quelle
swTest
(und warum ist es nicht deklariert)? (2) Wollen Sie damit sagen, dass Sie zwei Kopien Ihres Programms erstellt haben, eine davon einschließlich dersfTest.Flush()
call und one not (d. h. mit auskommentiert), und verglichen sie? Bitte erkläre. (3) Ich kann Englisch, aber ich kann Ihren letzten Satz nicht verstehen.FlushFileBuffers
Rufen Sie an, auch wenn die Optionen aktiviert sind. Ich werde in der Antwort noch ein paar Kommentare hinzufügen, danke :-)