地址窗口化扩展

地址窗口扩展 (AWE) 是一组扩展,允许应用程序快速操作大于 4GB 的物理内存。 某些数据密集型应用程序(如数据库管理系统和科学和工程软件)需要访问非常大的数据缓存。 对于非常大的数据集,限制缓存以适应应用程序的 2GB 用户地址空间是一个严重的限制。 在这些情况下,缓存太小,无法正确支持应用程序。

AWE 通过允许应用程序直接处理大量内存,同时继续使用 32 位指针来解决此问题。 AWE 允许应用程序的数据缓存大于 4GB (,) 有足够的物理内存。 AWE 在 32 位虚拟地址空间内使用此物理内存的各个部分的物理非分页内存和窗口视图。

AWE 对此内存的使用方式进行了一些限制,主要是因为这些限制允许极快的映射、重新映射和释放。 快速内存管理对于这些潜在的巨大地址空间非常重要。

  • 为 AWE 分配的虚拟地址范围不可与其他进程共享 (,因此不可) 继承。 事实上,同一进程中的两个不同的 AWE 虚拟地址不允许映射同一物理页面。 这些限制提供在释放内存时快速重新映射和清理。
  • 可以为 AWE 区域分配的物理页受计算机中存在的物理页数的限制,因为此内存永远不会分页 - 在应用程序显式释放或退出之前,该内存会被锁定。 为给定进程分配的物理页可以映射到同一进程中的任何 AWE 虚拟区域。 使用 AWE 的应用程序必须小心,不要占用太多物理内存,以免导致其他应用程序过度分页或由于缺少资源而阻止创建新进程或线程。 使用 GlobalMemoryStatusEx 函数监视物理内存使用情况。
  • AWE 虚拟地址始终是可读/写的,无法通过调用 VirtualProtect (即,) 指定无只读内存、无访问内存、保护页等。
  • AWE 地址范围不能用于缓冲图形或视频通话的数据。
  • 不能拆分 AWE 内存范围,也不能删除它的片段。 相反,当需要删除时,必须将整个虚拟地址范围作为一个单元删除。 这意味着在调用 VirtualFree 时必须指定MEM_RELEASE
  • 应用程序可以同时映射多个区域,前提是它们不重叠。
  • 仿真模式下不支持使用 AWE 的应用程序。 也就是说,使用 AWE 函数的 x86 应用程序必须重新编译才能在另一个处理器上运行,而大多数应用程序无需在其他平台上的模拟器下重新编译即可运行。

此解决方案以非常通用、广泛适用的方式解决物理内存问题。 AWE 的一些优势包括:

  • 定义了一小组新函数来操作 AWE 内存。
  • AWE 提供非常快速的重新映射功能。 重新映射是通过操作虚拟内存表来完成的,而不是通过移动物理内存中的数据来完成的。
  • AWE 提供适合处理器 (的页面大小粒度,例如,x86) 上的 4 KB,这比 (大型页面(例如 x86) 上的 2MB 或 4MB)更适用于应用程序。

应用程序必须具有“锁定内存页”权限才能使用 AWE。 若要获取此权限,管理员必须将 “锁定内存页” 添加到用户 的用户权限分配中。 有关如何执行此操作的详细信息,请参阅操作系统帮助中的“用户权限”。

以下函数组成地址窗口扩展 (AWE) API。

函数 说明
VirtualAllocVirtualAllocEx 使用 MEM_PHYSICAL 保留一部分虚拟地址空间以用于 AWE。
AllocateUserPhysicalPages 分配用于 AWE 的物理内存。
MapUserPhysicalPages 将 (或失效) AWE 虚拟地址映射到使用 AllocateUserPhysicalPages 获取的任意一组物理页。
MapUserPhysicalPagesScatter 将 (或失效) AWE 虚拟地址映射到使用 AllocateUserPhysicalPages 获取的任何物理页面集,但控制比 MapUserPhysicalPages 提供的控制更精细。
FreeUserPhysicalPages 释放用于 AWE 的物理内存。