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

How to have my program stops if its memory consumption exceeds a limit ?

我开发了一个 C++ 框架,用于 运行 定义良好的环境中的用户代码(在我们的监督下 Linux 个盒子)。

我想防止编写错误的模块开始耗尽机器的所有内存。当我开发框架时,如果它的内存消耗太高,我是否可以简单地强制程序自行停止?为此,我应该使用什么 api 或工具?

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

How to have my program stops if its memory consumption exceeds a limit ?

当你定义应用程序和它的模块之间的接口时,确保第一步(可能是第一步)是将一个类似分配器的 class 实例从应用程序传递到模块.

该实例应该在模块中用于分配和释放所有必要的内存。

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

您可以直接提供自己的operator new。但是,这不会保护您免于拨打 malloc 或直接拨打 OS。这将需要修补或包装 glibc(因为你在 Linux)。可行但不好。

您想要的安全级别是多少?你是在保护墨菲还是马基雅维利?插件可能会使用在插件的一半上分配内存的第三方库吗?您需要跟踪分配内存的插件吗?