64位記憶體

2021-07-10 22:34:46 字數 2852 閱讀 3084

64位系統最顯著的優點是它可以使用超過4gb的記憶體。為什麼32位的系統只能顯示3g記憶體(實際上是3.25g)呢?這是由於系統本身的限制所造成的。32位系統對於記憶體的定址能力總共就4g,而4g裡還要放其他東西:比如系統 bios,輸入輸出裝置的位址和設定,各類介面的設定和位址等等,這些位址和設定所占用的空間要達到700m左右,因此4g內存在32位中也只能顯示出3g了。

在早年的計算機中,位址的轉換很單純,有效位址就直接等於物理儲存器的位址,這適合同一時間只有乙個程序在運作。但windows不會只有乙個window,多程序並存是現代計算機的基本情形。後來人們決定為每個程序劃定一塊專用記憶體區域,這樣可以讓多個程序同時運作。但這種分段方式會讓內存在程序開關的過程中產生很多碎片,很多小塊記憶體無法被利用。由於記憶體空間總是相對有限的,因此應用程式也不能瘋狂的將所有東西直接塞進記憶體當中。同時也不能依賴硬碟這個緩慢的二級儲存器去充當記憶體,那實在太慢了。為了調和這個矛盾,作業系統都引入了虛擬記憶體機制。

windows的虛擬記憶體並非簡單的指位於硬碟上的那個pagefile.sys檔案,或者是在記憶體裝不下的時候用於應急的「模擬記憶體」。在windows系統中,任何乙個程序都會被賦予其自己的虛擬位址空間,這是一種邏輯位址空間,並不存在實體,該虛擬位址空間可以覆蓋了乙個相當大的範圍。對於乙個32位程序,其可以擁有的虛擬位址空間為2^32=4gb,典型情況為2gb使用者空間,2gb系統核心空間(最大可調整為3gb使用者空間和1gb核心空間),這與安裝了多少物理記憶體沒有任何關係。每個程序的虛擬位址空間都會被標上各自的id,這樣兩個程序之間的虛擬位址就不會互相干擾。雖然每乙個32位程序可使用4gb的位址空間,但並不意味著每乙個程序實際擁有4gb的實體地址空間或使用4gb物理記憶體,虛擬位址僅僅是一種邏輯位址。

應用程式自然不能總在看不見摸不著的虛擬位址裡溜達,最終還是需要實實在在的物理儲存器關聯。應用程式會為其虛擬位址申請物理儲存空間,這個空間通常小於應用程式的總虛擬空間。這裡所說的物理儲存器並不侷限於計算機記憶體,還包括在磁碟空間上建立的頁檔案(pagefile.sys),儲存空間大小為計算機記憶體和頁檔案儲存容量之和(所以windows自動管理時的pagefile.sys是很大的)。由於通常情況下磁碟儲存空間要遠大於記憶體的儲存空間,因此頁檔案的使用對於應用程式而言確實相當於透明地增加了其所能使用的記憶體容量,只是速度慢了點。有了虛擬記憶體,程式本身就不用完全裝入記憶體,或者完全存於硬碟,系統會將目前需要的部分讀入記憶體處理,暫時不需要的就放在硬碟的頁檔案留作交換。不過cpu並不能直接去訪問磁碟上的資訊,每次磁碟訪問都必須通過記憶體,所以若所需的內容在磁碟上的頁檔案中,就需要先載入到記憶體然後訪問。

每個程序都有自己的虛擬位址空間,對於32位程序來說,這個位址空間的大小為4gb,因為32位指標可以表示從0x00000000到0xffffffff之間的任一值。指標在這個範圍內可以有4 294 967 296個值,它覆蓋了程序的4gb位址空間。對於64位程序來說,由於64位指標可以表示從0x00000000'00000000到0xffffffff'ffffffff之間的任一值,因此這個位址空間的大小為16eb[i]。指標在這個範圍內可以有18 446 744 073 709 551616 個值,它覆蓋了程序的16eb的位址空間。每個程序都有自己的私有的位址空間,當程序中各執行緒執行時,它們只能訪問屬於該程序的記憶體,執行緒既看不到屬於其他程序的記憶體,也無法訪問它們。

雖然應用程式有這麼大的位址空間可用,但是這只是虛擬位址空間——不是物理儲存器。這個位址空間只不過是乙個記憶體位址區間,為了能夠正常讀/寫資料,還需要把物理儲存器分配或對映到相應的位址空間,否則將導致訪問違規(access violation)。

每個程序的虛擬位址空間被劃分成許多分割槽(partition)。由於位址空間的分割槽依賴於作業系統的底層實現,因此隨著windows核心的不同而略有變化。下表列出了各平台上對程序位址空間的分割槽。

分割槽x86 32位

windows

3 gb使用者模式下的x86 32位

windows

x64 64位

windows

ia-64 64位

windows

空指標賦值

分割槽0x00000000

0x0000ffff

0x00000000

0x0000ffff

0x00000000'00000000

0x00000000'0000ffff

0x00000000'00000000

0x00000000'0000ffff

使用者模式

分割槽0x00010000

0x7ffeffff

0x00010000

0xbffeffff

0x00000000'00010000

0x000007ff'fffeffff

0x00000000'00010000

0x000006fb' fffeffff

64kb禁入

分割槽0x7fff0000 0x7fffffff

0xbfff0000 0xbfffffff

0x000007ff'ffff0000

0x000007ff'ffffffff

0x000006fb'ffff0000

0x000006fb'ffffffff

核心模式

分割槽0x80000000

0xffffffff

0xc0000000

0xffffffff

0x00000800'00000000

0xffffffff'ffffffff

0x000006fc'00000000

0xffffffff'ffffffff

表1 程序位址空間的分割槽

可以看到,32位windows核心和64位windows核心的分割槽基本一致,唯一的不同在於分割槽的大小和分割槽的位置。

[i] 1kb = 210;1mb = 220; 1gb = 230;1tb= 240;1pb = 250;1eb = 260.

64位系統最大支援多少記憶體

32位 系統能夠識別的記憶體最大在3.25 3.5gb左右,也就是說4gb的記憶體條有0.5gb左右用不了。2gb記憶體條或者2gb 1gb記憶體條用32位系統絲毫沒有影響。64位 對於64位系統的windows 7,最大記憶體支援就要視不同的系統版本而定了。比如,windows 7 home ba...

64位系統下程序的記憶體布局

作業系統 ubuntu15.04 物理記憶體 4g include include int a int b 1 main 以下2種方式可以結合著觀察 1 pmap 命令 pmap 引數 程序pid 引數 執行測試程式,用top或ps 命令查詢程序pid 屬性含義 address kbytes 大小m...

記憶體 硬碟和64位作業系統

有不懂計算機的同事問我,為什麼要用64位的作業系統啊?我解釋說,32位作業系統只能認識4g不到的記憶體。同事接著問,記憶體是什麼啊?我回到記憶體是放資料的,可以和cpu更快地交流資料,比硬碟快多了。同事又問,硬碟為什麼慢啊?我說計算機在執行時,實際像是在搬箱子,把資料從硬碟上搬到記憶體中,然後cpu...