2010-09-25 87 views
2

在C中編寫代碼時,如何知道啓動程序時有多少可用的內存空間?堆空間怎麼樣?現代計算機的堆棧和堆空間

如何判斷程序執行過程中正在使用多少內存?

+0

這裏是關於Windows系統中堆棧大小的一些信息http://msdn.microsoft.com/en-us/library/ms686774%28VS.85%29.aspx – 2010-09-25 13:32:41

回答

2

這是所有的Win32特定的(不是真的C-具體的,一切都只是OS API):

當創建一個線程,它得到1MB堆棧空間默認情況下,可以不管的CreateThread API中進行修改你用。

您可以查看線程信息塊以查找實際的堆棧信息,但即使已記錄此信息,此技術並未得到正式支持,請參閱http://en.wikipedia.org/wiki/Win32_Thread_Information_Block

此外,對於32位應用程序,您最多隻能處理2GB,因此對於設計使用大量內存的應用程序,需要注意的是該進程的虛擬地址的總大小空間(承諾+保留),其中包括所有堆分配。您可以通過GlobalMemoryStatusEx API以編程方式訪問進程的虛擬內存,查看虛擬地址空間的參數ullTotalVirtual。一旦您的流程接近1.8或1.9GB的VAS,堆分配和VirtualAlloc調用開始失敗。對於「正常」應用程序,您不必擔心VAS用完,但檢查失敗分配總是有好處的。另外,除非有錯誤或設計不好,否則不應該發生堆棧溢出。

+0

這非常有幫助,謝謝。這給了我一個起點。 – dvanaria 2010-09-27 04:22:15

2

有一種理念,當你需要提出這些問題時,出於實際而不是教育或信息的原因,那麼你正在做出嚴重錯誤的事情。

如果你是要求這個錯誤檢查或確保你的程序有足夠的內存,等等...那麼不要擔心,認真。至於你的程序內存,如果這只是爲了調試,你可以使用任務管理器(在Windows上)。如果你需要在你的程序中知道這一點,我不會指望任何非hacky的解決方案。

+0

哈,謝謝你的回答。這完全是出於教育原因。我編寫了如此多的C程序,並對內存空間的成本/使用情況有一個模糊的概念,但是想知道專業開發人員如何獲得關於他們的程序如何影響系統的具體想法。 – dvanaria 2010-09-25 12:04:36

+1

另一種哲學是,如果你的程序需要內存,它應該簡單地嘗試分配它並準備處理失敗。明智地分配你的東西總是很好的做法。除非你有一個要求你不能分配超過_x_的內存量,否則它對系統其餘部分的影響確實是一個系統工程問題。另外,不要以爲這個數字是固定的。您的程序可以運行在一個操作系統上,該系統旨在終止優先級較低的進程,以便在優先級較高的進程碰到最高限度時釋放內存。 – Blrfl 2010-09-25 12:49:48

1

抽象的原因 真的,你的程序不應該有這個擔心。這是一個操作系統的問題,你的問題應該只是滿足它的需求並讓操作系統完成它的工作。

如果你堅持,你可以看看/proc/meminfobrk()getrlimit()setrlimit()here are some docs)與近似和粗糙ishes的RLIMIT_STACKRLIMIT_DATA值。

#include <sys/resource.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 

int main (int argc, char *argv[]) 
{ 
    struct rlimit limit; 

    /* Get the stack limit. */ 
    if (getrlimit(RLIMIT_STACK, &limit) != 0) { 
    printf("getrlimit() failed with errno=%d\n", errno); 
    exit(1); 
    } 

    printf("The stack soft limit is %llu\n", limit.rlim_cur); 
    printf("The stack hard limit is %llu\n", limit.rlim_max); 
    exit(0); 
} 

here修改也看到man getrlimit系統

。如果你的狀態什麼爲什麼你想這樣做,可能是有人做你想要什麼更好的方法或途徑。