物理內(nèi)存和虛擬內(nèi)存的關(guān)系
進程容器中4GB空間的內(nèi)容分布

image
在所謂的4GB空間內(nèi),系統(tǒng)內(nèi)核占據(jù)了高2GB的空間,普通進程看不見摸不著,而且高2GB的空間是全局共享。全局就那么一份,各個進程間共享
觀察進程內(nèi)存分布,我們發(fā)現(xiàn)進程中真正使用的內(nèi)存遠遠不到2gb,而且地址不是連續(xù)的。說明操作系統(tǒng)并不是一次性吧內(nèi)存都給予進程
其實操作系統(tǒng)非常雞賊,它只分配進程當前需要使用的內(nèi)存,不需要的一律不分配

image
在進程中有一臺地址規(guī)則,和物理內(nèi)存有映射關(guān)系

image
內(nèi)存頁

image
私有內(nèi)存的分配 (相關(guān)win32 api)
//申請內(nèi)存(預定區(qū)域/調(diào)撥物理頁)
LPVOID VirtualAlloc
(
LPVOID lpAddress, // 申請?zhí)摂M內(nèi)存的地址 一般情況下填NULL 由系統(tǒng)指定地址
SIZE_T dwSize, // 申請內(nèi)存塊的大小 內(nèi)存分配按照內(nèi)存頁`0x1000` (64k)為最小單位,所以這里最好填寫 `0x1000`的整數(shù)倍(64k整數(shù)倍)
DWORD flAllocationType, // 申請內(nèi)存的狀態(tài)
DWORD flProtect // 申請內(nèi)存的保護屬性
);
//釋放內(nèi)存(釋放區(qū)域/撤銷調(diào)撥)
BOOL VirtualFree
(
LPVOID lpAddress, // 釋放的內(nèi)存地址
SIZE_T dwSize, // 釋放的內(nèi)存大小
DWORD dwFreeType // 釋放內(nèi)存的方式
);
//內(nèi)存塊的類型
閑置 FREE
私有 PRIVATE
映象 IMAGE
映射 MAPPED
//內(nèi)存塊的狀態(tài)
預定 RESERVE
調(diào)撥 COMMIT
空閑 FREE
//預定:在我自己的虛擬內(nèi)存空間中先站住位置,但是并不分配物理內(nèi)存
//調(diào)撥:真正的分配了物理頁,物理內(nèi)存