【问题标题】:How to launch process with limited memory?如何启动内存有限的进程?
【发布时间】:2009-10-01 18:38:46
【问题描述】:

如何使用 c++ 和 win32 API 创建和启动具有 RAM 限制的进程(即启动 .exe 文件)?

如果进程超出限制,会返回哪个错误码?

【问题讨论】:

    标签: c++ winapi operating-system


    【解决方案1】:

    工作对象是正确的方法。

    至于错误代码,真的没有。您创建流程(使用 CreateProcess)和作业(使用 CreateJobObject),然后将流程与作业对象关联(使用 AssignProcessToJobObject)。

    如果子进程分配的内存超过了允许的内存量,父进程将不会收到错误消息。事实上,即使父进程退出,也会强制执行限制。如果子进程尝试分配超过允许的内存量,分配就会失败。

    【讨论】:

      【解决方案2】:

      您可以使用CreateProcess() 生成一个进程。

      完成此操作后,您可以使用SetProcessWorkingSetSize() 尝试控制它使用多少物理内存,但这对 VMM 来说更像是一个非常强烈的建议,而不是一些会导致 malloc() 和 new开始失败。

      没有办法说“这个过程将占用 4mb 的内存,然后所有分配都失败”。我的意思是,您将链接到 win32 dll,但您不知道这些东西需要什么样的内存使用。如果您希望您的应用程序只占用一定数量的内存,请不要分配更多。并且不要做分配内存的事情。

      您关于错误代码的问题完全没有意义。

      【讨论】:

        【解决方案3】:

        NT Job objects (SetInformationJobObject & JOBOBJECT_BASIC_LIMIT_INFORMATION)

        【讨论】:

          【解决方案4】:

          据我所知,Windows 上没有这种可能性。不过,对于测试和其他事情,它会非常有用。

          你在 java 上有这个,因为 JVM 只使用预定义的内存量,但它不是一个特性,而是一个问题 ;-)

          【讨论】:

            【解决方案5】:

            如果您启动一个进程,您将失去对该进程的控制。只有操作系统可以控制其行为(即内存占用),但即使在那种情况下,我也无法想象如何实现这一点,正如 jeffamaphone 所说,任何限制充其量只是一个建议,而不是指令。进程可以调用外部静态库、COM 实例等,所以我无法想象如何验证/强制执行此限制。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-03-01
              • 1970-01-01
              • 1970-01-01
              • 2017-11-02
              • 2020-04-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多