《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存.doc

《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存.doc

ID:55632625

大小:30.50 KB

页数:25页

时间:2020-05-21

《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存.doc_第1页
《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存.doc_第2页
《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存.doc_第3页
《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存.doc_第4页
《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存.doc_第5页
资源描述:

《《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存在应用程序中使用虚拟内存Windows提供了以下三种机制对内存进行操控:一:虚拟内存。最适合来管理大型对象数据或大型结构数组。二:内存映射文件。最适合用来管理大型数据流,以及在同一机器上运行的多个进程之间共享数据。三:堆。最适合用来管理大量的小型对象。很多人都对VirtualAlloc和malloc或new的区别不是很清楚,我也一样。今天搜索下了,发现这句话说的很清楚了:VirtualAlloc要进入内核模式,算法特复杂,比较慢,而且分配粒度是4k,用来分配小块内存很浪费malloc先用VirtualAlloc弄一大

2、块内存,后面在堆上分配时就不用进入内核模式,算法也简单些,而且分配粒度比较小VirtualAlloc只能分配4KB为单位的页面,适合大型数据或者内存映射文件等用途。而堆的申请分配就没有这个限制,更为灵活。有的人嫌malloc还不够精简,于是又在堆上面开辟自己的内存池,更加轻量级本文将主要介绍虚拟内存。Windows提供了一些用来操纵虚拟内存的函数,我们可以通过这些函数直接预订地址空间区域,并给这些预订的区域调拨来自页交换文件的物理存储器。预定地址空间区域。可以通过调用VirtualAlloc函数来运行:[cpp]viewplaincopyPVOIDVirtualAlloc(PV

3、OIDpvAddress,SIZE_TdwSize,DWORDfdwAllocationType,DWORDfdwProtect);pvAddress是内存地址。用来告诉我们想要运行地址空间中的哪一块。当传入NULL时,系统会自动找到一块闲置区域。如果在pvAddress标识的内存块中找不到闲置区域,或闲置区域不够大函数将返回NULL。如果VirtualAlloc能满足我们的要求,它会预定一块区域并返回该区域的基地址。dwSize用来指定我们想要预订的区域大小。以字节为单位。系统始终以cpu页面大小整数倍来预定区域。且起始地址是按照分配粒度64kB的整数倍来预定的。fdwAll

4、ocationType用来告诉系统我们到底是要预订还是要调拨物理存储器。如果要预订区域可以传入:MEM_RESERVE。如果我们想让系统从尽可能高的内存地址来预定区域,必须传入NULL给pvAddress,同时对MEM_TOP_DOWN和MEM_RESERVE标志进行按位或操作。fdwProtect给区域指定保护属性。区域的保护属性对调拨给该区域的物理存储器不起任何作用。无论指定何种保护属性,只要还未给该区域调拨物理存储器都会导致访问违规。预订时指定的属性应该跟调拨时指定的属性相同,这样系统内部处理效率会更高。调拨物理存储器预定区域后还需要给该区域调拨物理存储器。系统会从页交换

5、文件中调拨物理存储器给该区域。在调拨物理存储器时,起始地址和区域大小始终都是页面大小的整数倍。调拨物理存储器同样需要调用VirtualAlloc。但这次我们需要传入MEM_COMMIT来作为fdwAllocationType的值。pvAddress标识要调拨物理存储器的区域的起始地址。dwSize表示物理存储器的大小。以字节为单位。我们并不需要给整个区域都调拨物理存储器。有了起始地址和大小就可以标识一段区域。同时预定和调拨物理存储器有时我们项同时预定区域并给该区域调拨物理存储器。同样需要调用VirtualAlloc。但是MEM_RESERVE要和MEM_COMMIT按位或并将它

6、们传给fdwAllocationType。此时系统会为整个区域调拨物理存储器。撤销调拨物理存储器及释放区域。要撤销调拨给区域的物理存储器或是释放地址空间中的一整块区域。可以调用VirtualFree函数:[cpp]viewplaincopyBOOLVirtualFree(LPVOIDpvAddress,SIZE_TdwSize,DWORDfdwFreeType);pvAddress参数必须是区域的基地址。该地址就是预定区域时VirtualAlloc返回的地址。由于系统在内部会记录该地址处的区域大小,因此我们可以且必须传入0给dwSize。当传入MEM_RELEASE给fdwFr

7、eeType时是想告诉系统撤销调拨给该区域的所有物理存储器,并释放该区域。我们可以撤销调拨给该区域的一部分物理存储器。此时需要传入pvAddress来告诉系统我们想要撤销调拨的区域的起始地址。dwSize传入想要撤销调拨区域的物理存储器大小,并传入MEM_DECOMMIT给fdwFreeType。和调拨物理存储器一样,撤销调拨也是基于页面粒度的。也就是说,如果给定的地址位于一个页面中,那么系统会撤销调拨整个页面。如果dwSize为0,而pvAddress又是该区域的基地址,那么Virtual

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。