1. 程式人生 > >32位,64位和記憶體的那點事

32位,64位和記憶體的那點事

這兩天果殼上有些人問到了關於在32位系統下使用4G或以上記憶體的問題。對於“32位作業系統能否使用4G或以上的記憶體”這個問題,在網路上爭論也是很多。下面,我就我自己對作業系統記憶體分配的理解,談談我的觀點。

         32位、64和“最大記憶體量”是怎麼回事

     首先需要明確一下,32位也好,64位也好,這個概念是同時存在於軟體、系統、主機板晶片組和CPU四個方面的。對於作業系統到底最多能支援多少記憶體這個問題,其實不是作業系統一方面說了算的。

     目前不少人可能對於CPU的定址概念有些模糊,認為CPU的定址範圍與其平常概念上的位寬直接聯絡,即所謂的32位CPU定址範圍為2^32,64位的則是2^64。其實這是一個錯誤的概念,對於CPU來說,這個的位寬一般是指是其資料匯流排位寬,和定址能力並無直接聯絡。至於一個CPU的定址位寬是多少則要看其具體的設計。

     而對於主機板晶片組這方面來說,目前的Intel x86平臺採取的是記憶體對映技術(Memory-Mapped I/O, MMIO),也是PCI規範的一部分,也就是將I/O裝置放置在記憶體空間而非I/O空間,從處理器和作業系統看來,訪問一個硬體也就是訪問記憶體空間,因此主機板的晶片組也存在一個定址位寬的問題,當然也有可能成為記憶體總量的一個瓶頸。當然了,現在的新主機一般都不會有這個問題了。

     說完了硬體層面的概念,我們繼續看作業系統是如何與CPU進行“交流”的:

     Windows對於記憶體的管理,採取的是分頁機制,每個程序都佔有一定的虛擬地址空間,在這個機制下,這個空間一部分被對映到實體記憶體,一部分對映到虛擬記憶體(存在於硬碟上的一個或多個空間),還有一部分則可能什麼也沒有對映。同時,在CPU中,會設定一個“分頁標誌位”,如果CPU在執行指令時發現這個分頁標誌被設定,則會根據頁目錄和頁表中的對應關係,將指令中的虛擬地址轉換為實際的實體地址。

     目前的32位系統分頁大小為4K,定址位寬為32位,因此,第0個分頁的地址是0x00000000,第1個分頁地址從0x00001000開始,以此類推。所以,在目前的32位系統中,用到了32位中的高20位來標記物理頁,剩餘的12位用於新增一些標記資訊等。這樣,就可以支援到最大(2^20)*4096=4GB記憶體,除掉我們上面所說的為I/O保留的記憶體對映空間和作業系統本身保留的記憶體,剩下的就是我們在工作管理員裡能看到的可用空間。

上圖顯示的是我的電腦目前的記憶體分配情況

32位系統下的悲劇,這個圖是從網上搜羅來的

如何突破32位系統的4G限制

其實PAE並不是一個新鮮東西,也不是作業系統弄出來的特性

為了對PC伺服器提供大記憶體的支援,Intel採取了實體地址擴充套件(Physical Address Extension, PAE)的技術,將現有的IA32架構的處理器的地址匯流排從32位擴充套件到了36位,這樣從硬體層面來看,可以支援最多64G的記憶體。至於作業系統要如何實現對多出來的這幾位進行記憶體地址對映,簡要的說就是將原有的分頁表結構改成了三層結構。

     根據微軟官方的說法,下述系統支援開啟PAE功能:
          • Windows 7 (32 bit only)
          • Windows Server 2008 (32-bit only)
          • Windows Vista (32-bit only)
          • Windows Server 2003 (32-bit only)
          • Windows XP (32-bit only)
          • Windows 2000 Datacenter Server
          • Windows 2000 Advanced Server

     具體實現步驟可以見微軟官方文章:

http://msdn.microsoft.com/en-us/library/aa366796%28v=vs.85%29.aspx

     在這裡,推薦大家用一個叫Ready4GB的小程式,可以自動完成改造工作。

          開啟PAE的相容性問題和收益

     關於開啟PAE以後的相容性問題和是否有效可能是大家最為關心的問題了,根據微軟官方的說法,PAE開啟後,可能會造成部分驅動程式的相容性出現問題。事實上根據我自己的體驗,本人的NV 540M雙顯示卡就無法正確工作在PAE模式下,查證後發現所有的Nvidia的雙顯示卡都是不支援PAE的,網路上也有少數人反應開啟PAE後會造成藍屏等現象,是否有相關性尚無明確驗證。所以具體情況要嘗試後才能確定了。

     說到收益,網路上是眾說紛紜,很多人認為即便開啟了PAE,單個32位程式也無法分配到超過4G的空間,因此無效。

     先簡要了解一下應用程式執行時的記憶體使用情況是什麼樣的:因為不同使用者使用環境不會完全一樣,很顯然應用程式的開發人員不可能在設計階段去確定這個程式有多少記憶體空間可以使用。所以,正如前文所述,現在的應用程式執行時,都會分配到一個“虛擬”的記憶體空間,所有的記憶體請求都是在這個虛擬地址內完成的,然後再根據具體的記憶體對映關係,將這些虛擬地址轉換為具體的記憶體地址,或者是上的硬碟空間,在這些地方讀寫具體的資料。

     因此關於上述說法,前半句是對的,對於普通的32位程式來說,無論工作在何種環境下,其始終都只能分配到最多4G虛擬記憶體地址(0x00000000-0xFFFFFFFF),而這4G記憶體,其中有2G是作業系統保留的核心記憶體,另外2G才是程式的自由空間。這是32位程式的機制所決定的,即便我們將這些程式拿到現有的64位系統下執行,它們也只能分配到4G記憶體,2G可用記憶體。

應用程式記憶體分配示例

但是上述機制的存在絕不代表這PAE對於整個作業系統的效能沒有幫助,更多的記憶體有利於作業系統對多工進行記憶體分頁,可以提高系統在多工下的表現。總之,單個程式不能利用超過4G記憶體,不代表整個系統不能完全利用。

     另外,對於支援PAE的幾個系統來說,它們同時還支援另外一項技術:地址視窗擴充套件(Address Windowing Extensions, AWE)。這是一個程式設計時的介面,它可以使得32位程式訪問到超過4GB的記憶體,目前SQL Server是內建支援這項技術的。

     這幾個系統還有另外一個開關:/3GB,這個開關可以使得在給應用程式分配記憶體的時候,僅保留1G的核心記憶體,而將3G的記憶體保留為應用程式可用空間。但是由於這個開關縮減了核心記憶體空間,可能會造成系統的穩定性下降,因此建議還是用AWE功能進行替換。

     最後,我還在網上搜索相關文件的時候發現了一個很有意思的小東西4GB Patch(4GB補丁),這個程式聲稱其能改造普通的32位程式,使之支援2G以上的可用記憶體:http://www.saqqdy.com/computer-skills/64-windows7-system-to-support-32-bit-process-virtual-memory-4g 。

     本人學識粗淺,對作業系統核心瞭解有限。以上內容如有謬誤,還望各位高人給與指點。

相關推薦

3264記憶體

這兩天果殼上有些人問到了關於在32位系統下使用4G或以上記憶體的問題。對於“32位作業系統能否使用4G或以上的記憶體”這個問題,在網路上爭論也是很多。下面,我就我自己對作業系統記憶體分配的理解,談談我的觀點。          32位、64和“最大記憶體量”是怎麼回事   

32/64系統jdk326432/64jdk編譯出來的classeclipse 3264

首先關於32位/64位系統,jdk32位,64位,32/64位jdk編譯出來的class和eclipse 32位和64位的一些對應關係做些說明。 1.32位作業系統不可以裝64位jdk,64位作業系統一般都可以安裝32位jdk,64位jdk是完美髮揮效能的。 2.64位eclipse只能在6

163264作業系統下各型別的長度整理

特別是int相關的型別在不同位數機器的平臺下長度不同。C99標準並不規定具體資料型別的長度大小,只規定級別。作下比較:   (1)16位平臺   char         1個位元組8位 

3264編譯器下c語言資料型別對應位元組數

一、程式執行平臺         不同的平臺上對不同資料型別分配的位元組數是不同的。         個人對平臺的理解是CPU+OS+Compiler,是因為:         1、64位機器也可以裝32位系統(x64裝XP);         2、32位機器上可以有16

c語言資料型別對應位元組數(3264 int 佔位元組數)

一、程式執行平臺         不同的平臺上對不同資料型別分配的位元組數是不同的。         個人對平臺的理解是CPU+OS+Compiler,是因為:         1、64位機器也可以裝32位系統(x64裝XP);         2、32位機器上可以

163264下各種資料型別的長度大小

(1)16位平臺   char         1個位元組8位  short        2個位元組16位  int             2個位元組16位  long         4個位元組32位  指標         2個位元組16位   (2)

資料型別對應位元組數(3264 int 佔位元組數)

一、程式執行平臺      不同的平臺上對不同資料型別分配的位元組數是不同的。      個人對平臺的理解是CPU+OS+Compiler,是因為:       1、64位機器也可以裝32位系統(x64裝XP);       2、32位機器上可以有16/32位的編譯器(XP

NMIFIQ 與arm構架-(1)

微信公眾號 mindshare思享   NMI是Non Maskable Interrupt的縮寫,它是一種不能mask的硬體中斷,主要用於當一些不能恢復的硬體錯誤發生時傳送訊號給CPU。 NMI通常是用在當一般的中斷被軟體(比如OS)mask的情況下需要響應一

NMI FIQ 與arm構架-(2)

微信公眾號 mindshare思享   以下內容會談到: 1.   NMI的使用場景。 2.   在arm上怎麼模擬NMI a.   通過GIC的中斷優先順序模擬 b

ElasticSearch學習9_ES記憶體

“該給ES分配多少記憶體?” “JVM引數如何優化?““為何我的Heap佔用這麼高?”“為何經常有某個field的資料量超出記憶體限制的異常?““為何感覺上沒多少資料,也會經常Out Of Memory?”以上問題,顯然沒有一個統一的數學公式能夠給出答案。 和資料庫類似,E

Android HTTPHTTPS

先看看網路OSI(Open System Interconnect)模型: CA證書是什麼? CA(Certificate Authority)是負責管理和簽發證書的第三方權威機構,是所有行業和公眾都信任的、認可的。 CA證書,就是CA頒發

虛擬記憶體與swap多使用者與單使用者6432

一、虛擬記憶體和swap分割槽: 這兩個概念分別對應windows和linux: windows:虛擬記憶體 linux:swap 在windows中即使實體記憶體沒有用完也會去用到虛擬記憶體,而Linux不一樣 Linux只有在實體記憶體用完的時候才

如何檢視oracle是32還是64LinuxWindows通用

在該資料庫下執行select * from v$version,如顯示“Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bi

ubuntu16 64 編譯64程序32程序

bit dong pan urn 程序 g++ update architect cut 安裝了ubuntu16 64位的系統,想在該環境下用gcc編譯64位和32位的程序 默認已經安裝了64位環境的gcc 1. 首先確認安裝的環境是不是64位的 cocoa@cocoaU

計算機儲存單位以及不同儲存型別所佔位元組32電腦64電腦區別

32位電腦64位電腦區別: CPU一次處理資料的能力是32位還是64位,所謂32位處理器就是一次只能處理32位,也就是4個位元組的資料,而64位處理器一次就能處理64位,即8個位元組的資料。 bit就是:位,也就是我們常說計算機能處理的:01010101; b就是:

3264 CPU、編譯器、作業系統、應用程式、armX86關係

一:arm和X86的區別 arm:對應精簡指令集 X86:對應複雜指令集 arm上的和X86上編譯過的的東西是不能相互使用的,因為指令集不一樣嘛。指令集可以通俗的理解為,溝通語言。arm和X86之間東西不能直接用,類似於一個美國人和一箇中國人各自只說自己的語言,那麼這兩個人是沒法溝通的。

關於VS中區分debug與release3264編譯的巨集定義

在vs程式設計中,常常涉及到32位和64位程式的編譯,怎麼判斷當前編譯是32位編譯還是64位編譯?如何判斷 是debug下編譯還是release下編譯?因為之前用到,這裡記錄一下,省的忘了又要瘋狂的google。 1.判斷是debug編譯還是release編譯。 如

eclipse c +jre開發環境的建立(嵌入式linux64ubuntu32arm板)

1.64位ubuntu安裝使用32位交叉編譯器arm-2010.09需要注意的問題 在使用之前先安裝cross compiler,系統為ubuntu64位系統,安裝之前用的32位的arm-2010.09,該編譯器只能編譯32位程式,因此還需安裝32位的庫,可參考:http://www.o

php開發環境配置(windows+apache+msql+php)wamp不區分32還是64都可以用的

php 配置檔案,需要反註釋掉:extension_dir = "ext" 開啟需要用到的擴充套件,比如mbstring php_mysql 等等 設定時區,比方說設定成上海的時區:     date.timezone = "Asia/Shanghai" 要將php加入環境變數 apache配置檔案

Intellij IDEA記憶體設定(3264啟動配置檔案)

開啟 IDEA 安裝目錄,看到有一個 bin 目錄,其中有兩個 vmoptions 檔案,需針對不同的JDK進行配置: 32 位:idea.exe.vmoptions 64 位:idea64.exe.vmoptions -Xms512m -Xmx1024m -XX: