如何让我的程序停止,如果它的内存消耗超过限制
How to have my program stops if its memory consumption exceeds a limit ?
我开发了一个c++框架,用于在定义良好的环境中运行用户代码(在我们的监督下的Linux盒子)。
我想防止写得不好的模块开始吞噬机器的所有内存。当我开发框架时,如果程序的内存消耗过高,我可以简单地强制程序停止自己吗?我应该使用什么api或工具?
setrlimit
提供了一种控制进程资源限制的简单机制。但是,这并没有隔离进程(对于不受信任的第三方代码,您应该这样做),它只是对其施加了一些限制。要正确地将进程与系统的其余部分隔离开来,您应该使用VM,或者使用cgroups和内核名称空间—最好不要手工,而是通过一些现有的库或框架(如Docker)。
如何让我的程序在内存消耗超过限制时停止?
当您定义应用程序与其模块之间的接口时,确保第一步(可能是第一步)是将一个类似分配器的类实例从应用程序传递给模块。
应该在模块中使用这个实例来分配和释放所有必需的内存。
这将允许这个分配器实例的实现,向主应用程序报告内存分配,如果达到限制(每个模块或每个应用程序),它应该能够触发异常。
您可以直接提供您自己的operator new
。然而,这并不能保护您免受malloc
调用或直接操作系统调用的影响。这将需要修补或包装glibc(因为您使用的是Linux)。可行但不太好。
你想要的安全级别是什么?你是在防范墨菲还是马基雅维利?一个插件可以使用第三方库分配一半的内存吗?您需要跟踪分配内存的插件吗?
相关文章:
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 为什么 bool 和 _Bool 如果它们在内存中占用 1 个字节,它们只能存储 0 或 1
- 如果不分配内存,我如何能够为变量创建和分配值?
- 如果我在 c++ 中以 new 的放置形式使用没有足够的内存,会发生什么情况?
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- 如果 RMW 操作没有任何变化,是否可以针对所有内存顺序对其进行优化
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 内存浪费?如果main()应该只返回0或1,那么为什么main是用int而不是短int甚至char声明的
- 如果我提前将参数声明为变量而不是将它们内联写入函数调用,那有什么区别(在内存方面)?
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?
- 如果操作系统未清除内存泄漏,则在程序完成后内存泄漏是否仍然存在?
- 如果没有指针,如何识别堆栈上的内存?
- 如果我不将预先编写的字符串保存到变量,它还在内存中吗?
- 如果访问对象,则指向的对象内部的指针会更改内存位置
- 如果关闭娱乐后()所有内存都会被交易,则如何打印输出
- 更快,更少的内存如果