Windows 任務管理器中的幾個內存概念


我們使用的大部分 PC 是基於 Intel 微處理器的 x86 和 x64 架構計算機. 

因此, 我們面對的 windows 避免不了和 Intel 架構有些設計上的契合. 比如接下來要說到的內存管理. 為簡單起見, 我們只討論 x86 體系架構的內存管理. 不考慮換頁文件影響.

 

進程的內存


 圖 1 (本圖摘自 ref 2)

對於系統中的每一個進程而言, 都有 4GB 的 "內存空間". 也就是每個進程都認為自己有 4GB 的內存可以使用.

系統將每個進程的 4GB 地址空間, 從邏輯上划分為兩大部分:

  a) 藍色的是用戶空間, 此空間是被用戶程序所使用的. 比如我在代碼中寫 "分配 100MB 內存", 其實占用的就是這一部分.

  b) 紅色的是內核空間, 此空間是被用作操作系統執行必要的線程切換以及從用戶態函數進入內核態執行功能所保留的內存地址. 應用程序無法操作此區域.

 

Intel x86 體系內存管理


Intel 規定, 一個在計算機內部, 可以使用 "分頁機制" 對硬件內存進行 "虛擬化". 其核心技術如下圖:

             圖 2 (本圖修改自 ref 1)

首先, 在程序中的一個地址 0x1234, 5678 被計算機的頁部件(硬件)經過 1,2,3 步, 從線性地址(程序中的地址) 轉變為真正機器上的物理地址(即實際內存的硬件地址). 每個線性地址都被分成 "頁目錄索引(PDE, 10-bit)", "頁表索引(PTE, 10-bit)", "頁內偏移(offset, 12-bit)" 三部分.

  1) 在頁目錄中根據 PDE 找到頁表的位置, 即通過 0x48 找到 0xa000, 0000.

  2) 根據頁表中的 PTE 找到頁地址, 即通過 0x345 找到 0x4000, 0000.

  3) 根據偏移, 在頁中找到我們要的具體地址, 即已知頁位於 0x4000, 0000, 我們需要存取其 0x678 偏移處的數據, 則我們所需要操作的真是物理地址就是 0x4000, 0678.

 

基於 x86 的 Windows 內存管理


 

                                                            圖 3 

首先澄清兩個概念:

  1. 一個進程中的內存有三種分類, 空閑, 保留, 提交. 具體的含義可以在 圖 3 中找到說明. 這三種類型的內存在某一時刻可能位於內存中, 也可能位於交換文件中.

  2. 工作集定義: The working set of a process is the set of pages in the virtual address space of the process that are currently resident in physical memory. 即: 實際在物理內存中的大小.

結合實際系統, 以我家安裝的 win8.1 為例, 打開任務管理器, 可見如下:

                         圖 4

工作集(內存): 可以這么理解, 此值就是該進程所占用的總物理內存. 但是這個值是由兩部分組成, 即 '專用工作集' + '共享工作集'.

內存(專用工作集): 這對於一個進程是最重要的, 它代表了一個進程獨占用了多少內存. 

內存(共享工作集): 這是該進程和別的進程共享的內存量. 通常, 這是加載一個 dll 所占用的內存. 

提交大小: 屬於 Committed 那一類. 但是不一定在物理內存中, 有些可能位於交換文件中. 如果有一個程序, 原本占 500MB 內存, 但是絕大多數內存都不使用, 則可以通過 `EmptyWorkingSet` 向操作系統發送請求, 將此進程的不常用的內容從物理內存中換出到換頁文件中保存, 如下圖:

                  圖 5

 

寫在最后


0. 工作集, 即在物理內存中的數據的集合.

1. 工作集 = 專用 + 共享

2. 將所有的 "工作集" 相加后的值會大於任務管理器中內存占用的百分比, 因為百分比對共享內存進行排重了.

3. "提交大小" 和 "工作集" 是兩個層面的概念, 大部分活躍進程的 "工作集" 會大於 "提交大小", 而大部分非活躍的進程 "工作集" 會小於 "提交大小", 但是兩者沒有絕對關系.

4. 虛擬內存: 就是換頁文件.

 

references:

1. http://www.mouseos.com/arch/paging.html

2. Pushing the Limits of Windows: Virtual Memory

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM