物理内存和虚拟内存的关系
进程容器中4GB空间的内容分布
在所谓的4GB空间内,系统内核占据了高2GB的空间,普通进程看不见摸不着,而且高2GB的空间是全局共享。全局就那么一份,各个进程间共享
观察进程内存分布,我们发现进程中真正使用的内存远远不到2gb,而且地址不是连续的。说明操作系统并不是一次性吧内存都给予进程
其实操作系统非常鸡贼,它只分配进程当前需要使用的内存,不需要的一律不分配
在进程中有一台地址规则,和物理内存有映射关系
内存页
私有内存的分配 (相关win32 api)
//申请内存(预定区域/调拨物理页)
LPVOID VirtualAlloc
(
LPVOID lpAddress, // 申请虚拟内存的地址 一般情况下填NULL 由系统指定地址
SIZE_T dwSize, // 申请内存块的大小 内存分配按照内存页`0x1000` (64k)为最小单位,所以这里最好填写 `0x1000`的整数倍(64k整数倍)
DWORD flAllocationType, // 申请内存的状态
DWORD flProtect // 申请内存的保护属性
);
//释放内存(释放区域/撤销调拨)
BOOL VirtualFree
(
LPVOID lpAddress, // 释放的内存地址
SIZE_T dwSize, // 释放的内存大小
DWORD dwFreeType // 释放内存的方式
);
//内存块的类型
闲置 FREE
私有 PRIVATE
映象 IMAGE
映射 MAPPED
//内存块的状态
预定 RESERVE
调拨 COMMIT
空闲 FREE
//预定:在我自己的虚拟内存空间中先站住位置,但是并不分配物理内存
//调拨:真正的分配了物理页,物理内存