地址窗口扩展

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) 地址映射到 使用 AllocateUser PhysicalalPages获取的任何物理页面集,但具有比 MapUserPhysicalPages提供的更精细的控制。
FreeUserPhysicalPages 用于 AWE 的可用物理内存。