2013-07-06 81 views
1

即使物理RAM小於3 GB,這個有趣的代碼也總是在Linux系統中分配3 GB的內存。爲什麼這種內存分配的怪異行爲

怎麼樣? (我在我的系統中的2.7 GB的RAM和該代碼分配3.054 MB內存!)

#include <stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 
    int main(int argc, char *argv[]) 
    { 
     void *ptr; 
     int n = 0; 
     while (1) { 
      // Allocate in 1 MB chunks 
      ptr = malloc(0x100000); 
      // Stop when we can't allocate any more 
      if (ptr == NULL) 
       break; 
      n++; 
     } 
     // How much did we get? 
     printf("malloced %d MB\n", n); 
     pause(); 
    } 
+0

您是否啓用了交換文件/分區? – user2422531

+0

@ user2422531:我有,但我禁用了交換,但仍然得到了相同的結果。 – Inquisitive

+0

在OS下查找網絡上的虛擬內存。 – 0decimal0

回答

1

默認情況下,在Linux中,在實際嘗試修改它之前,實際上並沒有獲得RAM。你可能會嘗試修改你的程序如下,看看它是否死亡越快:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int main(int argc, char *argv[]) 
{ 
    char *ptr; 
    int n = 0; 
    while (1) { 
     // Allocate in 4kb chunks 
     ptr = malloc(0x1000); 
     // Stop when we can't allocate any more 
     if (ptr == NULL) 
      break; 
     *ptr = 1; // modify one byte on the page 
     n++; 
    } 
    // How much did we get? 
    printf("malloced %d MB\n", n/256); 
    pause(); 
} 

如果你有足夠的交換,但RAM不足,那麼這段代碼將開始顛簸嚴重的交換文件。如果您的交換空間不足,它可能會在到達結尾之前崩潰。

正如其他人指出的那樣,Linux是一種虛擬內存操作系統,當機器內存少於應用程序請求時,它將使用該磁盤作爲後備存儲。您可以使用的總空間是由三個方面的限制:

  • 分配掉
  • 虛擬地址空間的大小由ulimit
徵收
  • 資源限制的內存和硬盤的組合量

    在32位Linux中,操作系統爲每個任務提供3GB的虛擬地址空間來播放。在64位Linux中,我相信這個數字是100兆兆字節。不過,我不確定默認的ulimit是什麼。因此,找到一個64位系統,並嘗試修改後的程序。我想你會在一個漫長的夜晚。 ;-)

    編輯:這是默認值ulimit我64位的Ubuntu 11.04系統上:

    $ ulimit -a 
    core file size   (blocks, -c) 0 
    data seg size   (kbytes, -d) unlimited 
    scheduling priority    (-e) 20 
    file size    (blocks, -f) unlimited 
    pending signals     (-i) 16382 
    max locked memory  (kbytes, -l) 64 
    max memory size   (kbytes, -m) unlimited 
    open files      (-n) 1024 
    pipe size   (512 bytes, -p) 8 
    POSIX message queues  (bytes, -q) 819200 
    real-time priority    (-r) 0 
    stack size    (kbytes, -s) 8192 
    cpu time    (seconds, -t) unlimited 
    max user processes    (-u) unlimited 
    virtual memory   (kbytes, -v) unlimited 
    file locks      (-x) unlimited 
    

    所以,似乎沒有對任務的默認內存大小限制。

  • 2

    當機器用完物理內存來解決他們可以使用的硬盤空間來「充當RAM」。這是顯着的減少,但仍然可以完成。

    一般有幾個層次機器可以用它來獲取信息:

    1. 緩存(最快)
    2. RAM
    3. 硬盤(最慢)

    它會盡可能快地使用,但正如您指出的那樣,有時需要使用其他資源。

    相關問題