15在应用程序中使用虚拟内存

15在应用程序中使用虚拟内存

ID:41005697

大小:192.84 KB

页数:38页

时间:2019-08-13

15在应用程序中使用虚拟内存_第1页
15在应用程序中使用虚拟内存_第2页
15在应用程序中使用虚拟内存_第3页
15在应用程序中使用虚拟内存_第4页
15在应用程序中使用虚拟内存_第5页
资源描述:

《15在应用程序中使用虚拟内存》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、第15章在应用程序中使用虚拟内存Windows提供了3种进行内存管理的方法,它们是:•虚拟内存,最适合用来管理大型对象或结构数组。•内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据。•内存堆栈,最适合用来管理大量的小对象。本章将要介绍第一种方法,即虚拟内存。内存映射文件和堆栈分别在第17章和第18章介绍。用于管理虚拟内存的函数可以用来直接保留一个地址空间区域,将物理存储器(来自页文件)提交给该区域,并且可以设置你自己的保护属性。15.1在地址空间中保留一个区域通过调用VirtualAlloc函数,可以在进程的地址空间中保留一

2、个区域:PVOIDVirtualAlloc(PVOIDpvAddress,SIZE_TdwSize,DWORDfdwAllocationType,DWORDfdwProtect);第一个参数pvAddress包含一个内存地址,用于设定想让系统将地址空间保留在什么地方。在大多数情况下,你为该参数传递MULL。它告诉VirtualAlloc,保存着一个空闲地址区域的记录的系统应该将区域保留在它认为合适的任何地方。系统可以从进程的地址空间的任何位置来保留一个区域,因为不能保证系统可以从地址空间的底部向上或者从上面向底部来分配各个区域。可以使用MEM_TOP_DOWN标志来说明该分

3、配方式。这个标志将在本章的后面加以介绍。对大多数程序员来说,能够选择一个特定的内存地址,并在该地址保留一个区域,这是个非同寻常的想法。当你在过去分配内存时,操作系统只是寻找一个其大小足以满足需要的内存块,并分配该内存块,然后返回它的地址。但是,由于每个进程有它自己的地址空间,因此可以设定一个基本内存地址,在这个地址上让操作系统保留地址空间区域。例如,你想将一个从50MB开始的区域保留在进程的地址空间中。这时,可以传递52428800(50×1024×1024)作为pvAddress参数。如果该内存地址有一个足够大的空闲区域满足你的要求,那么系统就保留这个区域并返回。如果在特

4、定的地址上不存在空闲区域,或者如果空闲区域不够大,那么系统就不能满足你的要求,VirtualAlloc函数返回NULL。注意,为pvAddress参数传递的任何地址必须始终位于进程的用户方式分区中,否则对VirtualAlloc函数的调用就会失败,导致它返回NULL。第13章讲过,地址空间区域总是按照分配粒度的边界来保留的(迄今为止在所有的Windows环境下均是64KB)。因此,如果试图在进程地址空间中保留一个从19668992(300×65536+8192)这个地址开始的区域,系统就会将这个地址圆整为64KB的倍数,然后保留从19660800(300×65536)这个地

5、址开始的区域。如果VirtualAlloc函数能够满足你的要求,那么它就返回一个值,指明保留区域的基地址。如果传递一个特定的地址作为VirtualAlloc的pvAddress参数,那么该返回值与传递给VirtualAlloc的值相同,并被圆整为(如果需要的话)64KB边界值。VirtualAlloc函数的第二个参数是dwSize,用于设定想保留的区域的大小(以字节为计量单位)。由于系统保留的区域始终必须是CPU页面大小的倍数,因此,如果试图保留一个跨越62KB的区域,结果就会在使用4KB、8KB或16KB页面的计算机上产生一个跨越64KB的区域。VirtualAlloc函

6、数的第三个参数是fdwAllocationType,它能够告诉系统你想保留一个区域还是提交物理存储器(这样的区分是必要的,因为VirtualAlloc函数也可以用来提交物理存储器)。若要保留一个地址空间区域,必须传递MEM_RESERVE标识符作为FdwAllocationType参数的值。如果保留的区域预计在很长时间内不会被释放,那么可以在尽可能高的内存地址上保留该区域。这样,该区域就不会从进程地址空间的中间位置上进行保留。因为在这个位置上它可能导致区域分成碎片。如果想让系统在最高内存地址上保留一个区域,必须为pvAddress参数和fdwAllocationType参数

7、传递NULL,还必须逐位使用OR将MEM_TOP_DOWN标志和MEM_RESERVE标志连接起来。注意在Windows98下,MEM_TOP_DOWN标志将被忽略。最后一个参数是fdwProtect,用于指明应该赋予该地址空间区域的保护属性。与该区域相关联的保护属性对映射到该区域的已提交内存没有影响。无论赋予区域的保护属性是什么,如果没有提交任何物理存储器,那么访问该范围中的内存地址的任何企图都将导致该线程引发一个访问违规。当保留一个区域时,应该为该区域赋予一个已提交内存最常用的保护属性。例如,如果打算提交的物理

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

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

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