2011-12-17 40 views
7

在32位機器上,每個進程都獲得4GB的虛擬空間。在這種情況下,人們可能擔心我們可能會因分散而面臨麻煩。但是在64位機器的情況下,我們理論上具有巨大的可尋址虛擬內存,那麼爲什麼在64位機器中內存碎片仍然是問題(如果是)?爲什麼64位機器上的內存碎片問題?

+2

這在64位操作系統上不是問題。 – 2011-12-17 09:55:30

+0

不應該這個評論是答案嗎?現有的答案似乎暗示這是64位的問題 – paulm 2016-08-31 13:45:33

回答

5

您嘗試訪問的每個虛擬地址都由操作系統映射到物理內存。物理內存以頁面分配(例如4K大小)。如果管理分配一個字節偏移量1000000 * n和做到這一點對於n從1到1000000(我想你可以做到這一點與MMAP),那麼操作系統將需要備份與物理百萬內存,這就像4G。該物理內存將不能用於其他任何事情。如果您連續分配了這些字節,那麼對於您的百萬字節,您只需要大約1M的物理內存(256頁)。

如果您爲合法原因分配4G,然後釋放其中的部分內容,保留每頁分配位置,您可能會遇到類似的不利情況。由於沒有完全免費的物理頁面,操作系統將無法真正重用已釋放的內存。所以這是一個分裂問題。

理論上,你可以想象虛擬地址1000000和2000000會映射到物理內存的同一頁面,避免了碎片。但在實踐中,出於很好的理由,虛擬內存映射是逐頁完成的。你可以在這裏閱讀更多關於它的信息:http://en.wikipedia.org/wiki/Page_table

0

因爲所有的內存都是「浪費」的,所以考慮一個應用程序,其中有很多內部碎片。該過程需要更多的內存頁面,因爲工作集現在分散在內存中,這意味着其內存佔用量要高得多。如果這個應用程序爭用RAM中的物理插槽(對於典型的家庭設置,機器實際上只有大約4-8GB的RAM),那麼它會導致更多的頁面交換。一般而言,您希望減少應用程序內存佔用量,以避免內存壓力和與其他應用程序的爭用。

有些情況下,雖然它並不重要,但它不會殺死您在這裏或那裏使用額外的兆字節,但它會累積在更大的應用程序中。這取決於情況,根據你所編碼的內容或你的項目的目標是否有儘可能少的碎片是重要的。

+0

但是「內存碎片」呢?對此的迴應應該可能涵蓋malloc,操作系統和硬件因素如何分配和映射虛擬內存...... – 2011-12-17 04:54:53