【发布时间】:2009-10-01 18:38:46
【问题描述】:
如何使用 c++ 和 win32 API 创建和启动具有 RAM 限制的进程(即启动 .exe 文件)?
如果进程超出限制,会返回哪个错误码?
【问题讨论】:
标签: c++ winapi operating-system
如何使用 c++ 和 win32 API 创建和启动具有 RAM 限制的进程(即启动 .exe 文件)?
如果进程超出限制,会返回哪个错误码?
【问题讨论】:
标签: c++ winapi operating-system
工作对象是正确的方法。
至于错误代码,真的没有。您创建流程(使用 CreateProcess)和作业(使用 CreateJobObject),然后将流程与作业对象关联(使用 AssignProcessToJobObject)。
如果子进程分配的内存超过了允许的内存量,父进程将不会收到错误消息。事实上,即使父进程退出,也会强制执行限制。如果子进程尝试分配超过允许的内存量,分配就会失败。
【讨论】:
您可以使用CreateProcess() 生成一个进程。
完成此操作后,您可以使用SetProcessWorkingSetSize() 尝试控制它使用多少物理内存,但这对 VMM 来说更像是一个非常强烈的建议,而不是一些会导致 malloc() 和 new开始失败。
没有办法说“这个过程将占用 4mb 的内存,然后所有分配都失败”。我的意思是,您将链接到 win32 dll,但您不知道这些东西需要什么样的内存使用。如果您希望您的应用程序只占用一定数量的内存,请不要分配更多。并且不要做分配内存的事情。
您关于错误代码的问题完全没有意义。
【讨论】:
NT Job objects (SetInformationJobObject & JOBOBJECT_BASIC_LIMIT_INFORMATION)
【讨论】:
据我所知,Windows 上没有这种可能性。不过,对于测试和其他事情,它会非常有用。
你在 java 上有这个,因为 JVM 只使用预定义的内存量,但它不是一个特性,而是一个问题 ;-)
【讨论】:
如果您启动一个进程,您将失去对该进程的控制。只有操作系统可以控制其行为(即内存占用),但即使在那种情况下,我也无法想象如何实现这一点,正如 jeffamaphone 所说,任何限制充其量只是一个建议,而不是指令。进程可以调用外部静态库、COM 实例等,所以我无法想象如何验证/强制执行此限制。
【讨论】: