2011-09-21 165 views
4

我剛剛執行了一個程序,在12 MB計算機(QEMU仿真!)中分配13 MB的malloc。不僅如此,我甚至通過內存瀏覽並填充垃圾...Malloc分配內存超過RAM

void 
large_mem(void) 
{ 
    #define LONGMEM 13631488 
    long long *ptr = (long long *)malloc(LONGMEM); 
    long long i; 
    if(!ptr) { 
    printf("%s(): array allocation of size %lld failed.\n",__func__,LONGMEM); 
    ASSERT(0); 
    } 
    for(i = 0 ; i < LONGMEM ; i++) { 
    *(ptr+i)=i; 
    } 
    free(ptr); 
} 

這怎麼可能?我期待分段錯誤。

+0

哇!只是意識到forloop內部的代碼是錯誤的......仍然仍然...!爲什麼沒有seg故障? – raj

回答

10

它被稱爲虛擬內存它被分配給你的程序。這不是真實你稱爲RAM的內存。

虛擬內存也有最大限制,但它高於內存。它由您的操作系統實施(並定義)。

+0

所以沒有最大限度或什麼? – raj

+0

當我繼續請求操作系統時,新頁面會被換入嗎? – raj

+3

@raj:理論極限由指針的大小決定。實際上,大多數操作系統會比指針大小產生的任何地址空間都給你更少的內存。而且,是的,如果你分配的內存比機器中物理存在的多,你將會交換。 – sbi

4

聽起來像是你的操作系統是swapping pages

分頁是虛擬內存實現的最 現代通用操作系統的重要組成部分,允許他們使用 磁盤存儲不符合數據進入物理隨機存取存儲器(RAM)。

換句話說,操作系統使用一些硬盤空間,以滿足您的13 MB分配請求(在速度的巨大的代價,因爲硬盤是多,比RAM慢得多)。

6

這被稱爲懶惰分配。

大多數Linux操作系統都有一個Lazy Allocation內存模型,其中返回的內存地址是一個虛擬地址,實際分配僅在訪問時發生。操作系統假定它將能夠在訪問時提供此分配。

malloc分配的內存不被真實內存支持,直到程序實際觸及它。

雖然calloc將內存初始化爲0,但您可以確定操作系統已經用實際RAM(或交換)支持分配。

嘗試使用calloc,並且很可能它會使您退出內存,除非您的交換文件/分區足夠大以滿足請求。

+0

哦!我碰他們!看看'for'循環.. – raj

+0

我認爲他的意思是訪問時間。 – raj

+0

@sbi:是的,更正了,謝謝。 –

2

除非虛擬化操作系統具有可用交換功能,否則您遇到的情況稱爲過量使用,它基本上存在是因爲管理具有虛擬內存和需求/寫入時複製頁面的系統中資源的簡單方法是不管理他們。過度使用就像一家銀行借出的資金比實際上多 - 它似乎運作了一段時間,然後事情就崩潰了。建立一個Linux系統時,你應該做的第一件事是用命令解決此問題:

echo "2" > /proc/sys/vm/overcommit_memory 

這只是影響當前運行的內核;您可以通過添加一條線使其成爲永久性的:/etc/sysctl.conf

vm.overcommit_memory=2