Recent Comments

2008年1月30日 星期三

stack、heap、swap

在C++裡, int p[labl][labw], 這種陣列是屬於在動態陣列和靜態陣列之間的一種陣列. 原因是此陣列讓你在執行時宣告其大小(靜態陣列要在寫時宣告其大小)但宣告其大小過後卻不能改變其大小(動態陣列可改). 在電腦裡有兩種記憶體, 一是stack, 另一種是heap. stack是所有變數所在的地方. heap是所有new和malloc()回傳的記憶體所在的地方. 一般來講, 靜態陣列是存在於stack而動態陣列是存在於heap. 而這種陣列的記憶體是存在於stack. 當你把labl和labw設為1000時, p的大小是1000*1000*sizeof(int) = 1000*1000*4 = 4,000,000. 所以當在執行這程式時當執行到int p[labl][labw], 電腦要從stack中拿出4,000,000個記憶體時因stack裡沒這麼多記憶體, 所以出錯. 如果你改成用動態陣列則無此問題. 因動態陣列是用heap而不是stack. heap比stack大. 不過雖然heap比stack大, 但仍有其限制.

在kernel space不可能超過heap的極限的. 因在將近heap的極限時會thrashing(電腦會變的很慢). 不過在user space(你在user space), 也很難超過. 對初學者來說根本不可能. 因為heap的極限跟你的paging space和physical memory有關. 若將近heap的極限時也會thrashing(電腦會變的很慢).

在 Linux 上的 『Swap 空間』是在當實體記憶體(RAM)用完時才會使用到,假如系統需要更多的記憶體資源,而實體記憶體已經用完,記憶體上不活動的頁面將會被移到 swap 空間。 雖然 swap 空間可以幫助系統增加一小部份容量的 RAM,不過不能將它當作更多記憶體的替代品。 Swap 空間是位於硬碟上,它的存取速度比起實體記憶體慢了很多。

0 意見: