1

我在使用英特尔编译器 14 工具链安装了 16 GB 内存的 ubuntu 13.04 64 位下运行以下示例代码。

在我的应用程序在某个特定点分配后,我遇到了关于系统的问题(“做一些害羞的事情..”)。在解决了几个小时的问题后,我开始意识到我在那个时候分配了 8GB 的​​内存这一事实不允许我进一步使用 system() 命令。

不用说,在我分配内存之前,我可以自由使用系统。

代码片段:

#include <string.h>
#include <iostream>
#include "stdlib.h"

int main() {
char ** buffer = new char*[100];

system("logger TRYING..!");
for(int i= 1; i<=80; i++)
{
   buffer[i] = new char[200*1000*1000];
}

system("logger SUCCESS..!");

return 0;
}

谢谢您的帮助..!

4

1 回答 1

2

system调用fork,这实际上将使您的进程所需的 RAM 增加一倍。由于您使用的是 8 GB 并且只有 16 GB,因此您没有足够的空间,并且fork失败了。也就是说,fork是通过写时复制页面实现的,这意味着如果您不更改子进程的内存,则 RAM 实际上不会被复制。在这种情况下,您不会写入该内存,但操作系统不知道,因此fork失败。您应该通过检查system(-1 if forkfailed) 的返回值来确认这一点。

您可能会尝试启用过度使用内存以允许您“过度使用内存”。这应该让fork成功。在您的情况下,我可能只会暂时启用它。

# Enable overcommit
echo 1 > /proc/sys/vm/overcommit_memory

# Disable overcommit
echo 0 > /proc/sys/vm/overcommit_memory
于 2014-09-02T13:37:39.367 回答