windows内存结构(2)

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

内存按4KB分页,每4KB分一页,每个内存页都有自己的属性
这里写图片描述
这里大部分都很明白,只有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,这时这个地址就可以使用了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值