深入理解虚拟内存管理

访问虚拟内存时的处理流程

       一张流程图,看明白了,一切OK

虚拟地址到物理地址的转换

       Win32中的“指针”意味着虚拟地址。将32位氛围10位、10位、12位,第一个10位用来定位页目录中的页目录项,左移两位,此页目录项指向一个页表;第二个10位定位也表中的页表项,指向真正的物理内存;最后12位定位页内数据(一个页面4KB)。

       页表项中有一位用来标识包含此数据的页是否在物理内存页中,如果不在,抛出缺页错误;页表项中还可检查此数据是否在调页文件中,如果不在,则访问违例。

虚拟内存空间使用状态记录

       每个进程有一个自己的VAD集合,只有预留或者提交的内存块才会有VAD,自由的内存块没有VAD。详细的内存访问、申请过程以及在此期间VAD发挥的作用,查看请参考文献[1]4章。

进程工作集

       关键字:locality特性[1]

       对每一个进程,虚拟内存管理器都会将其一定量的内存页驻留在物理内存中,并跟踪其执行的性能指标,动态调整这个数量。Win32驻留在物理内存中的内存页称为进程的“工作集”(working set),通过任务管理器查看,“内存使用”列即为工作集大小。

       系统为每个进程定义了一个默认的最小值(根据系统物理内存大小20~50MB)和最大值(45~345MB)。当工作集到达最大值时,进程需要调入新页时,虚拟内存管理器就会将原来工作集中的某些页置换出。

       虚拟内存管理器在调页时,不仅仅只是调入需要的页,同时还将其附近的页也一起调入内存。所以:

1,对于代码来说,尽量编写紧凑代码,最理想的情形就是工作集从不会达到最大阈值。

2,对于数据来说,尽量将那些会一起访问的数据(比如链表)放在一起。利用Win32提供的预留和提交两步机制,可以为这些会一同访问的数据预留出一大块空间。内存池也是基于类似的考虑。

Win32内存相关API

1,传统的CRT函数(malloc/free系列):平台无关,方便移植,是它们最受欢迎的特性。

2global heap/local heap函数(GlobalAlloc/LocalAlloc系列)

这组函数是为了向后兼容而保留的。在windows3.1平台下,global heap为系统中所有进程共有的堆,这些进程包括系统进程和用户进程。它们对此global heap内存的申请会交错在一起,从而使得一个用户进程不小心的内存使用错误会导致整个操作系统的崩溃。local heap又被称为“private heap”,为每个进程私有。此外,进程不能通过另外的用户自定义堆或者其他方式动态地申请内存。

到了win32平台,考虑安全因素,global heap被废弃,local heap改名为process heapGlobalAlloc/LocalAlloc函数虽被沿用,但是它们都是从process heap中分配内存。win32平台还允许进程除process heap之外生成和使用新的用户自定义堆,因此在win32下建议不适用GlobalAlloc/LocalAlloc函数进行内存操作。

3,虚拟内存函数(VirtualAlloc/VirtualFree系列)

这组函数直接通过保留和提交虚拟内存地址空间来操作内存,因此它们为开发人员提供最大的自由度,但相应地为开发人员内存管理增加了更多的负担。这组函数适合于为大型连续的数据结构数组开辟空间。

4,内存映射文件(CreateFileMapping/MapViewOfFile系列)

系统使用内存映射文件函数系列来加载.exe或者.dll文件。而对开发人员而言,一方面通过这组函数可以方便地操作硬盘文件,而不用考虑那些繁琐的文件IO操作;另一方面,运行在同一台机器上的多个进程可以通过内存映射文件来共享数据(这也是同一台机器上进程间进行数据共享和通信的最有效率和最方便的方法[2])。

5,堆内存函数(HeapCreate/HeapAlloc系列)

Win32平台中的每个堆都是各进程私有的,每个进程除了默认的进程堆,还可以另外创建用户自定义堆。当程序需要动态创建多个小数据结构时,堆函数系列最为合适。一般来说,CRT函数(malloc/free)就是基于堆函数实现的。

 

参考文献:

[1] C++应用程序性能优化 冯宏华 徐莹 程远 汪磊 等编著

[2] Windows核心编程

[3] http://book.csdn.net/bookfiles/307/10030712784.shtml C++应用程序性能优化.在线免费阅读



[1] 以前执行的代码和访问的数据在后面有很大可能会被再次执行或访问。

[2] 作者敢这么说,真是佩服他。另外,在此衷心感谢作者指明各个函数的“用途”,相信作者一定是一个在实际开发工作中有深刻体会的研究者。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值