2011-07-23 111 views
1

對進程來說HEAP是本地的嗎?換句話說,我們有一個堆棧,它始終是一個進程本地的,對於每個進程它是分離的。這同樣適用於堆嗎?另外,如果HEAP是本地的,我認爲HEAP大小應該在運行時改變,因爲我們要求CPU佔用越來越多的內存,那麼誰會對需要多少內存提出上限?內存管理和進程

回答

1

'heap'是本地的一個進程,但它是在線程之間共享,而堆棧不是,它是每線程。

關於限制,例如在linux中,它由ulimit(參見手冊頁)設置。

2

堆確實是本地的過程。操作系統放置限制。存儲器也可能受到用於尋址的位數的限制(即,32位只能一次尋址內存的 2G)。

+0

4GB ...不只是2GB – yankee

+0

啊是的,2^32 = 4GB(除非當然是簽名:P) –

1

在一個現代化的,先發制人的多任務操作系統,每個進程都有自己的地址空間。它可以看到的一組內存頁面與其他進程可以看到的頁面是分開的。因此,每個進程都會看到自己的堆棧和堆,因爲堆棧和堆只是內存區域。

在一個較老的多任務操作系統上,每個進程共享相同的地址空間,因此堆在所有進程之間有效共享。

堆由其中的東西的集合定義,所以堆大小隻隨內存分配和釋放而改變。無論操作系統如何管理內存,情況都是如此。

的多少內存,還可以要求內存管理器確定的上限。在沒有虛擬內存的機器中,最高限制僅僅是計算機中安裝了多少內存。使用虛擬內存時,上限由物理內存加上磁盤上交換文件的大小來定義。

2

是的,在現代操作系統存在用於每個進程的單獨堆。順便說一下,不僅每個進程都有一個單獨的堆棧,還有一個單獨的堆棧用於進程中的每個線程。因此一個過程可以有相當多的獨立堆棧。

但並不是所有的操作系​​統,而不是所有的硬件平臺上提供此功能。您需要一個內存管理單元(硬件)才能正常工作。但是臺式電腦從那時起就具備了這個功能......嗯......一段時間後...... 386-CPU? (如果你知道的更好,請發表評論)。您可能會發現自己處在某種不具備該功能的微處理器上。

無論如何:堆大小的限制主要受操作系統和硬件的限制。硬件限制,特別是由於它允許的有限數量的地址空間。例如,32位CPU的地址不會超過4GB(2^32)。具有物理地址擴展(PAE)的CPU(目前的CPU支持)可以處理高達64GB的內存,但這是通過使用段來完成的,單個進程將無法使用此功能。它總是會看到4GB的最大值。

此外,操作系統可能會限制它認爲合適的內存。在Linux上,您可以使用ulimit命令查看並設置限制。如果您不是以本機方式運行某些代碼,而是在解釋器/虛擬機(例如Java或PHP)中運行代碼,那麼該環境可能會額外限制堆大小。