Windows 為多任務作業系統,實體記憶體屬稀缺資源。為防止單一進程耗盡記憶體,引入「工作集」機制追蹤各進程與系統的實體記憶體使用情況。主要分為:進程工作集、系統工作集、會話工作集(終端服務引入)。本文聚焦進程工作集內部組織與管理。
EPROCESS 描述進程,其子結構 MMSUPPORT 包含進程與記憶體子系統關鍵資訊。以下為 Windows XP Build 2600 SP0 版本定義:
typedef struct _MMSUPPORT {
LARGE_INTEGER LastTrimTime;
MMSUPPORT_FLAGS Flags;
ULONG PageFaultCount;
ULONG PeakWorkingSetSize;
ULONG WorkingSetSize;
ULONG MinimumWorkingSetSize;
ULONG MaximumWorkingSetSize;
PMMWSL VmWorkingSetList;
LIST_ENTRY WorkingSetExpansionLinks;
ULONG Claim;
ULONG NextEstimationSlot;
ULONG NextAgingSlot;
ULONG EstimatedAvailable;
ULONG GrowthSinceLastEstimate;
} MMSUPPORT, *PMMSUPPORT;
PeakWorkingSetSize:工作集峰值WorkingSetSize:目前工作集大小MinimumWorkingSetSize / MaximumWorkingSetSize:允許範圍Get/SetProcessWorkingSetSize(Ex) 可查詢/設定進程建立時工作集為空,MiInitializeWorkingSetList 初始化 MMSUPPORT.VmWorkingSetList(指向 MMWSL 結構)。關鍵欄位:
+0x000 Quota
+0x004 FirstFree
+0x008 FirstDynamic
+0x00c LastEntry
+0x010 NextSlot
+0x014 Wsle (Pointer to _MMWSLE array)
+0x018 LastInitializedWsle
+0x01c NonDirectCount
+0x020 HashTable (Pointer to _MMWSLE_HASH)
+0x024 HashTableSize
... (其他頁表管理欄位)
為效率考量,MMWSL 映射至固定核心虛擬位址(由 MmWorkingSetList 變數指定,XP 中為 0xc0503000)。核心區域雖為所有進程共享,但此位址對每個進程映射不同內容,類似頁目錄/頁表機制。
工作集頁面皆駐留實體記憶體(未分頁至 pagefile.sys),存取不會觸發 Page Fault。系統使用哈希表(HashTable)組織頁面,利用其快速檢索特性應對頻繁存取需求。VirtualLock 可強制將頁面置入工作集。
kd> !wsle 7
Working Set @ c0503000
FirstFree: 469 FirstDynamic: 7
LastEntry: 46c NextSlot: 4 LastInitialized: 658
NonDirect: 145 HashTable: c06f4000 HashTableSize: 400
Virtual Address Age Locked ReferenceCount
c0300203 0 1 1
c0301203 0 1 1
c0502203 0 1 1
... (更多條目)
此指令可傾印指定進程(參數 7 為進程索引)的工作集詳細內容,包含虛擬位址、老化計數、鎖定狀態與參考計數,是記憶體除錯分析的利器。