prefetchVirtualMemory 函数 (memoryapi.h)

提供一种有效的机制,用于将进程地址空间中可能存在不和谐的虚拟地址范围引入内存。

语法

BOOL PrefetchVirtualMemory(
  [in] HANDLE                    hProcess,
  [in] ULONG_PTR                 NumberOfEntries,
  [in] PWIN32_MEMORY_RANGE_ENTRY VirtualAddresses,
  [in] ULONG                     Flags
);

parameters

[in] hProcess

要预提取其虚拟地址范围的进程的句柄。 使用 GetCurrentProcess 函数可以使用当前进程。

[in] NumberOfEntries

VirtualAddresses 参数指向的数组中的条目数。

[in] VirtualAddresses

指向 WIN32_MEMORY_RANGE_ENTRY 结构数组的指针,每个结构都指定要预提取的虚拟地址范围。 虚拟地址范围可能涵盖目标进程可访问的进程地址空间的任何部分。

[in] Flags

保留。 必须为 0。

返回值

如果函数成功,则返回值为非零值。

如果函数失败,则返回值为 0(零)。 要获得更多的错误信息,请调用 GetLastError。

注解

PrefetchVirtualMemory 函数面向的应用程序,这些应用程序可以合理地知道他们将访问的地址集。 如果这些地址可能不再驻留在内存中, (即它们已分页到磁盘) ,那么在访问之前对这些地址范围调用 PrefetchVirtualMemory 函数将降低总体延迟,因为 API 会尽可能使用大型并发 I/O 请求有效地从磁盘引入这些地址范围。

PrefetchVirtualMemory 函数允许应用程序在应用程序提供要访问的进程地址范围列表时,尽可能发出大型并发 I/O,从而有效地使用磁盘硬件。 即使对于单个地址范围 (例如文件映射) , PrefetchVirtualMemory 函数也可以通过发出单个大型 I/O(而不是通过页面错误发出许多较小的 I/O)来提供性能改进。

PrefetchVirtualMemory 函数纯粹是一种性能优化:访问目标地址范围不需要预提取。 预提取的内存不会添加到目标进程的工作集中;它缓存在物理内存中。 当目标进程访问预提取的地址范围时,它们将添加到工作集中。

由于 PrefetchVirtualMemory 函数永远不需要正确操作应用程序,因此系统会将其视为一个强提示,并受常见的物理内存约束,在内存不足的情况下,它可能会完全或部分失败。 如果使用较大的地址范围调用,则它还会产生内存压力,因此应用程序应仅预提取它们实际使用的地址范围。

若要编译调用此函数的应用程序, 请将_WIN32_WINNT 定义为 _WIN32_WINNT_WIN8 或更高版本。 有关详细信息,请参阅 使用 Windows 标头

要求

   
最低受支持的客户端 Windows 8 [仅限桌面应用]
最低受支持的服务器 Windows Server 2012 [仅限桌面应用]
目标平台 Windows
标头 memoryapi.h (包括 Windows.h、Memoryapi.h)
Library onecore.lib
DLL Kernel32.dll

另请参阅

内存管理函数

WIN32_MEMORY_RANGE_ENTRY