2016-08-03 149 views
-1

在下面的鏈接中,Sdaz MacSkibbons給出的答案給出了虛擬地址系統上的進程地址空間的簡要概述。虛擬地址系統上的進程地址空間

What happens when a computer program runs?

現在假設每個進程都有4GB的虛擬地址空間。現在這是否意味着這個虛擬地址空間的頂部地址將會得到堆棧部分(假設堆棧地址從0開始),並且從底部開始的地址空間將被分配給文本,數據,全局變量和堆。由於堆的大小發生變化,新的malloc分配會將虛擬地址空間頁面直接映射到實際內存,還是會檢查以前分配的虛擬地址頁是否空閒/可用。如果我們需要大量的堆內存(如大於4GB),而不是流程如何支持這些內存,那麼如何?

在此先感謝。

+0

取決於操作系統。用%p創建一個C程序,用於打印出局部變量(stacK)與分配(malloc())變量的地址,靜態變量的地址(程序數據),函數地址(指向函數的指針),地址......。部分虛擬地址空間用於操作系統。還有一些與每個正在運行的線程相關的數據(如rand()的種子值)(FS或GS段寄存器可以用來訪問它,或者它可以被映射到虛擬地址空間中)。 – rcgldr

回答

1

你鏈接到的答案只是簡單地表明事情可以完成的方式。

假設你有一個邏輯4GB的地址空間,並不是所有這些地址空間都是有效的,甚至可能是有效的虛擬地址。

該邏輯地址空間的一部分將專用於該系統。系統不太可能使用或接近使用專門用於它的整個邏輯地址範圍。

邏輯地址空間中還有其他區域沒有有效的邏輯地址。

接下來,將內存描述爲堆棧和堆棧會引起誤解。堆和堆棧只是讀/寫內存。它們沒有什麼特別之處,操作系統並不關心內存的用途。

思考程序段作爲是: - 可執行文件,只讀 - 不執行,讀/寫 - 不執行,只讀

你的第二個問題是關於malloc的。 Malloc實現管理讀/寫內存池。 Malloc嘗試通過從池中返回內存來處理內存請求。如果沒有足夠的可用內存,malloc將通過將更多虛擬內存映射到邏輯地址空間來增加池的大小。

如果應用程序需要分配大量內存,它們通常不使用malloc。他們改爲操作系統服務。如果您有4GB的地址空間,則不能分配大於4GB的塊。