再看研究虚拟内存,胡乱记点

底层系统知识对程序员很重要,可能在coding时未必直接用到,但是在调试performance问题,或其它棘手问题时,系统知识的功底会帮到很多忙。


对虚拟内存的认识是必须的。以前这方面就了解比较清楚,所以调试access violation,还是runtime error,还是内存泄露问题的处理,算游刃有余。在此基础上,这些天又继续看看了,还是收获颇深。下面的内容算是对虚拟内存相关内容的总结,文章无组织,想到哪写到哪:


1。进程空间是4G(32b),但是进程用户空间是2G。0-2G是进程的用户私有空间,2-4G是系统空间。

可以理解为所有进程空间的2-4G视图是一样的,都是同一个系统空间。

2。程序执行时,访问的是虚拟地址,需要有虚拟地址向物理地址(RAM)的翻译、转换。这一过程需要用到页表。

详细过程:如果该虚拟地址没有被reserve或者reserve了但是没有commit,会抛出access violation,这一过程在读page table之前;之后,通过虚拟地址,定位到page table entry,pte里面存放的是虚拟地址到物理地址的映射(即存放着物理地址),同时还存放页的属性内容,比如是否在内存中,是否已经换出到pagefile里,该物理的读写权限,是否是系统空间才能读取的页。

3。4G虚拟地址空间是线性连续的,将这线性的空间分割成一小块一小块的,每一小块就是一个页。32b上一页是4K。页是内存管理的最小单位。每个进程都有自己的页表,页表实现虚拟地址到物理地址的翻译。

4g虚拟空间是线性连续的,但是实际在物理内存中实际上分散的、多样复杂的。

4。关于一个进程所占有的内存资源:寻址空间是4G,用户0-2G,系统2-4G,该进程虚拟内存的大小往往远远远远的小于4G,往往只有几兆。

何谓虚拟内存大小:当进程reserve并且commit一块虚拟内存后,进程会得到该内存,但这里的内存并一定是物理内存,也可能是pagefile里的内存。无论进程commit后虚拟内存被映射到物理内存还是pagefile里,这块内存都是占据了进程的虚拟内存大小。所以一个进程的虚拟内存大小包括属于该进程的在RAM里的部分和属于该进程的在pagefile里的部分。

当调用vitualalloc去reserve时,实际上并没有真正讲内存映射到虚拟空间中,这只是在虚拟空间中预留一块虚拟地址。当调用virtualalloc去commit时,才会真正的讲内存映射到虚拟空间中,但这块内存肯定是在pagefile文件里,这也增加了虚拟内存大小。

5。从某种角度,4G的虚拟内存空间中,每个页面的状态只有3个 - free,reserve,commit。访问free或reserve的空间会引发access violation,以为这是虚的没有真正的物理内存或者pagefile映射进来。

6。所以一个进程所拥有的内存包括两部分,一个是在pagefile文件的,另一部分是物理内存里的。在物理内存的那部分我们称为进程的working set。所谓的内存中的private byte是指该进程的私有数据,一部分在RAM里一部分在pagefile文件里。

7。从系统角度讲,可用的内存是RAM+PAGEFILE。当然数据只有换进RAM里CPU才会处理,如果没有在RAM需要出发page fault将其换入。

8。关于换页,分soft fault和hard fault。pagefault会触发只要当需要访问的内存没有在RAM物理内存里。如果需要从磁盘读入才能完成,就是hard fault。其实soft fault最常发生。

太多了。。。。不想写了




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值