win32 低記憶體通知事件

lindexi發表於2024-06-23

在 Windows 機制裡面,將在實體記憶體、換頁池、非換頁池以及提交用量很多或很少時,向使用者模式程序和核心模式驅動程式提供通知。本文將重點放在使用者模式的程序上

本文屬於讀 《深入解析 Windows 作業系統》 讀書筆記

應用程式可以呼叫 CreateMemoryResourceNotification function 函式指定自己期望接收到記憶體多或記憶體少的通知

如在 dotnet 的 CLR 層的 finalizerthread 部分,就使用了以下程式碼進行獲取通知

MHandles[kLowMemoryNotification] =
        CreateMemoryResourceNotification(LowMemoryResourceNotification);

以上的引數的 LowMemoryResourceNotification 表示的是可用實體記憶體不足。對應的還有 HighMemoryResourceNotification 表示可用實體記憶體很高

配合 QueryMemoryResourceNotification function 可以進行查詢當前的記憶體狀態

使用例子程式碼請參閱 https://stackoverflow.com/a/54529790 提供的例子

另一個方面則是透過以下記憶體管理器的通知事件獲取通知

  • HighCommitCondition: 如果提交用量接近最大提交限制,即記憶體用量非常大,實體記憶體或頁面檔案中可用空間極為有限,且系統無法增加頁面檔案的大小,將設定此事件。換句話就是記憶體用多了,能釋放的話趕緊釋放

  • LowCommitCondition: 當提交用量相對於當前提交限制較低,即記憶體用量低,且實體記憶體或頁面檔案存在大量可用空間時,將設定該事件。換句話說就是現在豪氣,隨便用

  • HighMemoryCondition: 當空閒實體記憶體數量超過預設值時將設定該事件

  • LowMemoryCondition: 當空閒實體記憶體數量低於預設值時將設定該事件

如果要檢視記憶體資源通知事件,可以執行微軟極品工具箱的 WinObj 工具,檢視 KernelObjects 資料夾裡面的大記憶體和小記憶體事件,如下圖所示

雙擊即可看到對應的物件產生了多少控制代碼和引用

如果想要了解系統中有哪些程序請求了記憶體資源通知,可以使用 Process Explorer 的 Find 選單進行搜尋控制代碼表,如下圖

更詳細內容請大家自行閱讀書籍

參考文件:

  • CreateMemoryResourceNotification function (memoryapi.h) - Win32 apps Microsoft Learn
  • QueryMemoryResourceNotification function (memoryapi.h) - Win32 apps Microsoft Learn

相關文章