我开发了一个C ++框架,用于在定义良好的环境中运行用户代码(在我们监督下的Linux机箱中)。
我想防止编写错误的模块开始占用机器的所有内存。当我开发框架时,如果内存消耗过高,我可以简单地强制程序停止运行吗?我应该使用什么api或工具?
答案 0 :(得分:3)
setrlimit
提供了一种控制流程资源限制的简单机制。但这并不能隔离进程(就像你应该对不受信任的第三方代码那样),它只会对它施加一些限制。要将进程与系统的其他部分正确隔离,您应该使用VM,或者使用cgroup和内核命名空间 - 最好不要手动,而是通过一些现有的库或框架(如Docker)。
答案 1 :(得分:2)
如果程序的内存消耗超过限制,如何停止程序?
当您定义应用程序及其模块之间的接口时,请确保第一步(可能是第一步)之一是将类似分配器的类实例从应用程序传递到模块。
应该在模块中使用此实例来分配和释放所有必要的内存。
这将允许实现此分配器实例,以报告主应用程序的内存分配,如果达到限制(每个模块或每个应用程序),应该能够触发异常。
答案 2 :(得分:0)
您可以直接提供自己的operator new
。但是,这不会保护您免受malloc
的调用或直接操作系统调用。这需要修补或包装glibc(因为你在Linux上)。可行但不好。
您期望的安全级别是多少?你在保护Murphy或Machiavelli吗?可能一个插件使用第三方库,它在插件的分区上分配内存?你需要跟踪分配内存的插件吗?