如何设置PROCESS_set_QUOTA进行处理

How to set PROCESS_SET_QUOTA to process?

本文关键字:set QUOTA 处理 PROCESS 何设置 设置      更新时间:2023-10-16

我想使用SetProcessWorkingSetSize函数,在MSDN上我看到了这个:

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

那么,如何将PROCESS_set_QUOTA设置为进程句柄?

我想写一个程序,运行可执行的工作设置限制,所以有一段主要的代码:

STARTUPINFO si;
    memset(&si, 0, sizeof(si));
    si.cb = sizeof(si);
    GetStartupInfo(&si);
    si.dwFlags = 0;
    PROCESS_INFORMATION pi;
if (!CreateProcess(
        exePath.c_str(),
        cmdParametersBuffer,
        NULL,
        NULL,
        FALSE,
        NORMAL_PRIORITY_CLASS,
        NULL,
        NULL,
        &si,
        &pi))
    {
     cout << "error" << endl;
    }
SetProcessWorkingSetSize(pi.hProcess, 20 * 4 * 1024, 100*1024*1024);

您是否真的尝试了显示的代码,但它对您不起作用?如果是,GetLastError()报告的错误是什么?

如果你阅读了文件,上面写着:

进程安全和访问权限

PROCESS_ALL_ACCESS
进程对象的所有可能访问权限

CreateProcess函数返回的句柄具有对过程对象的PROCESS_ALL_ACCESS访问权限

因此,您应该能够在CreateProcess()退出后调用SetProcessWorkingSetSize(),就像您所展示的那样,而不需要做任何额外的操作来启用PROCESS_SET_QUOTA权限,因为它应该已经启用了。

您的示例代码正在成功调用SetProcessWorkingSetSize(),因为您得到的错误为0。如果您遇到类似0x522 ERROR_PRIVILEGE_NOT_HELD的错误,那么您就知道呼叫失败了。

了解应用程序应该能够分配比工作集大小更多的内存,这可能会有所帮助。操作系统将从RAM中调出内存。如果您使用任务管理器来查看流程的工作集,它实际上是否超过了您设置的配额?

您可能还需要使用SetProcessWorkingSetSizeEx wth标志QUOA_LIMITS_HARDWS_MAX_ENABLE来强制操作系统实际应用您的设置。