2010-09-26 38 views
1

只是为了测试,我跑这个代码如何限制我的C代码可访问的内存量?

#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;线。

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

例如,有没有办法告诉我的程序使用atmost一半的存储系统(其中二是运行系统)上可用,但没有更多?

所以,如果我的程序的机器上8GB的内存运行,它可以使用4GB的最大值,但如果程序有256MB的机器上运行,只有128MB应该是对程序可用。

此外,我想从我的程序中这样做,而不是控制使用某些外部实用程序的可用内存量。

回答

2

它通常被认为是侮辱性的程序来尝试检测量机器上的物理内存并使用它的某个部分。如果10个程序每个都认为他们有权使用机器内存的一半呢?

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

+0

我同意,在这种情况下,对于有多少内存“没问题”做出不合格的猜测是没有意义的。 – 2010-09-27 06:29:28

0

如果你是在Linux上,你可以分析在启动文件/proc/meminfo找出系统中有多少内存:

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

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

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

相关问题