Windows 任务管理器中的几个内存概念
我們使用的大部分 PC 是基于 Intel?微處理器的 x86 和 x64 架構(gòu)計(jì)算機(jī).?
因此, 我們面對(duì)的 windows 避免不了和 Intel 架構(gòu)有些設(shè)計(jì)上的契合. 比如接下來要說到的內(nèi)存管理.?為簡(jiǎn)單起見, 我們只討論 x86 體系架構(gòu)的內(nèi)存管理. 不考慮換頁(yè)文件影響.
?
進(jìn)程的內(nèi)存
?圖 1?(本圖摘自 ref 2)
對(duì)于系統(tǒng)中的每一個(gè)進(jìn)程而言, 都有 4GB 的 "內(nèi)存空間". 也就是每個(gè)進(jìn)程都認(rèn)為自己有 4GB 的內(nèi)存可以使用.
系統(tǒng)將每個(gè)進(jìn)程的 4GB 地址空間, 從邏輯上劃分為兩大部分:
a)?藍(lán)色的是用戶空間, 此空間是被用戶程序所使用的. 比如我在代碼中寫 "分配 100MB 內(nèi)存", 其實(shí)占用的就是這一部分.
b) 紅色的是內(nèi)核空間, 此空間是被用作操作系統(tǒng)執(zhí)行必要的線程切換以及從用戶態(tài)函數(shù)進(jìn)入內(nèi)核態(tài)執(zhí)行功能所保留的內(nèi)存地址. 應(yīng)用程序無法操作此區(qū)域.
?
Intel x86 體系內(nèi)存管理
Intel 規(guī)定, 一個(gè)在計(jì)算機(jī)內(nèi)部, 可以使用 "分頁(yè)機(jī)制" 對(duì)硬件內(nèi)存進(jìn)行 "虛擬化". 其核心技術(shù)如下圖:
? ? ? ? ? ? ?圖 2?(本圖修改自 ref 1)
首先, 在程序中的一個(gè)地址 0x1234, 5678 被計(jì)算機(jī)的頁(yè)部件(硬件)經(jīng)過 1,2,3 步, 從線性地址(程序中的地址) 轉(zhuǎn)變?yōu)檎嬲龣C(jī)器上的物理地址(即實(shí)際內(nèi)存的硬件地址). 每個(gè)線性地址都被分成 "頁(yè)目錄索引(PDE, 10-bit)", "頁(yè)表索引(PTE, 10-bit)", "頁(yè)內(nèi)偏移(offset, 12-bit)" 三部分.
1) 在頁(yè)目錄中根據(jù) PDE 找到頁(yè)表的位置, 即通過 0x48 找到 0xa000, 0000.
2) 根據(jù)頁(yè)表中的 PTE 找到頁(yè)地址, 即通過 0x345 找到 0x4000, 0000.
3) 根據(jù)偏移, 在頁(yè)中找到我們要的具體地址, 即已知頁(yè)位于 0x4000, 0000, 我們需要存取其 0x678 偏移處的數(shù)據(jù), 則我們所需要操作的真是物理地址就是 0x4000, 0678.
?
基于 x86 的 Windows 內(nèi)存管理
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖 3?
首先澄清兩個(gè)概念:
1.?一個(gè)進(jìn)程中的內(nèi)存有三種分類,?空閑, 保留, 提交. 具體的含義可以在?圖 3?中找到說明. 這三種類型的內(nèi)存在某一時(shí)刻可能位于內(nèi)存中, 也可能位于交換文件中.
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. 即: 實(shí)際在物理內(nèi)存中的大小.
結(jié)合實(shí)際系統(tǒng), 以我家安裝的?win8.1 為例, 打開任務(wù)管理器, 可見如下:
? ? ? ? ? ? ? ??? ? ? ? ?圖 4
工作集(內(nèi)存): 可以這么理解, 此值就是該進(jìn)程所占用的總物理內(nèi)存. 但是這個(gè)值是由兩部分組成, 即?'專用工作集'?+?'共享工作集'.
內(nèi)存(專用工作集): 這對(duì)于一個(gè)進(jìn)程是最重要的, 它代表了一個(gè)進(jìn)程獨(dú)占用了多少內(nèi)存.?
內(nèi)存(共享工作集): 這是該進(jìn)程和別的進(jìn)程共享的內(nèi)存量. 通常, 這是加載一個(gè) dll 所占用的內(nèi)存.?
提交大小: 屬于 Committed 那一類. 但是不一定在物理內(nèi)存中, 有些可能位于交換文件中. 如果有一個(gè)程序, 原本占 500MB 內(nèi)存, 但是絕大多數(shù)內(nèi)存都不使用, 則可以通過 `EmptyWorkingSet` 向操作系統(tǒng)發(fā)送請(qǐng)求, 將此進(jìn)程的不常用的內(nèi)容從物理內(nèi)存中換出到換頁(yè)文件中保存, 如下圖:
? ? ? ??? ? ? ? ? 圖 5
?
寫在最后
0. 工作集, 即在物理內(nèi)存中的數(shù)據(jù)的集合.
1. 工作集 = 專用 + 共享
2. 將所有的 "工作集" 相加后的值會(huì)大于任務(wù)管理器中內(nèi)存占用的百分比, 因?yàn)榘俜直葘?duì)共享內(nèi)存進(jìn)行排重了.
3. "提交大小" 和 "工作集" 是兩個(gè)層面的概念, 大部分活躍進(jìn)程的 "工作集" 會(huì)大于 "提交大小", 而大部分非活躍的進(jìn)程 "工作集" 會(huì)小于 "提交大小", 但是兩者沒有絕對(duì)關(guān)系.
4. 虛擬內(nèi)存: 就是換頁(yè)文件.
?
references:
1.?http://www.mouseos.com/arch/paging.html
2.?Pushing the Limits of Windows: Virtual Memory
轉(zhuǎn)載于:https://www.cnblogs.com/xumaojun/p/8521615.html
總結(jié)
以上是生活随笔為你收集整理的Windows 任务管理器中的几个内存概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记一次使用 removeEventLis
- 下一篇: Ubuntu GNOME单击任务栏图标最