2017-07-30 33 views
1

我的教授經常說,我們只能使用4 GB RAM中的2 GB,因爲操作系統使用了另外2 GB。但是,在運行某些測試時,我發現使用函數時,只能使用4 GB的虛擬內存空間來分配最多不到2 GB的內存空間。爲什麼(我預計它會超過3 GB)?爲什麼我只能在4 GB的虛擬內存空間上分配2 GB?

據我所知,堆棧,數據和代碼段只使用少量的內存。我的一位朋友告訴我,其他2 GB被操作系統使用,就像教授說的那樣。但是,我認爲教授意味着2 GB的physical memory。這不是在這個過程的virtual memory。 任何人都可以解釋這裏發生了什麼?謝謝。

一些信息:

物理內存:4GB。

虛擬內存:4GB。

操作系統:Windows 10

+0

通過更改Windows啓動時的讀取方式,您可以達到約3GB https://blogs.technet.microsoft.com/askperf/2007/03/23/memory-management-demystifying-3gb/ –

+0

您是否正在使用64位操作系統和編譯器? –

+0

@ M.M我使用64位操作系統並在32位編譯。 – Rickie

回答

4

你的教授是正確的 - 2 GB的虛擬內存是內核內存。 這樣,當發生上下文切換時,這2 GB可以保留,只有其他2個需要交換。它有助於表現。

您還可以參閱here Microsoft的解釋,包括解釋如何將用戶部分增加到3 GB。

順便說一下,64位機器的情況不同,虛擬內存更大。

3

它與RAM沒有任何關係,VirtualAlloc()中的虛擬沒有說謊。當然,較高的2GB是爲操作系統保留的,它需要的最大塊是文件系統緩存和視頻內存光圈。後者是/ 3GB啓動選項不再起作用的更大原因。正如你發現的那樣,你永遠無法獲得完整的2GB,你的程序也需要地址空間,並始終是第一個。它在被OS加載器加載時得到它,剩下的可以被VirtualAlloc分解。

通常小於2 GB,地址空間往往會被加載的DLL碎片化。請注意,即使您沒有鏈接其導入庫,反惡意軟件和雲存儲實用程序可能會注入它們,您也可能會使用它們。程序中的任何堆分配也會導致分裂。

這些問題越來越嚴重,所有現代化的機器啓動64位操作系統。一個32位程序現在在仿真器中運行,操作系統不再需要高端範圍。通過鏈接/LARGEADDRESSAWARE linker option,您現在可以獲得更接近4GB的空間。這個選項本身給了你一個很好的暗示,爲什麼他們最初決定把這樣的地址空間分開被認爲是一個好主意。也是在64位操作系統中採用的方法。

相關問題