windows内存结构(2)

为了解决内存使用效率低的问题,windows采用了内存分页
每个CPU都使用64KB这个分配粒度,分配粒度是什么呢,举个例子,我申请了0x00010000处的内存空间,我只想申请1KB,但是系统会为你保留64KB
下面再说页面大小,一般x86的页面大小为4KB,alphaCPU的页面大小为8KB,不管申请多大内存,但是实际申请内存大小一定是页面大小的倍数
如果申请1KB,则在x86平台上申请的实际大小为4KB,alpha平台上则为8KB

内存按4KB分页,每4KB分一页,每个内存页都有自己的属性
windows内存结构(2)
这里大部分都很明白,只有PAGE_WRITECOPY,PAGE_EXECUTE_WRITECOPY属性需要说明一下
PAGE_WRITECOPY:写入时复制,举个例子,打开1个同样的txt文件10次,由于所有的实例共享代码和数据页面,如果修改了一个实例,会造成其他的实例的显示页面发生变化吗,显然不会,这就是这个页面属性在发生作用,
在修改显示页面时,发生了一下事情
1.系统会寻找一个空闲的RAM页面(如果找不到,就需要释放一个非空闲的页面,如果这个页面没有被作废,直接释放,否则,需要把这个页面写到硬盘上保存起来)
2.系统会把原始的页面的内容复制到空闲的ram页面,在新的页面上对内容进行修改
3.系统更新进程的页面表,使得被访问的虚拟地址被转换成新的RAM页面
如果要使用虚拟内存,则不得不提到VirtualAlloc函数
LPVOID VirtualAlloc{
LPVOID lpAddress, // 要分配的内存区域的地址
DWORD dwSize, // 分配的大小
DWORD flAllocationType, // 分配的类型
DWORD flProtect // 该内存的初始保护属性
};
flAllocationType为MEM_RESERVE时,保留指定地址空间,不分配物理内存,这样可以阻止其他内存分配函数malloc和LocalAlloc等再使用已保留的内存范围,直到它被被释放
flAllocationType为MEM_COMMIT是,把地址提交到物理存储器,此时提交的内存初始化为0,这时这个地址就可以使用了