SetProcessWorkingSetSizeEx 函数 (memoryapi.h)

设置指定进程的最小和最大工作集大小。

语法

BOOL SetProcessWorkingSetSizeEx(
  [in] HANDLE hProcess,
  [in] SIZE_T dwMinimumWorkingSetSize,
  [in] SIZE_T dwMaximumWorkingSetSize,
  [in] DWORD  Flags
);

参数

[in] hProcess

要设置其工作集大小的进程的句柄。

句柄必须具有 PROCESS_SET_QUOTA 访问权限。 有关详细信息,请参阅 进程安全性和访问权限

[in] dwMinimumWorkingSetSize

进程的最小工作集大小(以字节为单位)。 每当进程处于活动状态时,虚拟内存管理器会尝试将至少如此多的内存保留在进程中。

此参数必须大于零,但小于或等于最大工作集大小。 例如, (默认大小为 50 页,在页面大小为 4K) 的系统上,这是 204,800 个字节。 如果该值大于零但小于 20 页,则最小值设置为 20 页。

如果 dwMinimumWorkingSetSizedwMaximumWorkingSetSize 的值为 (SIZE_T) –1,则 函数会从指定进程的工作集中删除尽可能多的页。

[in] dwMaximumWorkingSetSize

进程的最大工作集大小(以字节为单位)。 每当进程处于活动状态且可用内存不足时,虚拟内存管理器会尝试在进程中保留的内存不超过这么多内存。

此参数必须大于或等于 13 页 (例如,在页面大小为 4K) 的系统上为 53,248 页,小于系统范围内最大 (可用页数减去 512 页) 。 例如, (默认大小为 345 页,在) 4K 页大小的系统上,这是 1,413,120 个字节。

如果 dwMinimumWorkingSetSizedwMaximumWorkingSetSize 的值为 (SIZE_T) –1,则 函数会从指定进程的工作集中删除尽可能多的页。 有关详细信息,请参阅“备注”。

[in] Flags

控制最小和最大工作集大小的强制实施的标志。

含义
QUOTA_LIMITS_HARDWS_MIN_DISABLE
0x00000002
如果内存需求较高,工作集可能会低于最小工作集限制。

此标志不能与 QUOTA_LIMITS_HARDWS_MIN_ENABLE 一起使用。

QUOTA_LIMITS_HARDWS_MIN_ENABLE
0x00000001
工作集不会低于最小工作集限制。

此标志不能与 QUOTA_LIMITS_HARDWS_MIN_DISABLE 一起使用。

QUOTA_LIMITS_HARDWS_MAX_DISABLE
0x00000008
如果内存充足,工作集可能会超过最大工作集限制。

此标志不能与 QUOTA_LIMITS_HARDWS_MAX_ENABLE一起使用。

QUOTA_LIMITS_HARDWS_MAX_ENABLE
0x00000004
工作集不会超过最大工作集限制。

此标志不能与 QUOTA_LIMITS_HARDWS_MAX_DISABLE 一起使用。

返回值

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

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

注解

进程的工作集是当前驻留在物理内存中的进程的虚拟地址空间中的内存页集。 这些页面可供应用程序使用,而不会触发页面错误。 有关页面错误的详细信息,请参阅 工作集。 最小和最大工作集大小会影响进程的虚拟内存分页行为。

可以通过为最小和最大工作集大小指定 值 (SIZE_T) –1 来清空指定进程的工作集。 这会从工作集中删除尽可能多的页面。 EmptyWorkingSet 函数也可用于此目的。

如果 dwMinimumWorkingSetSizedwMaximumWorkingSetSize 的值大于进程的当前工作集大小,则指定的进程必须具有 SE_INC_WORKING_SET_NAME 权限。 所有用户通常都具有此权限。 有关安全特权的详细信息,请参阅 特权

Windows Server 2003: 指定的进程必须具有 SE_INC_BASE_PRIORITY_NAME 特权。 管理员和 Power Users 组中的用户通常具有此权限。

操作系统按先到先得的原则分配工作集大小。 例如,如果应用程序成功将 40 兆字节设置为 64 兆字节系统上的最小工作集大小,而另一个应用程序请求 40 兆字节的工作集大小,操作系统将拒绝第二个应用程序的请求。

默认情况下,使用 SetProcessWorkingSetSize 函数设置应用程序的最小和最大工作集大小并不保证将保留请求的内存,也不能保证它始终保持驻留状态。 当应用程序处于空闲状态或内存不足的情况导致对内存的需求时,操作系统可以将应用程序的工作集降低到其最低工作集限制以下。 如果内存充足,系统可能会允许应用程序超过其最大工作集限制。 使用QUOTA_LIMITS_HARDWS_MIN_ENABLEQUOTA_LIMITS_HARDWS_MAX_ENABLE标志可确保强制实施限制。

增加应用程序的工作集大小时,会从系统其余部分带走物理内存。 这可能会降低其他应用程序和整个系统的性能。 它还可能导致需要物理内存 (的操作失败,例如,创建进程、线程和内核池) 。 因此,必须谨慎使用 SetProcessWorkingSetSize 函数。 设计应用程序时,必须始终考虑整个系统的性能。

应用程序可以使用 VirtualLock 函数锁定内存中应用程序的虚拟地址空间范围;但是,这可能会降低系统的性能。

要求

要求
最低受支持的客户端 Windows Vista [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 | UWP 应用]
目标平台 Windows
标头 memoryapi.h (包括 Windows Vista 上的 Windows.h、Windows 7、Windows Server 2008 Windows Server 2008 R2)
Library onecore.lib
DLL Kernel32.dll

另请参阅

GetProcessWorkingSetSizeEx

进程工作集

进程和线程函数

进程

VirtualLock

工作集