2010-09-26 36 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決定你的程序允許使用多少內存。

相關問題