【轉】詳解為什么32位系統只能用4G內存.

原文來自它,點我
看完這篇文章,你回頭再看這篇文章(點我),你可能收獲會更多一點哦!!!!
1. Bit(位)
Bit計算機是計算機最小的存儲單位, 大家都知道計算機實質上都是用二進制數0或者1來存儲數據的, 所以Bit實際上可以看成存放1個二進制數字的1個位置.
也就是說bit只有2種值, 0 或者 1, 所以1個bit能存放1個布爾類型的值(boolean,是或者否).
如果一個布爾類型被存放在1個bit中, 自然這個變量就占用1個bit了, 無論這個值是1或者0, 它都占用1個bit...
2. Byte(字節)
這個就厲害了, 因為我們平常講的1個文件占多少KB, MB... 1個硬盤占多少GB.. 等后面的這個B, 指的就是字節Byte, 而不是上面的Bit, 而且1個Byte = 8Bit, 這個怎么理解呢?
其實1個Byte 可以看成是有8個物理上連續的Bit組成的, 如下圖:

詳解為什么32位系統只能用4G內存. - 饑民 - 饑民2011

上面說了, 1個Bit 只能表示兩種值0 or 1, 其實就是2^1(2的1次方)種值啦.
那么1個Byte能表示多少種值呢, 很簡單就是2^8 = 256種啦
邏輯上就是因為1個Byte 是由8個bit組成的, 每1個bit可以有兩種值(0 or 1), 那么8個bit根據概率組合論就有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個值分別是0~255 所以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個格子是1個bit
,就只能存放1個數字(0或者1), 那么數值255需要幾個格子來放呢? 就是8個格子啊, 1個字節byte啊。

但是問題來了, 我剛說了內存里的格子數量非常巨大, 如果cpu要讀出某個指定的數據, 怎么去找呢?
1個1個格子去遍歷嗎, 其實稍微接觸過數據結構的都知道, 遍歷雖然實現簡單, 但是在海量數據面前簡直是自殺行為。

所以實際上內存是把8個8個bit排成1組, 每1組成為1個單位, 大小是1byte(字節), cpu每一次只能訪問1個byte, 而不能單獨去訪問具體的1個小格子(bit). 1個byte字節就是內存的最小的IO單位.

也就是說內存是由8個 8個小格(bit)組成的1個字節單位(byte)排列組成的。 如下圖:

詳解為什么32位系統只能用4G內存. - 饑民 - 饑民2011

其實大部分數據都會作為各種數據類型存放在內存內, 而各種數據類型所占的字節大小也是不同的,例如上圖解析的,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. 內存地址的表示方式
跟門牌號一樣, 其實內存地址也是由1個2進制數字來表示的. 每1個地址對應內存里的1個byte字節, 如果地址的值加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個地址對應1個1個字節, 容量就是1byte, 所以2^32個地址就總共能對應應4GB 的內存容量啊, 這里的B指的是byte 字節啊。

假如你給32位的系統配上了8GB的內存, 操作系統最多也只能給其中4GB 分配地址, 其余 4GB 是沒有地址, 因為地址不夠用啊, 所以32位系統最多支持4GB內存就是這樣來的。

那么64位系統呢, 對應地, 64位系統的內存地址是64位的二進制數啊, 0000 ...64個0 ~ 1111 ...64個1, 用十六進表示就是從Ox0000000000000000 ~ OxFFFFFFFFFFFFFFFF , 每個地址的長度比32位的長度多1倍! 而64位系統總共有多少個地址?

2^64 = 2^34 * 2^10(G) * 2^10(M) * 2^10(K) 也就是 17179869184 G(4G × 4G)個地址, 我艸這是神碼概念, 也就是說64位系統配上64位cpu理論上支持17多億GB的內存, 當然這個只是理論了, 實際上現在的普通主版能上個16GB都不錯了。

見下圖:

詳解為什么32位系統只能用4G內存. - 饑民 - 饑民2011
詳解為什么32位系統只能用4G內存. - 饑民 - 饑民2011

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

   所以 我們定義1個指針 int *p;   然后求sizeof(p) 是返回4的, 4字節嘛~

    而對于64位系統來講, 內存地址是64位的2進制數,  所以sizof(p)就返回8了, 共需要8個內存單位去存放 64位系統的1個指針啊!
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容