物理內(nèi)存和虛擬內(nèi)存的關(guān)系

物理內(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)存
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容