1. 程式人生 > >詳解為什麼32位系統只能用4G記憶體

詳解為什麼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組成的, 如下圖:
            


           上面說了, 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)排列組成的。 如下圖:

             其實大部分資料都會作為各種資料型別存放在記憶體內, 而各種資料型別所佔的位元組大小也是不同的,例如上圖解析的,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都不錯了。



      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個指標啊!

原文地址:http://www.cnblogs.com/nvd11/archive/2013/04/02/2996784.html