跳到內容

Windows 的 Memory Manager 與系統快取:分頁、page combining 與 lazy write

本頁內容

本系列檢查了七個分頁、相同頁面合併、核心堆積與檔案快取的參數。在 Windows 11 25H2 中找到了每一個參數的讀取程式碼。實際效益取決於參數與運作條件。

DisablePageCombining 會停用背景頁面合併:記憶體管理員不再執行這項工作,但 RAM 用量可能增加。DisablePagingExecutive 會將可分頁的驅動程式程式碼保留在實體記憶體中;效益通常很小。其餘參數僅適用於特定的核心或儲存裝置任務,或者在 25H2 中已有合適的預設值。

針對每個值檢查了:

  1. 登錄檔中的確切路徑與類型;
  2. Windows 11 25H2 程式碼所設定的預設值;
  3. 同一子系統的相關值;
  4. 系統讀取程式碼及其執行時機;
  5. 範圍限制、值轉換與計量單位;
  6. 直接效果與適用範圍。

除了讀取程式碼之外,我們還檢查了參數的套用位置、變更它的後果,以及在哪些情境下可能有用。僅僅存在參數並不足以構成建議。

  • Windows 11 25H2 x64,build 26200.9168。
  • 核心參數已與 ntoskrnl.exe 的主要設定表,以及其在 Memory Manager 與 Cache Manager 中的套用程式碼進行比對。
  • 執行期間的存取透過系統登錄檔追蹤進行檢查。階段 0 與階段 1 開始時的讀取可能不會出現在一般開機追蹤中:追蹤驅動程式較晚才開始記錄。
  • 對於使用者行程,另外檢查了在 ntdll.dll 中讀取該值的情況。對於 HeapDeCommitFreeBlockThreshold,在 25H2 中找到了核心中的讀取,但使用者行程的堆積並不使用此參數。
  • 系統元件的靜態分析不能取代在實體 PC、其他 build 或其他儲存裝置類型上的重複驗證。
Registry path Value Type Default Windows 11 25H2 應用
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management DisablePagingExecutive REG_DWORD 0 系統驅動程式可分頁程式碼的分頁
同一路徑 DisablePageCombining REG_DWORD 0 相同實體頁面的背景合併
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager HeapDeCommitFreeBlockThreshold REG_DWORD 0x1000 (4 KB) 用於 kernel heap kernel-mode heap 空閒區塊的 decommit 閾值
同一路徑 ModifiedWriteMaximum REG_DWORD 1 單位 = 1 MB clamp 後 modified page writer 的上限
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management EnableAsyncLazywrite REG_DWORD 2 Cache Manager 的非同步模式
同一路徑 CacheUnmapBehindLengthInMB REG_DWORD 8 MB 循序讀取後方 unmap 的視窗
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Kernel SplitLargeCaches REG_DWORD 0 processor groups 之間 cache topology 的呈現

在 0 時,Windows 記憶體管理員可以將允許的系統程式碼與驅動程式區段分頁到備份存放區。在 1 時,可分頁的系統驅動程式程式碼會保留在實體記憶體中。

讀取程式碼是在核心初始化的早期階段於 ntoskrnl.exe 中找到的。該值用於 MmResetDriverPaging、MmPageEntireDriver 以及載入系統映像時。它會在一般使用者登錄檔追蹤開始之前套用。若要套用新狀態,需要重新啟動。

  • 0:Windows 的標準狀態,允許分頁。
  • 1:可分頁的系統驅動程式區段會保留在 RAM 中。
  • 此設定會消耗 RAM,以減少後續將系統程式碼載入回記憶體的需求;磁碟本身並不會因此變快。

此設定可防止這些驅動程式區段後續被分頁出去與載入回來。它不會停用任何獨立的常駐 CPU 檢查執行緒。在 RAM 充足的現代系統上,效益通常非常小:即使沒有此設定,程式碼也可能長時間留在記憶體中。當 RAM 不足時,強制保留它會加劇記憶體短缺。

參數的讀取與系統效果的方向已由 ntoskrnl.exe 的程式碼證實。

在 0 時,記憶體管理員會啟動背景任務,尋找並合併相同的實體頁面。在 1 時,此任務不會執行合併。

在 ntoskrnl.exe 中找到了帶有集區標籤 MmCb 的背景頁面合併程式碼,證實了該機制的存在。

  • 0:允許頁面合併,Windows 的標準狀態。
  • 1:合併已停用。
  • 停用可減少記憶體管理員的背景工作,但可能增加 RAM 用量。

如果頁面合併造成明顯的背景負載,且系統有閒置 RAM,停用是有用的。通常此任務活動量很低,因此效果非常小。當記憶體有限時,合併所節省的 RAM 比節省的處理器時間更有價值。

讀取程式碼與背景任務已在 ntoskrnl.exe 中證實。Microsoft 描述了頁面合併以及處理器工作與節省 RAM 之間的取捨。

此值設定核心堆積空閒區塊的已配置記憶體釋放(decommit)閾值。閾值越大,對大型空閒區塊的這類操作就越少發生。

在 Windows 11 25H2 中,讀取程式碼位於 ntoskrnl.exe,而參數的套用與核心函式 RtlCreateHeap 有關。在 ntdll.dll 中未找到一般行程堆積對應的讀取程式碼。

  • 核心堆積程式碼中的預設值:0x1000 (4 KB)。
  • 0x40000 (256 KB) 是核心堆積可接受的閾值。
  • Microsoft 的歷史文件描述了舊版 Windows 中同名的 user-mode 情境,因此不能自動將其套用到 Windows 11 25H2。

對一般應用程式幾乎沒有效益:它們的堆積不使用此值。此參數只能改變核心堆積中記憶體釋放的頻率。若沒有針對它的實測問題,預期效果非常小。

核心模式中的讀取已在 ntoskrnl.exe 中證實。對 25H2 中使用者行程的效果未經證實。

此參數設定已修改頁面寫入機制(modified page writer)的上限。程式碼中使用以 256 頁為單位的單位,即一個單位等於 1 MB。

Windows 11 25H2 中的正規化:

  • 0 會轉換為 1 個單位,即 1 MB;
  • 大於 0x40 的值會被限制為 0x40;
  • 最大有效上限為 64 MB,即 16 384 頁。

此機制大約在達到指定限制的四分之一時開始主動寫入。提高限制會改變寫入啟動的時機與累積的已修改頁面數量。磁碟本身的速度不會因此提升。

限制越大,在主動寫入開始前累積的已修改頁面就越多。寫入可能較少啟動,但尚未儲存的資料量與下一次寫入批次的大小會增加。如果沒有具體的寫入問題,請保留預設值。有效上限限制為 64 MB。

讀取程式碼、計量單位與範圍限制已在 ntoskrnl.exe 中證實。Microsoft 舊文件中同名的 BitLocker 參數屬於另一個子系統;這些文件在此不作為來源使用。

EnableAsyncLazywrite 控制 Cache Manager 的非同步延遲寫入。在 25H2 的程式碼中設定了預設值 2:此模式已啟用。

同一子系統的相關值:

Value Default 25H2 角色
EnableAsyncLazywrite 2 一般 async lazy-write mode
EnableAsyncLazywriteMulti 2 相鄰的 multi-volume 模式
EnablePerVolumeLazyWriter 2 Per-volume lazy writer

0 會停用非同步延遲寫入。1 需要每個磁碟區各自有延遲寫入處理常式的模式。2 則啟用非同步模式而無此需求。Cache Manager 在處理磁碟區設定時會重新讀取這些值。

明確寫入 2 只是重現 Windows 11 25H2 的標準設定,並不會額外改善任何東西。此設定主要適用於診斷:值 0 可讓您停用預設運作的機制。

讀取已在系統追蹤中觀察到,並在 ntoskrnl.exe 中證實。預設值 2 已由程式碼以及一份根據逆向分析結果編寫的獨立登錄檔參數說明所證實。

此參數設定一個以百萬位元組為單位的距離,超過此距離後,Cache Manager 會釋放落後於循序讀取目前位置之後的已快取檢視。

參數的讀取與套用程式碼位於 ntoskrnl.exe,並在對應與讀取快取時被呼叫。此參數與大型檔案的循序讀取有關;它不會停用整個檔案快取。

  • 0 或大於 128 的值會被程式碼取代為 8。
  • 工作範圍:1..128 MB。
  • 程式碼預設值:8 MB。
  • Registry value 的單位正是 MB,而不是位元組。

此參數僅對大型檔案循序讀取的專門任務有意義。視窗越大,目前位置之後的快取對應保留越久;視窗越小,則越早釋放。一般工作適合標準值 8 MB;手動調整的效益通常很小。

讀取、套用與範圍限制的程式碼已在 ntoskrnl.exe 中證實。未找到 Microsoft 針對此內部參數的現代公開文件。

在 0 時,快取拓撲描述 API 會為涵蓋多個處理器群組的對應結構傳回單一記錄。在 1 時,記錄會依處理器群組分開。

讀取程式碼位於 ntoskrnl.exe。此參數用於處理 KeQueryLogicalProcessorRelationship 中的 RelationCache 關聯。

只有系統 API 傳回的拓撲描述會改變。已配置的實體記憶體區塊不會被分開,連續區塊不足的可能性本身也不會降低。

  • 0:預設值。
  • 1:依處理器群組分開拓撲記錄。
  • 實際效果主要可能出現在具有多個處理器群組的系統上,通常是超過 64 個邏輯處理器時。
  • 在一般單一群組系統上沒有作用。

此參數僅對在多處理器群組機器上查詢快取拓撲的程式有用。它不會改變快取的運作或記憶體配置。對一般桌上型電腦沒有效益。

讀取與套用的程式碼已在 ntoskrnl.exe 中證實。值與用途已與 KiSplitLargeCaches 的公開逆向分析說明進行核對。

參數 實際評估
DisablePagingExecutive 通常效益非常小,只是將更多程式碼保留在 RAM 中
DisablePageCombining 在已證實有背景頁面合併負載且 RAM 充裕時有用
HeapDeCommitFreeBlockThreshold 僅在核心中生效;對一般應用程式沒有實際效益
ModifiedWriteMaximum 改變已修改頁面的寫入條件;若無已發現的問題,請保留標準值
EnableAsyncLazywrite 標準值 2 已啟用該機制;再次寫入不會改善任何東西
CacheUnmapBehindLengthInMB 循序讀取設定;標準值 8 MB 適合一般工作
SplitLargeCaches 改變多個處理器群組的拓撲描述;在一般系統上沒有作用

上述路徑、類型、預設值、參數的讀取程式碼與時機,以及範圍限制均已證實。結果適用於 Windows 11 25H2 build 26200.9168。在不同的 Windows 更新、RAM 容量、儲存裝置類型或 CPU 拓撲下,行為可能有所不同。

如何重現觀察中的動態部分——請參閱如何自行檢查。

若要還原,請將參數恢復為標準值,或刪除選用記錄。部分值會在下次 Windows 開機時套用。

本研究及其使用的工具屬於 BoosterX 開發者所有,因此開發者對結果有直接利益關係。方法與適用範圍已於本文說明;結論可透過公開資料及下列公開來源進行驗證。

關於程式碼的陳述已透過 Windows 11 25H2 系統元件的靜態分析驗證。反編譯程式碼、位移、原始追蹤與內部資料不予公開。

公開來源已查核:2026-09-02。

  • 2026-09-20: 新增關於利益衝突的免責聲明,以及方法中自行檢查動態觀察的連結。
  • 2026-09-02: 首次發佈;已證實路徑、defaults、clamps 與參數的讀取程式碼,並新增實際效益的適用範圍。