2010-10-31 34 views
3

我是C中的一個新手,我想知道應用程序允許的最大內存。 所以我寫了一個像下面這樣的小程序。C - 想知道程序中最大可分配的內存大小

我有一臺機器,總共有16GB的內存,使用2GB,14GB是免費的。 我預計這個程序停止在14GB左右,但它永遠運行。

想在這裏做錯嗎?

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

int main(){ 
    long total = 0; 
    void* v = malloc(1024768); 

    while(1) { 
     total += 1024768; 
     printf ("Total Memory allocated : %5.1f GB\n", (float)total/(1024*1024768)); 
     v = realloc(v, total); 
     if (v == NULL) break; 
    } 
} 

編輯:在CentOS 5.4 64位上運行該程序。

+0

只是FYI,如果你傳入一個NULL地址,'realloc'就會像'malloc'一樣行,所以你可以重寫你的代碼來排除第一個'malloc'並將'printf'移到'if v == NULL)'檢查。 – 2010-10-31 02:22:44

+0

並且就此而言,循環應該簡單地運行'while(v!= NULL)'或者可能更濫用'while(v)'(最後不需要if/break) – 2010-10-31 02:24:31

+0

請注意總連續可分配空間將比碎片化的小。還要注意,如果ASLR被激活,它可能會從運行到運行。 – ruslik 2010-10-31 02:30:10

回答

5

在大多數現代操作系統中,內存分配給每個使用的頁面,而不是分配給每個「保留」的頁面。你的代碼不使用任何頁面,所以沒有真正分配內存。

嘗試清除您分配的內存memset;最終該程序將崩潰,因爲它不能再分配頁面。

我試圖找到這個引文,但我沒有成功。對此表示讚賞!

+0

是的,但它佔用地址空間。這是32位操作系統的問題。 – ruslik 2010-10-31 02:38:22

+0

+1,我同意,在運行此程序時看不到內存使用情況。 – allenhwkim 2010-10-31 02:40:59

+0

Linux在內存過量使用方面聲名狼借:它只是提供儘可能多的內存來滿足應用程序的要求。然後,當應用程序實際嘗試*使用*該內存時,它(或其他一些隨機應用程序)將在缺少情況下被殺死。不過,這可以重新配置。 – zvrba 2010-10-31 07:18:41

4

想在這裏做錯嗎?

那麼你說你正在運行應用程序的機器有16GB的RAM,所以我打算假定它是64位的。這意味着您的應用程序在耗盡1 /物理內存和2 /虛擬內存之前會運行很長時間。

在32位Windows上,您的應用程序將停在4GB。在64位Windows上,您的應用程序將停止在16TB(假設您有一個可自動增長的頁面文件,以及那麼多的硬盤空間)。

http://support.microsoft.com/kb/294418

情況因人而異與其他操作系統。

編輯ruslik指出,在實踐中,你的程序將無法分配內存高達2GB或3GB(取決於你的二進制文件是如何編譯)在32位Windows。從上面鏈接的知識庫文章中,您的進程將佔用的最大內存爲3GB或4GB,其中1GB屬於您不能使用的操作系統。

+2

+1和13個字符 – slezica 2010-10-31 02:23:03

+2

在Win32上,它將停在<2GB(或3GB某些版本的3GB開關激活)。 – ruslik 2010-10-31 02:27:25

+0

我會說在16GB機器中分配1TB的內存不是一個好主意。除了使用sysconf函數之外,有沒有辦法從C編程中獲得14GB的數字? – allenhwkim 2010-10-31 02:39:06

0

如果你在一個特定的平臺/操作系統上,你應該使用報告功能,特定於該操作系統。

如果你是跨平臺的程序,你不應該依賴任何可用的內存檢查算法。原因是:

  1. 由於自己的原因:操作系統可能會拒絕提供所有可用內存:碎片,分配限制等。
  2. 操作系統可能並不真正給內存,只是分配空間,如果它有VMM。
  3. 算法可能會改變MM的內部狀態,因此調用前後可用的內存可能會有所不同。
  4. 由於OS並行運行多個進程,可用內存可能會由於其他進程活動而異常改變。
相關問題