如果程序的内存消耗超过限制,如何让程序停止? 我开发了一个C++框架,用于在一个定义良好的环境中运行用户代码(在我们的监管下的Linux盒子)。p>

如果程序的内存消耗超过限制,如何让程序停止? 我开发了一个C++框架,用于在一个定义良好的环境中运行用户代码(在我们的监管下的Linux盒子)。p>,c++,linux,memory-management,C++,Linux,Memory Management,我想防止写得不好的模块开始消耗机器的所有内存。当我开发这个框架时,如果程序的内存消耗太高,我可以简单地强制程序停止吗?我应该为此使用什么api或工具 控制进程资源限制的简单机制由提供。但这并没有隔离流程(对于不受信任的第三方代码,您应该这样做),它只是对流程进行了一些限制。为了正确地将进程与系统的其余部分隔离开来,您应该使用VM,或者使用cgroups和内核名称空间——最好不要手动,而是通过一些现有的库或框架(如Docker)。提供了一种控制进程资源限制的简单机制。但这并没有隔离流程(对于不受信

我想防止写得不好的模块开始消耗机器的所有内存。当我开发这个框架时,如果程序的内存消耗太高,我可以简单地强制程序停止吗?我应该为此使用什么api或工具

控制进程资源限制的简单机制由提供。但这并没有隔离流程(对于不受信任的第三方代码,您应该这样做),它只是对流程进行了一些限制。为了正确地将进程与系统的其余部分隔离开来,您应该使用VM,或者使用cgroups和内核名称空间——最好不要手动,而是通过一些现有的库或框架(如Docker)。

提供了一种控制进程资源限制的简单机制。但这并没有隔离流程(对于不受信任的第三方代码,您应该这样做),它只是对流程进行了一些限制。为了正确地将进程与系统的其余部分隔离开来,您应该使用VM,或者使用cgroups和内核名称空间——最好不要手动,而是通过一些现有的库或框架(如Docker)

如果程序的内存消耗超过限制,如何让程序停止

在定义应用程序及其模块之间的接口时,请确保第一步(可能是第一步)是将类似分配器的类实例从应用程序传递到模块

此实例应在模块中用于分配和取消分配所有必要的内存

这将允许此分配器实例的实现向主应用程序报告内存分配,如果达到限制(每个模块或每个应用程序),主应用程序应该能够触发异常

如果程序的内存消耗超过限制,如何让程序停止

在定义应用程序及其模块之间的接口时,请确保第一步(可能是第一步)是将类似分配器的类实例从应用程序传递到模块

此实例应在模块中用于分配和取消分配所有必要的内存


这将允许此分配器实例的实现向主应用程序报告内存分配,如果达到限制(每个模块或每个应用程序),主应用程序应该能够触发异常。

您可以直接提供自己的
操作符new
。但是,这不会保护您免受对
malloc
的调用或直接操作系统调用。这需要对glibc进行修补或包装(因为您使用的是Linux)。可行但不好


您希望的安全级别是多少?你是在保护墨菲还是马基雅维利?插件是否可以使用第三方库来分配插件的内存?您需要跟踪分配内存的插件吗?

您可以直接提供自己的
操作员新的
。但是,这不会保护您免受对
malloc
的调用或直接操作系统调用。这需要对glibc进行修补或包装(因为您使用的是Linux)。可行但不好


您希望的安全级别是多少?你是在保护墨菲还是马基雅维利?插件是否可以使用第三方库来分配插件的内存?您需要跟踪分配内存的插件吗?

如果程序占用大量内存,操作系统将停止该程序,但除此之外,我唯一能想到的就是编写自己的内存管理模块,当程序使用了预定义的内存量时,该模块将停止程序。今天早上,操作系统很高兴地杀死了一个系统进程,而不是流氓进程。这就是为什么我们想要更具预防性的东西。这当然是一个问题:)@Barth运行一个监视进程,定期调用ps aux命令如何?你可以查看
man bash
并查看限制给定shell的
ulimit
下。如果程序占用了大量内存,操作系统将停止该程序,但除此之外,我唯一能想到的就是编写自己的内存管理模块,当程序使用了预定义的内存量时,该模块将停止程序。今天早上,操作系统很高兴地杀死了一个系统进程,而不是流氓进程。这就是为什么我们想要一个更具预防性的问题:当然,这是一个问题:“Barth,运行一个监视程序,它会定期调用PS AUX命令吗?你可以看看<代码> man Bash < /Cube >,并在 UulimIT <代码>下限制一个给定的shell。现在它是我们必须支持的遗留代码。因此,我认为DoCKER会对这个程序进行改写,但现在它是我们必须支持的遗留代码。因此,我想我会选择strlimit。没有必要传递这样的分配器,我们已经隐式地传递了
操作符new
。它可能不是一个类,但它确实生成了一个异常(std::bad_alloc)。使用该标准的好处是很多代码已经遵循了这个惯例。我意识到模块代码可以访问operator new,但OP要求设置自定义/任意限制的可能性。这将需要一个具有大量隐藏状态的自定义运算符new,或者一个自定义内存管理器/跟踪器/分配器。不需要传递这样的分配器,我们已经隐式传递了
运算符new
。它可能不是一个类,但它确实生成了一个异常(std::bad_alloc)。使用该标准的好处是很多代码已经遵循了这个惯例。我意识到模块代码可以访问operator new,但OP要求设置自定义/任意限制的可能性。这需要