2012-10-20 32 views
4

可能重複:
Can you allocate a very large single chunk of memory (> 4GB) in c or c++?爲什麼我只能在具有16 GB RAM的計算機上分配2 GB?

我正在我的電腦上下面的程序:

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

#define ONE_GIGABYTE 1024*1024*1024 


int main(void) { 
    int ctr=0; 

    for (;;) { 
     char *ptr = (char*)malloc(ONE_GIGABYTE*sizeof(char)); 
     if (ptr == 0) 
      return -1; 

     ctr++; 
     printf("%d\n", ctr); 
    } 
} 

[email protected]:~/weirdstuff$ ulimit -a 
core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 128957 
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) 128957 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 
[email protected]:~/weirdstuff$ free -g 
      total  used  free  shared buffers  cached 
Mem:   15   6   8   0   0   4 
-/+ buffers/cache:   2   13 
Swap:   9   0   9 
[email protected]:~/weirdstuff$ clang malloc-program.c 
[email protected]:~/weirdstuff$ ./a.out 
1 
2 
[email protected]:~/weirdstuff$ 

這到底是怎麼回事?

+3

您使用的是32位還是64位操作系統? – liori

+0

哎。顯然這是一個32位系統。謝謝。 –

回答

4

你不會運行內存,您是在32位系統上運行,因此也用完了地址空間,你可以合理地希望能夠因爲32位系統上分配的4Gb:

2^32 = 4Gb

但是,在大多數操作系統中,至少有50%的可用地址空間實際上是爲內核使用的,因此您只能擁有其中的一半。

在Linux上,通過切換爲使用PAE kernel,可以在32位模式下使用顯着多於4Gb的數據。如果您需要PAE內核,許多Linux發行版將提供PAE內核。

編輯:正如Dietrich所說:PAE允許使用更多的內存,但仍然只能提供4 GiB的地址空間。所以用16 GiB你可以有8個程序與2 GiB每個,但你仍然不能有一個程序超過2 ish GiB

+3

這應該澄清:PAE允許使用更多的內存,但仍然只能提供4 GiB的地址空間。因此,使用16個GiB,您可以擁有8個程序,每個程序有2個GiB,但仍然不能有一個程序的GiB超過2個。 (編譯內核時,也可以配置高內存截止點。) –

+0

@DietrichEpp好點,編輯。 – Benj

1

@Benj提供了一個很好的答案這個問題。但是,我想補充一點,即使用戶使用64位系統,如果程序是使用面向32位系統的編譯器編譯的,他仍然可以使用僅2GB的內存。

64位系統通常支持32位程序。但32位系統無法運行64位系統。因此,如果作者選擇,那麼不希望佔用2GB內存的程序可能會被編譯爲32位系統。而且,32位目標通常是默認設置,即使在64位系統上也是如此。

相關問題