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

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

本文关键字:内存 如果 我的 程序      更新时间:2023-10-16

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

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

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

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

当您定义应用程序与其模块之间的接口时,确保第一步(可能是第一步)是将一个类似分配器的类实例从应用程序传递给模块。

应该在模块中使用这个实例来分配和释放所有必需的内存。

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

您可以直接提供您自己的operator new。然而,这并不能保护您免受malloc调用或直接操作系统调用的影响。这将需要修补或包装glibc(因为您使用的是Linux)。可行但不太好。

你想要的安全级别是什么?你是在防范墨菲还是马基雅维利?一个插件可以使用第三方库分配一半的内存吗?您需要跟踪分配内存的插件吗?

相关文章: