概念
套用中的描述
物理記憶體,在套用中,自然是顧名思義,物理上,真實存在的插在主機板記憶體槽上的記憶體條的容量的大小。看計算機配置的時候,主要看的就是這個物理記憶體。
物理記憶體是計算機上的最重要的資源之一。Windows的記憶體管理器負責給活動進程、設備驅動,和作業系統自己分配記憶體。因為絕大多數系統所能訪問的數據和代碼遠比物理記憶體多,所以從本質上來說,物理記憶體是代碼和數據在其中運行的視窗。所以記憶體容量對性能有影響,因為如果進程或者作業系統所需的代碼或者數據不存在,記憶體管理器就需要從磁碟中讀取這些內容。
CPU中的描述
物理記憶體,CPU的地址線可以直接進行定址的記憶體空間大小。比如8086隻有20根地址線,那它的定址空間就是1MB。我們就說8086能支持1MB的物理記憶體。即使我們安裝了128M的記憶體條在板子上,我們也只能說8086擁有1MB的物理記憶體空間。同理32位的386以上CPU,就可以支持最大4GB的物理記憶體空間了。
虛擬記憶體與物理記憶體的區別:虛擬記憶體就與物理記憶體相反,是指根據系統需要從硬碟虛擬地勻出來的記憶體空間,是一種計算機系統記憶體管理技術,屬於電腦程式,而物理記憶體為硬體。因為有時候當你處理大的程式時候系統記憶體不夠用,此時就會把硬碟當記憶體來使用,來交換數據做快取區,不過物理記憶體的處理速度是虛擬記憶體的30倍以上。
意義
除了會對性能造成影響,物理記憶體的容量還會影響其他資源。例如,對於非分頁池來說,這是由物理記憶體提供後備的作業系統緩衝,很明顯,其容量會受到物理記憶體的限制。物理記憶體也會對系統的虛擬記憶體限制有影響,虛擬記憶體的大小等於物理記憶體容量、再加上所有頁面檔案的最大容量。物理記憶體還會對進程的最大數量具有間接的影響,筆者將會在今後的文章里專門提到執行緒和進程的限制。
Windows對於物理記憶體的支持,要受到諸如硬體限制、許可、作業系統數據結構,以及驅動程式的兼容性等方面的綜合影響。MSDN網站的MemoryLimitsforWindowsReleases文章對不同Windows版本、以及同一個版本的不同SKU的限制進行介紹。
我們可以查看所有Windows版本的不同SKU的物理記憶體支持許可。例如,32位WindowsServer2008標準版僅支持4GB,而32位WindowsServer2008數據中心版支持64GB。類似的,64位WindowsServer2008標準版支持32GB,而64位WindowsServer2008數據中心版支持2TB。目前來說,並沒有多少系統擁有2TB記憶體,不過WindowsServer性能產品組知道有兩台伺服器擁有那么多的記憶體,其中一台位於某地的實驗室。該伺服器的任務管理器如下圖所示:
微軟工程師
32位的最大限制是128GB,WindowsServer2003數據中心版可以支持,這是因為在大記憶體的系統上,記憶體管理器用來追蹤物理記憶體的結構,需要消耗更多系統虛擬地址空間。記憶體管理器把每個記憶體頁的追蹤數據保存在叫做PFN資料庫的數組中,而且考慮到性能因素,會把整個PFN資料庫映射到虛擬記憶體中。因為它用28位元組的數據結構來代表每個記憶體頁,128GB系統的PFN資料庫需要將近930MB的空間。32位Windows擁有4GB的虛擬地址空間,由硬體所定義,默認劃分為兩半,其中一半供用戶模式進程(例如Notepad)所使用,另一半供系統所使用。因此980MB的容量就要占據將近一半的系統虛擬地址空間(共2GB),只剩下約1GB空間可以用來映射核心、驅動程式、系統快取和其他系統數據結構:
記憶體限制
64位Windows客戶端,不同SKU的記憶體支持也有所不同,WindowsXPStarter版的記憶體支持最低,僅512MB,而WindowsVista旗艦版的記憶體支持最高,可達128GB。但是所有版本的32位Windows客戶端SKU,包括WindowsVista、WindowsXP和Windows2000Professional,最大支持4GB物理記憶體。標準的X86記憶體管理模式,最大可以支持4GB的物理地址訪問。在早期,並不需要考慮在客戶端提供超過4GB的支持,因為當時很少有計算機配備那么高的記憶體,哪怕是伺服器。
但是在WindowsXPSP2開發的過程中,已經可以預見客戶端計算機將會配備超過4GB的記憶體,所以Windows產品組對超過4GB的WindowsXP計算機進行大量的測試。WindowsXPSP2還支持物理地址擴展(PAE)功能,該功能本來是為了在硬體上實現非執行(NX)保護,因為這是數據執行保護(DEP)的必要條件,但是該功能還可以支持超過4GB的記憶體。
Windows產品組的工程師發現,很多測試計算機會發生崩潰、掛起或者無法啟動的故障現象,這是因為某些設備驅動程式所導致的,主要是一些客戶端計算機(而非伺服器)上的顯示卡或者音效卡,其驅動程式在編寫時沒有考慮到記憶體大於4GB的情況。所以,這些驅動程式會截去那部分地址,從而導致記憶體衝突以及其他副作用。而伺服器則通常會配備更加常規的硬體設備,其驅動程式更加簡單穩定,因為通常來說碰到這些問題的幾率很小。由於客戶端設備驅動程式所存在的這些問題,迫使Windows客戶端SKU只能忽略高於4GB的那部分物理記憶體,哪怕從理論上來說可以對其進行定址。