1. 程式人生 > >詳解為什麽32位系統只能用4G內存.

詳解為什麽32位系統只能用4G內存.

計算機系 .com 大小 ron 32位系統 成本 分配 關於 bit

既然是詳解, 就從最基礎的講起了.
1. Bit(
)
Bit
計算機是計算機最小的存儲單位, 大家都知道計算機實質上都是用二進制數0或者1來存儲數據的, 所以Bit實際上可以看成存放1個二進制數字的1個位置.
也就是說bit只有2種值, 0 或者 1, 所以1bit能存放1個布爾類型的值(boolean,是或者否).
如果一個布爾類型被存放在1bit, 自然這個變量就占用1bit, 無論這個值是1或者0, 它都占用1bit...
2. Byte(
字節)
這個就厲害了, 因為我們平常講的1個文件占多少KB, MB... 1個硬盤占多少

GB.. 等後面的這個B, 指的就是字節Byte, 而不是上面的Bit, 而且1Byte = 8Bit, 這個怎麽理解呢?
其實1Byte 可以看成是有8個物理上連續的Bit組成的, 如下圖:

技術分享圖片
上面說了, 1Bit 只能表示兩種值0 or 1, 其實就是2^1(21次方)種值啦.
那麽1Byte能表示多少種值呢, 很簡單就是2^8 = 256種啦
邏輯上就是因為1Byte 是由8bit組成的, 1bit可以有兩種值(0 or 1), 那麽8bit根據概率組合論就有2^8 = 256種了.
它們分別是:
二進制: 0000 0000 0000 0001 0000 0010 0000 0011 ... 0000 1111 0001 0000 ... 1111 1111

十進制: 0 1 2 3 ... 15 16 ... 255
十六進制: 0 0 1 2 3 ... 0 F 1 0 ... F F
可以看出如下幾點:
a.
256個值分別是0255 所以1個字節能表示最大的值就是255, 所以很多時候我們見到有255最大的限制(例如ip地址)就是這個原因啊。
b.
二進制1個字節是由8個位組成的,而每4個位可以看成1組,1個十六進制數字來表示。也就是說十六進制的0-F分別表示二進制的0000 - 1111, 所以用16進制和2進制的轉化其實是很方便的。
3.
內存是計算機系統的主存儲器
介紹上面兩個存儲單位後就介紹下內存了。
內存作為1個存儲數據的存在,1個很重要的特性,就是內存裏的數據能被cpu直接訪問。
cpu
能不能直接訪問硬盤的數據呢,不能。只能通過把硬盤的數據先放到內存裏,然後再從內存裏訪問硬盤的數據。我們平時玩遊戲碰上讀圖loading 進度條的這個過程,就是把數據從硬盤讀到內存的過程啊。讀完條後地圖的數據就在內存中了。
所以內存才是計算機系統的主存儲器,而硬盤是被分到跟光盤..u盤一類都是外部存儲器。
4.
內存的基本結構
內存裏存放的數據是什麽呢?其實也是只是存放0或者1這兩個二進制數字啊,所以內存裏實際上有海量的小格子,每1個格子是1bit,就只能存放1個數字(0或者1),那麽數值255需要幾個格子來放呢?就是8個格子啊, 1個字節byte啊。
但是問題來了,我剛說了內存裏的格子數量非常巨大,如果cpu要讀出某個指定的數據,怎麽去找呢?
1
1個格子去遍歷嗎,其實稍微接觸過數據結構的都知道,遍歷雖然實現簡單,但是在海量數據面前簡直是自殺行為。
所以實際上內存是把88bit排成1組,1組成為1個單位,大小是1byte(字節), cpu每一次只能訪問1byte而不能單獨去訪問具體的1個小格子(bit). 1byte字節就是內存的最小的IO單位.
也就是說內存是由8 8個小格(bit)組成的1個字節單位(byte)排列組成的。如下圖:

技術分享圖片

其實大部分數據都會作為各種數據類型存放在內存內,而各種數據類型所占的字節大小也是不同的,例如上圖解析的,char字符類型占1個字節, int類型和unsigned int類型占4個字節byte.
5.
引入內存地址概念。
即使我們把內存分成了以字節為單位的結構,但是實際上內存裏還是有非常多的字節的,例如64MB內存就有 64 × 1024 × 1024 個字節啊!
如果cpu要查找1個變量,還是要1個個字節去找到話...還是1個很浪費時間的行為,所以為了避免去遍歷內存,計算機系統就引入了內存地址這個概念。
舉個例子, 內存就是一棟大樓, 而內存裏每1個字節就是大樓的每個房間, 而內存地址就是房間的門牌號碼了. 如果沒有門牌號碼,我們去訪問某個住在大樓的人是十分苦難的, 只能從1樓開始每個房間去敲門.. 如果那個人住在頂樓你就悲劇了. 而如果你知道那個人的門牌號碼, 就可以直接上去敲他的門查他水表了, 實在是方便很多啊.
內存也一樣, 計算機操作系統會給內存每1個字節分配1個內存地址, cpu只需要知道某個數據類型的地址, 就可以直接去到讀影的內存位置去提取數據了.

6. 直接尋址技術.
當代計算機還實現了1個逆天的技術,就是直接尋址了.
什麽意思呢, 還是用上面的例子說明, 假如你知道你要找的人住在那棟大樓的17 1702, 但是你還是需要從1樓走到17樓去找他, 這個過程還是需要時間成本的.
但是如果你具有了直接尋址技術, 就能直接跳到17 1702門前, 如果你找的下1個人在2, 又能從17樓直接跳到2, 逆天啊.
而直接尋址技術已經成為當代計算機軟硬件的標準技術之一了, 也就是說只要cpu知道要訪問數據的內存地址, 就能直接到內存的對應位置去訪問數據!
7.
內存地址的表示方式
跟門牌號一樣, 其實內存地址也是由12進制數字來表示的. 1個地址對應內存裏的1byte字節, 如果地址的值加1, 那麽這個地址就對應下1個字節了.
那麽內存地址的長度是多少呢? 這個就是這篇文章標題所涉及的. 32位操作系統中, 內存的地址就是32位的2進制數, 那麽假如32位系統的某個內存地址是:
0000 1111 1111 0000 1111 0000 1111 0000
那麽它可以用十六進制表示成: 0 F F 0 F 0 F 0
也就是 Ox0ff0f0f0 前面Ox代表十六進制, 所以你見到這種字母數字混合一次的地址方式,就是這樣得來的了, 它實際上是1個二進制的數字啊. 不過計算機裏面所有的東西都是二進制了..
8.
內存地址的數量決定cpu能訪問的內存大小.
上面說了, 既然32位系統裏內存地址長度是32位的. 所以32位的地址範圍就是從 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111 啦(Ox00000000 ~ OxFFFFFFFF)這裏有幾個地址呢?明顯是有 2^32 個啦.
那麽2^32到底是多少個? 2^32 = 4 * 1024(G) * 1024(M) * 1024(K) = 4294967296 , 就是4G, 而每1個地址對應11個字節,容量就是1byte所以2^32個地址就總共能對應應4GB的內存容量啊,這裏的B指的是byte 字節啊。
假如你給32位的系統配上了8GB的內存,操作系統最多也只能給其中4GB 分配地址,其余 4GB 是沒有地址,因為地址不夠用啊,所以32位系統最多支持4GB內存就是這樣來的。
那麽64位系統呢,對應地, 64位系統的內存地址是64位的二進制數啊, 0000 ...640 ~ 1111 ...641, 用十六進表示就是從Ox0000000000000000 ~ OxFFFFFFFFFFFFFFFF , 每個地址的長度比32位的長度多1倍!64位系統總共有多少個地址?
2^64 = 2^34 * 2^10(G) * 2^10(M) * 2^10(K)
也就是 17179869184 G4G × 4G)個地址,我艹這是神碼概念,也就是說64位系統配上64cpu理論上支持17多億GB的內存,當然這個只是理論了,實際上現在的普通主版能上個16GB都不錯了。
見下圖:

技術分享圖片

技術分享圖片

9. 關於指針。
大家都知道指針是用來存放內存地址的,那麽對於32位系統來講,內存地址是132位長度的2進制數,而每1個內存單位長度只有1byte = 8bit(位),所以1個指針就需要4byte的內存來存放該指針的內容(1個內存地址)啦。

所以我們定義1個指針 int *p; 然後求sizeof(p) 是返回4的, 4字節嘛~
而對於64位系統來講,內存地址是64位的2進制數,所以sizof(p)就返回8了,共需要8個內存單位去存放 64位系統的1個指針啊!

詳解為什麽32位系統只能用4G內存.