Windows提供了以下三种机制来对内存进行操控:
1)虚拟内存:最适合用来管理大型对象数组或大型数据结构数组;
2)内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间共享数据;
3)堆:最适合用来管理大量的小型对象。
Windows提供了一些用来操控虚拟内存的函数,通过这些函数可以直接预订地址空间区域、给区域调拔(来自页交换文件的)物理存储器、根据需要设置页面的保护属性。
1. 预订地址空间区域
函数: PVOID VirtualAlloc(
PVOID pvAddress,
SIZE_T dwSize,
DWORD fdwAllocationType,
DWORD fdwProtect);
第一个参数pvAddress可能指定告诉系统想要预订的地址空间是哪一块,为NULL时表示由系统搜索闲置的地址空间;
第三个参数fdwAllocationType用来表示是预订区域还是调拔物理存储器,如果是预订区域则传MEM_RESERVE;
如果打算预订一块区域并且长时间使用,那么就从尽可能高的内存地址来预订区域,这样可以防止在进程地址空间中的中间预订区域,从而避免可能引起的内存碎片。调用函数如下:
VirtualAlloc(NULL, 6*1024, MEM_TOP_DOWN | MEM_RESERVE, PAGE_READWRITE);
2.给区域调拔物理存储器
为了调拔物理存储器,需再次调用VirtualAlloc(),需指定类型标志MEM_COMMIT和页保护属性PAGE_READWRITE,例如应用程序在地址5242880处预订一块大小为512KB的区域,现在希望给该区域从2KB地址开始的地方调拔6KB的物理存储器,调用函数如下:
VirtualAlloc((PVOID)(5242880 + (2*1024)), 6*1024, MEM_COMMIT, PAGE_READWRITE);
3.同时预订和调拔物理存储器
只需调用一次VirtualAlloc(),指定相应参数即可,希望预订一块大小为99KB的区域,并给该区域调拔99KB的物理存储器,调用函数如下:
VirtualAlloc(NULL, 99 * 1024, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);