物理内存和虚拟内存的关系

进程容器中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
//预定:在我自己的虚拟内存空间中先站住位置,但是并不分配物理内存
//调拨:真正的分配了物理页,物理内存