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

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

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

image
內(nèi)存頁(yè)

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