檔案快取

根據預設,Windows 會快取從磁碟讀取與寫入到磁碟的檔案資料。 這表示讀取作業會從系統記憶體中稱為系統檔案快取的區域讀取檔案資料,而不是從實體磁片讀取。 同樣地,寫入作業會將檔案資料寫入到系統檔案快取而非寫入到磁碟,而且此類型的快取稱為回寫式快取。 快取是以個別檔案物件為單位來管理。

快取發生在 快取管理員的方向下,這會在 Windows 執行時持續運作。 系統檔案快取中的檔案資料會以作業系統所決定的間隔寫入磁片,而先前由該檔案資料使用的記憶體會釋出,這稱為 清除 快取。 延遲將資料寫入檔案並保留于快取中的原則,直到快取排清稱為延遲寫入為止,而且快取管理員會以確定的時間間隔觸發它。 檔案資料區塊排清的時間部分是以資料儲存在快取中的時間長度以及該資料自上次在讀取作業中存取之後的時間長度為基礎。 這可確保頻繁讀取的檔案資料將可儘可能地維持在系統檔案快取中供存取。

下圖說明此檔案資料快取程式。

檔案資料快取程式

如上圖中的實心箭號所描述,當快取管理員在檔案讀取作業期間,資料 256 KB 區域會讀取到系統位址空間中的 256 KB 快取「位置」。 使用者模式處理序接著會將此位置資料複製到其自己的位址空間。 當處理序完成其資料存取時,它會將修改的資料寫回系統快取中的相同位置,如處理序位址空間與系統快取之間的點箭號所示。 當快取管理員判斷資料不再需要特定時間時,它會將資料寫回磁片上的檔案,如系統快取與磁片之間的虛線箭號所示。

檔案資料快取所提供的 I/O 效能改善量取決於要讀取或寫入的檔案資料區塊大小。 當大量檔案資料被讀取和寫入時,可能需要磁片讀取和寫入,才能完成 I/O 作業。 當這類 I/O 作業發生時,I/O 效能會逐漸受損。

在這些情況下,可以關閉快取。 這會在開啟檔案時,傳遞FILE_FLAG_NO_BUFFERING作為CreateFiledwFlagsAndAttributes參數的值來完成。 停用快取時,所有讀取和寫入作業都會直接存取實體磁片。 不過,檔案中繼資料仍可快取。 若要將中繼資料排清到磁片,請使用 FlushFileBuffers 函式。

排清發生的頻率是平衡系統效能與系統可靠性的重要考慮。 如果系統太常排清快取,大量寫入作業排清會導致系統效能大幅降低。 如果系統未經常排清,則可能是快取會耗用系統記憶體,或發生突然的系統失敗 (,例如電腦電源遺失,) 排清之前就會發生。 在後者的實例中,快取的資料將會遺失。

為了確保發生正確的排清量,快取管理員會每秒繁衍一個稱為延遲寫入器的進程。 延遲寫入器進程會排入最近未排清到磁片之頁面的一八分之一。 它會持續重新評估要排清的資料量,以獲得最佳的系統效能,而且如果需要寫入更多資料,則會將更多資料排入佇列。 延遲寫入器不會排清暫存檔,因為假設是應用程式或系統將會刪除它們。

某些應用程式,例如病毒檢查軟體,要求其寫入作業立即排清到磁片;Windows 透過寫入快取提供這項功能。 進程藉由將 FILE_FLAG_WRITE_THROUGH 旗標傳遞至對 CreateFile的呼叫,來啟用特定 I/O 作業的寫入快取。 啟用寫入快取後,資料仍會寫入快取,但快取管理員會立即將資料寫入磁片,而不是使用延遲寫入器產生延遲。 進程也可以藉由呼叫 FlushFileBuffers 函式來強制清除它開啟的檔案。

檔案系統中繼資料一律會快取。 因此,若要儲存磁片的任何中繼資料變更,檔案必須排清或以 FILE_FLAG_WRITE_THROUGH開啟。