32位 還是64位

本文已經收錄至我的GitHub,歡迎大家踊躍star 和 issues。

https://github.com/midou-tech/articles

通過前面兩篇文章的學習,外甥對電腦的產生了各種好奇,差點把自己電腦拆開來研究研究了

我覺得這種學習精神挺好的,假使她真的把電腦拆壞了,也是贊同的,畢竟這種學習的經歷是在的

就在前幾天外甥和我抱怨說只要應用打開的比較多或者網頁打開比較多,電腦運行超級慢,卡頓半天

我就反手問了一句,你知道爲什麼麼?

她故作無知冷冷的來了一句 不知道

我細細的講起卡頓有幾方面的原因:

  • 打開的app或者網頁需要計算的數據量太大,計算機 算力不足,此時計算機算力全部被徵用了,無法在操作其他
  • 打開的app 內存需求量大,打開app多或者單個app內存需求較大,會導致內存被佔滿,此時會發生 磁盤內存的交換,磁盤速度很慢
  • app需要讀取大量磁盤數據,磁盤讀寫速度遠遠低於內存和CPU
  • 網絡卡頓,app有網路交互情況,網路非常慢,app會經歷 超時重試

巴拉巴拉說了一通,她估計實在忍不住了,打斷說

我看了任務管理器,卡頓時內存爆滿 100%狀態,然後就加裝了內存條,詭異的是情況並沒有好轉,讓我非常不解。

問號? 問號?

我聽到這裏,就已經知道病症在那裏了,32bit和64bit的問題,今天就給大家講講這個病症

文章大綱 文章大綱

32bit和64bit指的是什麼?

記得校招面試那會兒,經常被面試官問到,你知道32位和64位的區別是什麼麼?

那時候我脫口而出 尋址能力不一樣

現在看來,這個回答含糊不清、對也不對

首先,我們應該問清楚 32位和64位指的是軟件呢?還是CPU呢?

就像上面外甥的描述,她加裝了一個4G內存條,她的本原生有4G內存 共計8G內存,爲何原來的內存問題還是復現呢?

這裏有兩個可能的原因:

  1. 她的 操作系統軟件是32位,但是CPU是64位的,這樣一來的話,即使加裝了內存也無法使用。

雖然你有能力了,但是被限制了發揮空間,也就廢物一個了,此時她裝一個64位的操作系統即可發揮8G內存的威力了。

  1. 32位的CPU,這樣一來的話,內存加裝到8G了,也無濟於事,尋址能力跟不上。

上面兩種情況,第一種是有能力,但被限制了,只要放開我,就還你一片天地;第二種是無能爲力

所以當在聊32位和64位的問題時,要優先搞清楚說的是什麼?

從上面的內容很容易看出來,所指對象不同,結果完全不同的,不可一概而論

32bit和64bit的區別

明白了32位和64位指代對象,現在來談談二者的區別,談之前先溫習下前面說的馮諾依曼結構

結構五件套就不說了,前面有文章專門介紹了 計算機如何組成的?

  • 輸入設備

  • 輸出設備

  • 存儲器

  • 中央處理器

  • 控制器

說說五件套之間如何有效通信的

CPU 和內存以及其他設備之間,需要通信,因此我們用一種特殊的設備進行控制,就是總線

總線分成 3 種:

  • 地址總線,專門用來指定 CPU 將要操作的內存地址
  • 數據總線,用來讀寫內存中的數據
  • 控制總線,用來發送和接收關鍵信號,比如中斷信號,還有設備復位、就緒等信號,都是通過控制總線傳輸。CPU 需要對這些信號進行響應,這也需要控制總線。

當然,這和我們要說的32位和64位有什麼關係呢?

32位和64位軟件的區別

32位軟件和64位軟件的區別就是,指針的大小不同,也就是地址範圍不同

估計一臉黑人問號,現在高級語言都不在使用指針這個概念了,龍叔還在說 指針 是不是不合時宜了

是的,高級語言除了C++還在談指針,其他的語言如java、Python、go都已經不談指針了

語言設計者不談是爲了給開發者減負,並不意味着就是沒有了

指針非常核心,因爲我們 訪問內存數據必須依賴地址,指針就是地址

拉回來了,繼續說32位軟件和64位軟件問題

軟件設計者在設計軟件時是32位的,意味着程序裏面使用的指針都是4byte的,也就意味着最大能尋到的地址2^32次方,也就是4G。

所以當我們操作系統是32位時,最大隻能訪問到4G內存,不管我們加多大的內存條 都是無意義的

聲明一下 操作系統也是一種軟件 ,不過是一種系統軟件

用戶軟件是依賴操作系統的尋址操作的,如果操作系統是32位,該操作系統下無法運行64位的用戶軟件

我們都知道,數據傳遞是通過高低電壓控制的,高電平是1 低電平是0

龍叔在大學學習數字電路時經常搞這種操作,動不動就是用電路連接一個加法器

四位全加器實驗 四位全加器實驗

經常做實驗就是搞幾個芯片 通過電路去控制做一個加法器或者去在顯示器上按照規則亮滅相應的二極管

說實話,大一讓我搞這些 還是比較頭疼的,動不動幾個小時還沒搞個所以然,現在看來不過爾爾

所以現在每當遇到困難時,我都假設自己處在未來某個時間點 來看當下的問題 最終就是不過爾爾

其實本質就是使用電平的高低變化去傳輸數據,一個高電平表示 1 低電平表示 0

假設我們只有一條地址線,一次傳輸只能是一個電平0或1,那你要傳輸一個數字10(二進制)就必須傳輸兩次

這種只有一條地址總線進行數據傳輸的方式稱爲串行傳輸

假設我們有兩條地址總線,一次就能傳輸兩個電平,數字10就只需要傳輸一次就好

這種用多條地址總線,一次傳輸多個信號的方式就是並行傳輸

當 CPU 需要讀寫內存的時候,先要通過地址總線來指定內存地址,再通過數據總線來傳輸數據

所以我們地址總線的根數決定尋址的能力,當我們有32根地址總線時我們的尋址能力就是2^32=4G

32位CPU和64位CPU的區別

舉個例子:用一個32位的CPU求和兩個64位的數字

通常 32 位寬 CPU 最多操作 32 位寬的地址總線和數據總線

64 位寬 CPU 最多操作 64 位寬的地址總線和數據總線

這就存在一個問題,64位數字無法進行一次性傳輸到32位上讓CPU進行計算

由上面的傳輸原則可知 必須把64位數字拆分爲兩個32數字進行傳輸

通過這個例子可以很明白的看到,32位的CPU和64位的CPU在控制總線上的能力不同

32位CPU和64位CPU的區別之一就是,CPU 的位寬決定能控制的總線根數,而總線的根數決定尋址能力

32位最大控制的總線爲32根,最大尋址能力是4G,一次能傳輸最大字節數是4byte

64位最大控制的總線爲64根,最大尋址能力是256TB,一次能傳輸的最大字節數是8byte

還可以看到的是,32位的CPU計算能力也是隻能計算32位的數據,無法對64位的數據進行運算

這點可能不是很好理解,32位CPU一次讀入只能讀取32bit的數據,同時32位的CPU只有32位的寄存器

64位具有向下兼容特性,64位可以跑32位的軟件,可以進行32位的計算

說到這裏,再回想面試官問的問題,以及外甥女的不解 猶如明鏡一般清澈無比

64的優勢是什麼?

接下來說說64位的優勢到底是個啥

我們的CPU執行程序的步驟是:

  1. CPU讀取PC指針指向的指令,簡稱 取指(fetch)
  2. CPU 分析 指令寄存器中的指令,確定指令的類型和參數,簡稱 解碼(decode)
  3. 如果是計算類型的指令,那麼就交給邏輯運算單元計算;如果是存儲類型的指令,那麼由控制單元執行 ,簡稱 執行(execute)
  4. 將執行結果進行返回給寄存器或者將寄存器數據存入內存,簡稱 存儲(store)
  5. PC 指針自增,並準備獲取下一條指令

上面步驟是一個循環也稱爲CPU指令週期,CPU 的工作就是一個週期接着一個週期,週而復始。

指令週期 指令週期

在CPU運行的週期中可以看到,有一個核心的部件 寄存器

上面用到了 程序寄存器 指令寄存器,寄存器本質就是指針,指針就是地址,地址就是一串數字編碼

而決定這串數字編碼的就是地址的大小,地址的大小由尋址能力決定,尋址能力就是總線的根數

總線的根數是由CPU的位數決定的

說到這裏其實大家應該已經明白64位CPU的優勢了,龍叔還是給個總結

64 位 CPU 可以執行更大數字的運算,具體多大呢? 2^64這麼大

這個優勢在普通應用上不明顯,但是對於數值計算較多的應用就非常明顯

64 位 CPU 可以尋址更大的內存空間

如果 32 位/64 位說的是程序,那麼說的是指令是 64 位還是 32 位的

32 位指令在 64 位機器上執行,困難不大,可以兼容。 如果是 64 位指令,在 32 位機器上執行就困難了

32 位指令在 64 位機器執行的時候,需要的是一套兼容機制就OK了,但是 64 位指令在 32 位機器上執行,32 位的寄存器都存不下指令的參數。

操作系統也是一種程序,如果是 64 位操作系統,也就是操作系統中程序的指令都是 64 位指令,因此不能安裝在 32 位機器上。

補充內容

前面提到了寄存器,很多人對寄存器非常陌生,這裏詳細講解一下

CPU內部結構圖 CPU內部結構圖

從上面的圖中可以很明顯的看到,圖中虛線以內,寄存器是CPU內部集成的內存是外部的

當我們訪問內存時需要通過寄存器去找到對應的地址,再執行相應的指令

此時CPU會在數據總線上生成讀取寫入內存的時鐘信號,最後內存的內容會被CPU寄存器的內容更新或者讀入

寄存器是啥,上面已經說了,寄存器就是一個指針,裏面存放着地址

以上就是本期的所有內容了,我是龍叔,我們下期見

最後非常需要靚仔靚女們的分享、轉發、點贊,這些都是我創作的動力,感謝大家

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章