Unix - 保护自己免受失控的内存消耗降低PC?

时间:2011-10-28 15:36:55

标签: c++ c linux unix memory-management

.net Windows环境要求提出一个非常类似的问题:

How do you protect yourself from runaway memory consumption bringing down the PC?

这个问题是针对使用C或C ++的Unix环境提出的。举个例子,考虑下面的危险小块:

#include <vector>
int main() {
  int n;
  std::vector<double> A(n);
}

如果你很幸运,代码会抛出一个范围错误。如果你运气不好(在我的情况下,内存中的值是283740392),代码将很快使用所有可用的RAM并导致大量交换到磁盘,将操作系统更快地打磨到虚拟静止然后它就可以被杀死。当然,最终可以最终终止该进程,但通常需要几分钟才能恢复,因为所有其他正在运行的进程必须加载回内存。这是一个问题,其答案意味着缺乏RAM,人们很容易给出一个淹没任何可用机器的失控过程。

4 个答案:

答案 0 :(得分:5)

根据评论中的建议,您可以在开始使用计划之前ulimit -v <size>,也可以在其中以编程方式setrlimit

答案 1 :(得分:1)

在linux中有一些名为'the OOM killer'的东西。它根据内存使用情况和CPU使用历史记录来终止进程。

答案 2 :(得分:1)

您正在寻找setrlimit来电。 Previously.

答案 3 :(得分:0)

一个可能更好但更复杂的答案(比ulimit)是一个自定义分配器,它限制任何给定分配的最大大小(100MB左右),但限制允许的总内存待用..