如何限制我的C代码可访问的内存量?

时间:2010-09-26 11:27:56

标签: c memory memory-management

为了测试,我运行了这段代码

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>

int main() {

    int **ar = (int**) malloc(100000000* sizeof(int*));

    int i;
    for(i = 0; i<10000000; i++) {
        ar[i] = (int*) malloc(1000 * 4);
        ar[i][123] = 456;
    }

    usleep(3000000); usleep(3000000);
    usleep(3000000); usleep(3000000);
    usleep(3000000); usleep(3000000);

    return 0;
}

内存使用情况图如下(底部粉红色图表跟踪内存)。

alt text

虽然此程序内存不足,但是由于malloc行,更多内存要求会导致ar[i][123] = 456;失败,然后导致分段错误。

我想通过我的程序限制内存分配,但也不想静态绑定我的程序。

  

例如,有没有办法告诉我的程序使用系统中可用内存的几乎一半(运行二进制文件的系统),但是没有更多?

因此,如果我的程序在具有8GB内存的计算机上运行,​​则最多可以使用4GB,但如果程序在256MB的计算机上运行,​​则该程序只能使用128MB。

另外,我想在我的程序中执行此操作,而不是使用某些外部实用程序控制可用内存量。

3 个答案:

答案 0 :(得分:2)

通常认为程序试图检测机器上的物理内存量并使用其中的某一部分是滥用的。如果10个程序都认为他们有权利用机器的一半内存怎么办?

处理大量数据的更好方法是在磁盘上使用它,并依靠操作系统的文件系统缓存,以一种对多个进程公平的方式最佳地利用机器的物理内存。 / p>

答案 1 :(得分:2)

我很惊讶没有人提到ulimit,这是在UNIX平台上的方法。

如果您需要编程解决方案,请使用自定义函数包装malloc()free()调用,并跟踪已分配的内存量。有一个用户可以设置的命令行参数(或环境变量,配置文件设置等),以允许THEM决定允许您的程序使用多少RAM。

答案 2 :(得分:0)

如果您使用的是Linux,则可以在启动时解析文件/proc/meminfo,以了解系统有多少内存:

$ cat /proc/meminfo
MemTotal:         505872 kB
MemFree:           70332 kB
...