Dateizwischenspeicherung

Standardmäßig speichert Windows Dateidaten zwischen, die von Datenträgern gelesen und auf Datenträger geschrieben werden. Dies impliziert, dass Lesevorgänge Dateidaten aus einem Bereich im Systemspeicher lesen, der als Systemdateicache bezeichnet wird, und nicht aus dem physischen Datenträger. Entsprechend schreiben Schreibvorgänge Dateidaten in den Systemdateicache statt auf den Datenträger, und diese Art von Cache wird als Zurückschreibcache bezeichnet. Zwischenspeichern wird auf Dateiobjektbasis verwaltet.

Das Zwischenspeichern erfolgt unter der Leitung des Cache-Managers, der kontinuierlich ausgeführt wird, während Windows ausgeführt wird. Dateidaten im Systemdateicache werden in vom Betriebssystem festgelegten Intervallen auf den Datenträger geschrieben, und der zuvor von diesen Dateidaten verwendete Arbeitsspeicher wird freigegeben. Dies wird als Leeren des Caches bezeichnet. Die Richtlinie, das Schreiben der Daten in die Datei zu verzögern und sie im Cache zu speichern, bis der Cache geleert wird, wird als verzögertes Schreiben bezeichnet und vom Cache-Manager in einem bestimmten Zeitintervall ausgelöst. Die Zeit, zu der ein Dateidatenblock geleert wird, basiert teilweise auf dem Zeitraum, für den er im Cache gespeichert wurde, und auf der Zeit, die seit dem letzten Zugriff auf die Daten in einem Lesevorgang verstrichen ist. Dadurch wird sichergestellt, dass die Möglichkeit des Zugriffs auf häufig gelesene Dateidaten im Systemdateicache für eine maximale Zeitspanne erhalten bleibt.

Dieser Dateidatenzwischenspeicherungsprozess wird in der folgenden Abbildung veranschaulicht.

Dateidatenzwischenspeicherungsprozess

Wie in den vollfarbigen Pfeilen in der vorherigen Abbildung dargestellt, wird ein 256-KB-Datenbereich in einen 256-KB-Cache-"Slot" im Systemadressraum eingelesen, wenn er zum ersten Mal vom Cache-Manager während eines Dateilesevorgangs angefordert wird. Ein Benutzermodusprozess kopiert die Daten in diesem Slot dann in seinen eigenen Adressraum. Wenn der Prozess den Datenzugriff abgeschlossen hat, schreibt er die geänderten Daten wieder in denselben Slot im Systemcache, wie mit dem gestrichelten Pfeil zwischen den Adressraum des Prozesses und dem Systemcache dargestellt. Wenn der Cache-Manager festgestellt hat, dass die Daten für einen bestimmten Zeitraum nicht mehr benötigt werden, schreibt er die geänderten Daten zurück in die Datei auf dem Datenträger, wie der gepunktete Pfeil zwischen dem Systemcache und dem Datenträger zeigt.

Der Umfang der E/A-Leistung, die das Zwischenspeichern von Dateidaten bietet, hängt von der Größe des gelesenen oder geschriebenen Dateidatenblocks ab. Wenn große Blöcke von Dateidaten gelesen und geschrieben werden, ist es wahrscheinlicher, dass Lese- und Schreibvorgänge auf dem Datenträger erforderlich sind, um den E/A-Vorgang abzuschließen. Die E/A-Leistung wird zunehmend beeinträchtigt, wenn mehr dieser E/A-Vorgänge auftreten.

In diesen Situationen kann die Zwischenspeicherung deaktiviert werden. Dies geschieht beim Öffnen der Datei, indem FILE_FLAG_NO_BUFFERING als Wert für den dwFlagsAndAttributes-Parameter von CreateFile übergeben wird. Wenn die Zwischenspeicherung deaktiviert ist, greifen alle Lese- und Schreibvorgänge direkt auf den physischen Datenträger zu. Die Dateimetadaten können jedoch weiterhin zwischengespeichert werden. Verwenden Sie die FlushFileBuffers-Funktion , um die Metadaten auf den Datenträger zu leeren.

Die Häufigkeit, mit der geleert wird, ist ein wichtiger Aspekt, bei dem die Systemleistung mit der Zuverlässigkeit des Systems in Einklang steht. Wenn das System den Cache zu oft leert, wird die Systemleistung durch die Anzahl großer Schreibvorgänge erheblich beeinträchtigt. Wenn das System nicht häufig genug geleert wird, ist die Wahrscheinlichkeit größer, dass entweder der Systemspeicher durch den Cache erschöpft wird oder dass ein plötzlicher Systemausfall (z. B. ein Stromausfall des Computers) vor dem Leeren auftritt. In letzterem instance gehen die zwischengespeicherten Daten verloren.

Um sicherzustellen, dass die richtige Menge an Leerung erfolgt, erzeugt der Cache-Manager jede Sekunde einen Prozess, der als verzögerter Writer bezeichnet wird. Der verzögerte Writer-Prozess stellt ein Achtel der Seiten, die kürzlich nicht geleert wurden, in die Warteschlange, um auf den Datenträger geschrieben zu werden. Die Datenmenge, die geleert wird, wird ständig neu ausgewertet, um eine optimale Systemleistung zu erzielen, und wenn mehr Daten geschrieben werden müssen, werden mehr Daten in die Warteschlange eingereiht. Verzögerte Writer leeren temporäre Dateien nicht, da davon ausgegangen wird, dass sie von der Anwendung oder dem System gelöscht werden.

Einige Anwendungen, z. B. Virenprüfsoftware, erfordern, dass ihre Schreibvorgänge sofort auf den Datenträger geleert werden; Windows bietet diese Möglichkeit durch Zwischenspeichern von Schreibvorgängen. Ein Prozess ermöglicht das Zwischenspeichern von Schreibvorgängen für einen bestimmten E/A-Vorgang, indem das flag FILE_FLAG_WRITE_THROUGH an den Aufruf von CreateFile übergeben wird. Wenn die Zwischenspeicherung durch Schreibzugriff aktiviert ist, werden die Daten weiterhin in den Cache geschrieben, aber der Cache-Manager schreibt die Daten sofort auf den Datenträger, anstatt eine Verzögerung mithilfe des verzögerten Writers zu erhalten. Ein Prozess kann auch eine Leerung einer Datei erzwingen, die er geöffnet hat, indem er die FlushFileBuffers-Funktion aufruft .

Dateisystemmetadaten werden immer zwischengespeichert. Daher muss die Datei zum Speichern von Metadatenänderungen auf dem Datenträger entweder geleert oder mit FILE_FLAG_WRITE_THROUGH geöffnet werden.