【文起】亲爱的,你回家才十多天,可是对我而言却好像是一个多月似的。想你,念你
应用程序中使用虚拟内存
一:Windows提供了3种进行内存管理的方法:
1、 虚拟内存,最适合用来管理大型对象或者结构数组;
2、 内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据;
3、 内存堆栈,最适合用来管理大量的小对象。
二:地址空间中保留一个区域:
通过调用VirtualAlloc函数,可以在进程的地址空间中保留一个区域
PVOID VirtualAlloc(PVOID pvAddress,SIZE_T dwSize,DWORD fdwAllocationType,DWORDfdwProtect);
第一个参数:是内存地址,及用于高速系统将地址空间保留在什么地方,大多数情况下,我们应该给它传递NULL,让系统自己保留一个系统认为最合适的地方。且该参数必须是在进程的用户方式分区中,否则VirtualAlloc函数调用就会失败,函数失败返回NULL.该值系统会按照分配粒度圆整。
第二个参数:是dwSize,用于设定想要保留的区域大小(字节为单位),保留区域始终必须是CPU页面大小的倍数,比如传入值为62KB,CPU页面值为16kb,那么保留区域为64kb。
第三个参数:fdwAllocationType,能够告诉系统想要保留一个区域还是提交物理存储器。MEM_RESERVE标识符作为保留区域。
第四个参数:fdwProtect,用于指明应该赋予该地址空间区域的保护属性。但是不能设定PAGE_WRITECOPY属性,也不能设定PAGE_EXECUTE_WRITECOPY属性,如果设定了这些属性,VirtualAlloc函数不保留该区域,并且返回NULL。而且,如果为保留地址空间区域时,不能使用保护属性标志PAGE_GUARD,PAGE_NOCACHE或者PAGE_WRITECOMBINE,这些只能用于已提交属性。
三:在保留区域中提交存储器
当保留一个区域后,必须将物理存储器提交给该区域,才能访问该区域中包含的内存地址。系统从它的页文件中,将已经提交的物理存储器分配给一个区域。物理存储器总是按页面边界和页面大小的块来提交。
提交物理存储器,必须再次调用VirtualAlloc函数,参数fdwAllocationType传递MEM_COMMIT标记。我们可以告诉系统,提交多少的物理存储器,而不是一次性提交。
四:同时进行区域的保留和内存的提交:
PVOID pvMem = VirtualAlloc(NULL,99 * 1024,MEM_RESERVE |MEM_COMMIT,PAGE_READWRITE);
该函数调用请求保留一个99kb的区域,并且将99kb的物理存储器提交给它。如果CPU页面为4kb,那么最终保留提交了100kb;如果是8kb,那么保留提交104kb
五:何时提交物理存储器:
需要存储一个较大的二维数组如CELLDATA CellData[200][256],那么我们可以保留一块200 * 256 *sizeof(CELLDATA)大小的地址空间,但有数据时在进行页面提交。
六:回收虚拟内存和释放地址空间区域:
进程不再访问区域中的物理存储器时,就可以释放整个保留的区域和所有提交给该区域的物理存储器,方法是调用VirtualFree函数。
七:改变保护属性:
通过调用VirtualProtect函数,可以改变内存页面的保护属性。保护属性是与内存的整个页面相关联的,不是赋予内存的各个字节。如一个CPU页面为4kb的计算机上,执行下面的函数
VirtualProtect(pvRgnBase + ( 3 * 1024 ), 2 * 1024,PAGE_NOACCESS,&flOldProtect);
pvRgnBase是4kb对齐了,所以从3KB之后开始2kb,涉及了两个页面,此函数就改变了2个页面的属性。
八:清除物理存储器的内容:
有些应用程序使用内存的时间很短,然后就不再要求保留该内存内容,可以告诉系统对该页面进行清除,方法是调用VirtualAlloc函数,第三个删除传递MEM_RESET,该标志只可以单独使用。
九:地址窗口扩展:
服务器应用程序必须在RAM中保存更多的数据,且缩小磁盘页面。对于有些应用程序而言,32位的地址空间是不够使用的。所以地址窗口扩展(AWE)诞生了。
1、 允许应用程序对从来不在操作系统与磁盘之间交换的RAM进行分配;
2、 允许应用程序访问的RAM大于进程的地址空间
A、我们调用AllocateUserPhysicalPages函数分配RAM。
BOOLAllocateUserPhysicalPages(HANDLE hProcess,PULONG_PTR pulRAMPages,PULONG_PTRaRAMPages);
该函数负责分配pulRAMPages参数指明的值设定的RAM页面的数量,且将这些页面赋予hProcess参数标识的进程。只有拥有页面的进程才能使用已经分配的RAM页 面,AWE不允许RAM页面被映射到另一个进程的地址空间。
B、调用MapUserPhysicalPages函数将该RAM块赋予该地址窗口。
BOOL MapUserPhysicalPages(PVOID pvAddressWindow,ULONG_PTRulRAMPages, PULONG_PTR aRAMPages);
第一个参数用于指明地址窗口的虚拟地址。第二个和第三个用于指明该地址窗口中可以看到多少RAM页面以及哪些页面可以看到。
也可以调用MapUserPhysicalPages函数来取消当前RAM块分配,方法是给aRAMPages参数传递NULL
C、不再需要RAM时,应该调用FreeUserPhysicalPages函数将其释放。
【文尾】目标不变,继续努力。加油亲爱的蟹儿
本文介绍了Windows应用程序中虚拟内存的管理方法,包括如何使用VirtualAlloc进行内存保留和提交,以及VirtualFree、VirtualProtect等函数的使用,强调了在处理大型数据时虚拟内存的优势。还提及了地址窗口扩展(AWE)技术,适用于需要超大内存空间的应用场景。
3万+

被折叠的 条评论
为什么被折叠?



