前言

Microsoft Windows 提供三种机制来对内存进行操控:


  • 虚拟内存 最适合用来管理大型对象数组或大型结构数组
  • 内存映射文件 最适合用来管理大型数据六(通常是文件)
  • 堆 最用来适合管理大量的小型对象

一、预定地址空间区域

1.1 VirtualAlloc函数

LPVOID WINAPI VirtualAlloc(
__in_opt LPVOID lpAddress,
__in SIZE_T dwSize,
__in DWORD flAllocationType,
__in DWORD flProtect
);

lpAddress : 想要预订地址空间的哪一块,如果要在进程地址空间第50MB的地方分配区域。我们要传52 428 800(5010241024)给pvAddress参数。系统始终按分配粒度的整数倍来分配的因此如果我们想要在19668992(30065536+8192)的地方预订区域,那么系统会向下取整到64整数倍,也就是19660800(30065536)然后取整后的地址预订区域。如果VirtualAlloc能满足我们的要求,那么它会预订一块区域并返回该区域的基地址。如果我们还给pvAddesss指定了参数,那么,它的返回值就等于我们传给pvASddress参数值向下取整到64KB的整数倍

dwSize: 指定我们想要分析区域的大小,以字节为单位。由于系统始终都根据cpu页面大小整数倍来预订区域,因此如果我们的页面大小为4KB,8KB或16KB的机器上预订62 KB的区域的话,那么最终得到的区域大小为64KB

flAllocationType: 是预订区域还是调拨物理存储器,如果是预订就要传 MEM_RESERVE为参数如果打算预订一块区域,并且用很长时间,那我们可能会希望系统从尽可能高的内存地址来预订。这样可以防止进程地址空间的中间预订区域,从而避免可能会引起内存碎片。

fdwProtect: 给区域指定保护属性。如果应用程序在非统一内存访问的机器上运行,我们可以调用VirtualAllocExNuma函数来强制系统在某个节点的物理内存中分配一部分虚拟内存。

二、给区域调拨物理存储器

三、同时预定和调拨物理存储器

四、何时调拨物理存储器

五、撤销调拨物理存储器及释放区域

六、改变保护属性

七、重置物理存储器的内容