作者:小牛呼嚕嚕 | https://xiaoniuhululu.com
計算機內功、JAVA底層、面試、職業成長相關資料等更多精彩文章在公眾號「小牛呼嚕嚕」
大家好,我是呼嚕嚕,在之前的文章計算機的基本組成是什麼樣子的中,我們知道了現代計算機還是沿用了馮·諾依曼計算機架構,分別是運算器、控制器、儲存器、輸入裝置、輸出裝置
。那麼計算機是如何讓這些部件相互通訊,傳遞資料的?其實計算機的各個部件就是依賴匯流排系統,相互協調,連線成一個整體,本文就來詳細聊聊匯流排系統。
匯流排是什麼?
匯流排是貫穿整個系統的是一組電子管道,是連線各個部件的資訊傳輸線,是各個部件共享的傳輸介質,稱作匯流排
,它攜帶資訊位元組並負責在各個計算機部件間傳遞。
在匯流排出現之前,我們計算機各個裝置都是各自單獨互相通訊的,如果有n個裝置,由於他們都需各自單獨互相通訊,其中一個裝置需要和其他n-1
個裝置通訊,那系統的複雜度為N^2
為了降低系統複雜度,工程師們想到了一個辦法,在計算機中設計一個公共的線路,其他的各個裝置都不需要各自單獨互相通訊,只需和這個公共線路通訊,將指令和資料傳送給線路,線路代為轉遞,這樣系統複雜度就可以降為了N
。
這條線路就像一個高速公路,我們把它稱為匯流排(Bus),匯流排除了降低了系統複雜性,還提供了一個標準化的資料交換方式,便於介面設計,各個硬體按照匯流排的標準實現介面,而無需考慮對方介面或匯流排的工作原理,有利於各個部件模組化設計。這樣的設計下,註冊在匯流排上的各個模組就是低耦合的,方便未來程式碼的維護或者擴充套件。
常見匯流排型別有哪些?
計算機系統中的匯流排,按功能可以劃分為以下 3 類:
- 片內匯流排。片內匯流排顧名思義就是晶片內部的匯流排,它是CPU晶片內部暫存器與暫存器之間、暫存器與算術邏輯部件ALU之間、ALU與控制部件之間 傳輸資料所用的公共連線線稱為 片內匯流排。
- 通訊匯流排。通訊匯流排是在計算機系統之間、計算機系統與外部裝置(如遠端通訊裝置、測試裝置)之間傳送資訊的匯流排,通訊匯流排也稱外部匯流排。
- 系統匯流排。系統匯流排是計算機系統內各功能部件(CPU、主存、I/O介面)之間互相連線的匯流排。按系統匯流排傳輸資訊內容的不同,又可以分為3 種:資料匯流排、地址匯流排和控制匯流排。下文我們將具體看一下這三類匯流排
內部匯流排:查閱各種資料發現各種說法都有,比如維基百科的上是指南橋晶片與北橋晶片之間的連線;國內有的資料說晶片內部的匯流排即片內匯流排為內部匯流排,有的說是微機中各外掛板與系統板之間的匯流排等等,概念太亂了,本文就不闡述了,感興趣的話可以留言討論
匯流排的序列和並行的區別?
在詳細介紹資料匯流排、地址匯流排和控制匯流排
之前,我們還得先了解一下匯流排的序列和並行的區別
按資料傳輸格式可將匯流排劃分為並行匯流排和序列匯流排
- 序列匯流排,由於只需一條傳輸線就能實現資料的收發
- 並行匯流排,就是資料傳輸有多根線,這樣就可以一次傳送多位的資料。
同樣一個位元組資料(8位),序列通訊要分8次由低位到高位按順序一位位地傳送,而並行通訊由於有8根線路,可以一次把8位資料傳送過去。通俗點講,序列如同開一輛車分八次把貨物運走,並行就是同時開8輛車,一口氣把貨物運走。
在早期計算機中,計算機的主頻比較低,序列匯流排傳輸效率比並行匯流排慢,畢竟並行一次可以傳多位,肯定比序列快。但並行匯流排也有一些問題:
- 傳輸線數量多,意味著介面就需要很多針腳,佔用更多的佈線空間。老式計算機裡的並行介面做得很大,接線比較寬,針腳非常多。
- 並行的鏈路越多,對資料傳輸的干擾就越強,因此並行匯流排需要加強抗干擾的能力,不然傳輸過程中資料就可能被損壞
- 如果並行傳輸過程中資料中有一位故障了,就需要重新對齊資料再次傳輸。
但隨著計算機和材料學的高速發展,計算機的主頻越來越高,並行的訊號線之間會產生嚴重干擾,對每條線等長的要求也越高,反過來會限制計算機主頻的提升,而序列匯流排則沒有這個問題,因此像現在USB介面,讓序列傳輸浴火重生
雖然序列每次傳輸的資料少,但它可以不斷提高工作頻率來提高傳輸速度,最終超過並行匯流排傳輸效率。
再有如果傳輸過程中有一位的資料出現異常,並行匯流排就需要重新對齊資料再傳輸過去。而序列匯流排如果一位資料出錯了,只需要重新傳輸一次就好了,由於序列匯流排頻率高,很快就可以把錯誤資料重新傳輸過去。序列匯流排成本較低,還可以節約計算機硬體的佈線空間
使用序列匯流排,在資料傳送和接收的時候要進行拆卸和裝配,序列-並行格式需要轉換。
資料匯流排
資料匯流排(Data Bus),用來傳輸各功能部件之間的實際資料資訊,它是雙向傳輸的,它既可以把CPU的資料傳送到儲存器或I/O介面等其它部件,也可以將其它部件的資料傳送到CPU。這裡的資料的含義是廣義的,它可以是真正的資料,也可以是指令程式碼、狀態資訊或者其他,大家不要被繞進去
通常匯流排被設計成傳送定長的位元組塊
,也就是字(word)。字中的位元組數(即字長)是一個基本的系統引數,各個系統中都不盡相同。另外計算機最小的儲存單位
是位元組(Byte),1 位元組等於 8 位(1Byte=8bit),而位/位元(bit)是計算機最小的資料傳輸單位
。1 位元組等於 8 位(1Byte=8bit)這個換算規則大家需要牢記
現在的大多數機器字長(計算機能直接處理的二進位制資料的位數)要麼是4個位元組(4*8 =32位),要麼是8個位元組(64位)。本文我們不對字長做任何固定的假設
資料匯流排的位寬,也就是資料匯流排的寬度是計算機的一個重要指標,一般情況下:資料匯流排的位寬 = CPU的位寬 = CPU內部通用暫存器的位寬 = 機器字長,但是資料匯流排寬度不一定等於機器字長,比如下圖中8088型號處理器,2者就不相等
資料匯流排的位寬為8位的話,資料匯流排數量有8條,由於每條傳輸線一次只能傳輸1位二進位制資料,所以8根資料線一次可傳送一個8位二進位制資料(即一個位元組)
地址匯流排
地址匯流排(Address Bus),地址匯流排專門用於傳輸的是地址訊號,指出資料匯流排上的資料來源地址、目的資料在主存單元或I/O 裝置 的地址,也就是指向 CPU 將要操作的記憶體地址。地址匯流排是單向傳輸的(地址只能從CPU傳向外部儲存器或I/O裝置的埠),其位數與主存空間的大小有關。
CPU的定址能力
計算機最小的儲存單位
是位元組(Byte),計算機將8個bit歸為一組,為位元組,每一個位元組都對應一個記憶體地址。記憶體的地址是從0
開始編號的,然後自增排列,最後一個地址為記憶體總位元組數 -1
。CPU只需要知道某個資料型別的地址, 就可以直接去到對應的記憶體位置去提取資料了。
CPU的定址能力與它的地址匯流排位寬有關,與資料匯流排寬度(CPU位寬=資料匯流排位寬)無關。16位CPU的地址匯流排位寬可以是20位,也可以是24位。CPU的位寬最好不要小於地址匯流排位寬,需要透過北橋
進行資料轉換,工作起來比較複雜, 16位 CPU 一次最多隻能操作16位寬的地址匯流排,最好16位CPU和16位的地址匯流排位寬搭配,但CPU的位寬不能大於地址匯流排位寬。
地址匯流排位寬決定了CPU能直接訪問的主存容量大小,CPU 透過地址匯流排來指定儲存單元的位置(注意是位元組而不是字),地址匯流排上能傳送多少資訊,CPU 就可以對多少個儲存單元進行定址。
如果一臺8位計算機,其地址匯流排為16位的話,有16根地址線來傳遞地址訊號,每一條線能夠傳遞的資料都是 0 或 1
則其最大可定址空間為2^16B= 64*1024B= 64KB
,影響CPU的定址能力是它的地址匯流排位寬,與其CPU位寬無關。
32位CPU最大支援4G記憶體?
64位、32位指的是CPU暫存器的資料寬度,也叫 CPU 的位寬,他們最主要區別在於CPU一次能計算多少位元組資料
- 32位CPU,表明處理器 一次可以計算 4 個位元組(Byte),即一次可以計算32位(bit)資料。
- 64位CPU,表明處理器 一次可以計算 8 個位元組(Byte),即一次可以計算64位(bit)資料。
32位CPU最大支援4G記憶體,這是怎麼算出來的?它的前提條件是CPU的位寬等於地址匯流排位寬
32位CPU,其地址匯流排位寬也是32位,根據地址匯流排位寬我們可以算出:2^32B = 4GB,2^35b = 4GB
,其最大記憶體定址能力只能達到是4G。我們就算給這臺32位的電腦裝8G的記憶體條,也無法提高其計算能力。
但是我們剛剛只是舉得最普遍的情況,32位CPU,其地址匯流排位寬也可以是36位,40位
控制匯流排
控制匯流排(Control Bus),用來傳輸的是控制或狀態訊號,控制匯流排是雙向傳輸的,一般用於傳送和接收訊號,比如儲存器讀、儲存器寫、中斷、裝置復位等訊號。控制匯流排的寬度決定了CPU對外部器件的控制能力
匯流排的共享性和獨自性
匯流排具有分時和共享性:
分時是指同一時刻只允許有一個部件向匯流排傳送資訊,若系統中有多個部件,則它們只能分時地向匯流排傳送資訊。
共享是指匯流排上可以掛接多個部件,各個部件之間互相交換地資訊都可透過這組線路分時共享。
也就是在某一時刻只允許有一個部件,佔有匯流排的控制權,可以向匯流排傳送資訊,但多個部件可同時從匯流排上接收相同的資訊。
系統匯流排的結構
我們一直說系統匯流排的設計概念,我們來看下實際上計算機中的匯流排結構
單匯流排結構
最初的單匯流排結構只有一條匯流排叫做系統匯流排,把各個部分連線起來,所有裝置間的通訊都要經過系統匯流排,單匯流排結構就會顯得負載比較重,同時只能有兩個裝置進行通訊,其他裝置間想要通訊就必須等待。所以負載大,無法支援併發操作
雙匯流排結構
由於I/O 裝置的訪問速度是非常慢的,CPU這麼昂貴的資源,不能讓它一直等待I/O 裝置的響應,所以增加一條I/O 匯流排,用於在多個外部裝置與通道之間傳送資料,將低速 I/O 裝置從單匯流排上分離出來。另一條是主存匯流排,用於在 CPU、主存和通道之間傳送資料。
通道是具有特殊功能的處理器,能對I/O裝置進行統一管理。
三匯流排結構
三匯流排結構在二匯流排結構上(主存匯流排, I/O 匯流排),新增DMA匯流排
DMA(直接記憶體訪問)是現代計算機一個非常重要的特點,在它出現之前,主存匯流排和IO匯流排讀取記憶體和IO裝置的資料,都是有CPU所控制的,由於CPU的讀取速度比主存、IO裝置、硬碟上的讀取速度差距快的多(完全不是一個量級的),CPU是非常昂貴的資源,不能讓它一直等待主存、IO裝置的響應資料,所以有了DMA之後,CPU將匯流排的控制權交給DMA,讓DMA可以不受CPU的控制,由DMA控制器來實現和完成的,去獨自與主存、IO裝置互動。也沒有中斷處理方式那樣保留現場和恢復現場過程,透過硬體為RAM和IO裝置開闢一條直接傳輸資料的通道,使得CPU的效率大大提高
我們知道匯流排的控制權具有分時獨佔性,DMA控制器獲得匯流排控制權後,CPU即刻掛起或只執行內部操作,DMA完成任務後透過歸還匯流排控制權,由於DMA控制器和CPU都有訪內請求,可將地址、資料等訊號送到匯流排上,甚至都不需要經過"申請-建立-歸還匯流排控制權"的過程,直接控制權轉移,讓DMA與CPU交替訪問記憶體。由於耗時極短,產生"同時訪問"記憶體的現象
所以DMA匯流排提高了 I/O 裝置的效能,使其更快地響應命令,提高系統吞吐量。
還有四匯流排結構,PCI匯流排結構, 雙獨立匯流排結構等就不介紹了,感興趣的自行去查閱相關資料。
匯流排傳輸的四個階段
- 申請分配階段:由需要使用匯流排的主模組(或主裝置)提出申請,經匯流排仲裁機構決定將下一傳輸週期的匯流排使用權授予某一申請者。也可將此階段細分為傳輸請求和匯流排仲裁兩個階段。
- 定址階段:獲得使用權的主模組透過匯流排發出本次要訪問的從模組的地址及有關命令,啟動參與本次傳輸的從模組。
- 傳輸階段:主模組和從模組進行資料交換,可單向或雙向進行資料傳送。
- 結束階段:主模組的有關資訊均從系統匯流排上撤除,讓出匯流排使用權。
匯流排仲裁
由於計算機有多個裝置,必然會存在多個裝置同時競爭匯流排控制權的問題,這時候就需要匯流排仲裁,讓某個裝置優先獲得匯流排控制權,獲得了匯流排控制權的裝置,才能開始傳送資料。未獲勝的裝置只能等待獲勝的裝置處理完成後才能執行。
匯流排仲裁方式按其仲裁控制機構可分為集中總裁方式和分佈仲裁方式兩種。
集中總裁方式
匯流排控制邏輯基本上集中於一個裝置(如 CPU)中。將所有的匯流排請求集中起來,利用一個特定的裁決演算法進行裁決,稱為集中仲裁方式。集中仲裁方式有鏈式查詢、計數器定時查詢方式和獨立請求方式
。
- 鏈式查詢方式
匯流排上所有的部件共用一根匯流排,當有部件請求使用匯流排時,需經此線發匯流排請求訊號到匯流排控制器。由匯流排控制器檢查匯流排是否忙,若匯流排不忙,則立即發匯流排響應訊號,經匯流排響應線 BG 序列地從一個部件傳送到下一個部件,依次查詢。若響應訊號到達的部件無匯流排請求,則該訊號立即傳送到下一個部件;若響應訊號到達的部件有匯流排請求,則訊號被截住,不再傳下去。也就是說“匯流排忙”訊號的建立者是獲得匯流排控制權的裝置。
在鏈式查詢中,部件離匯流排控制器越近,其優先順序越高;部件離匯流排控制器越遠,其優先順序越低。優點:鏈式查詢只需很少幾根控制線就能按一定優先次序實現匯流排控制,結構簡單,擴充容易。
缺點:對硬體電路的故障敏感,且優先順序不能改變。當優先順序高的部件頻繁請求使用匯流排時,會使優先順序較低的部件長期不能使用匯流排。
- 計時器定時查詢方式
它採用一個計數器控制匯流排使用權,相對鏈式查詢方式多了一組地址線,少了一根匯流排響應線 BG。它仍共用一根匯流排請求線,當匯流排控制器收到匯流排請求訊號並判斷匯流排空閒時,計數器開始計數,計數值透過裝置地址線發向各個部件。當地址線上的計數值與請求使用匯流排裝置的地址一致時,該裝置獲得匯流排控制權,同時終止計數器的計數及查詢。
優點:計數可從“0”開始,此時一旦裝置的優先順序次序被固定,裝置的優先順序就按 0,1,...,n 的順序降序排列,而且固定不變;計數也可從上一次的終點開始,即採用一種迴圈方法,此時裝置使用匯流排的優先順序相等;計數器的初值還可以由程式設定,故優先順序可以改變,且這種電路的故障沒有鏈式查詢方式敏感。
缺點:增加了控制線數(若裝置有 n 個,則大致需要 ⌈log2n⌉ + 2 條控制線),控制也相對比鏈式查詢要複雜。
- 獨立請求方式
每個裝置均有一對匯流排請求線 BR_i_ 和匯流排允許線 BG_i_。當匯流排上的部件需要使用匯流排時,經各自的匯流排請求線傳送匯流排請求訊號,在匯流排控制器中排隊,當匯流排控制器按一定的優先次序決定批准某個部件的請求時,給該部件傳送匯流排響應訊號,該部件接到此訊號就獲得了匯流排使用權,開始傳送資料。
優點:響應速度快,匯流排允許訊號 BG 直接從控制器傳送到有關裝置,而不必在裝置間傳遞或查詢,而且對優先次序的控制相當靈活。缺點:控制線數量多(裝置有 n 個,需要 2n + 1 條控制線,其中加的那條控制線為 BS 線,作用是讓裝置向匯流排控制器部件反饋已使用完匯流排),匯流排控制邏輯更復雜。
分佈仲裁方式
分散式仲裁方式不需要中央仲裁器,每個潛在的主模組都有自己的仲裁號和仲裁器。當它們有匯流排請求時,就會把它們各自唯一的仲裁號傳送到共享的仲裁匯流排上,每個仲裁器將從仲裁匯流排上得到的仲裁號與自己的仲裁號進行比較,若仲裁匯流排上的仲裁號優先順序高,則它的匯流排請求不予響應,並撤銷它的仲裁號。最後,獲勝者的仲裁號保留在仲裁匯流排上。
匯流排的效能指標
- 匯流排的傳輸週期。指一次匯流排操作所需的時間(包括申請階段、定址階段、傳輸階段和結束階段),簡稱匯流排週期。匯流排傳輸週期通常由若干匯流排時鐘週期構成。
- 匯流排時鐘週期。即機器的時鐘週期。計算機有一個統一的時鐘,以控制整個計算機的各個部件,匯流排也要受此時鐘的控制。
- 匯流排的工作頻率。匯流排上各種操作的頻率,為匯流排週期的倒數。實際上指 1 秒內傳送幾次資料。
- 匯流排寬度。又稱匯流排位寬,它是匯流排上同時能夠傳輸的資料位數,通常指資料匯流排的根數,如 32 根稱為 32 位匯流排。
- 匯流排頻寬。可理解為匯流排的資料傳輸率,即單位時間內匯流排上同時能夠傳輸的資料位數,通常用每秒傳送的位元組數來衡量,單位可用 B/s 表示。匯流排頻寬 = 匯流排工作頻率 * (匯流排寬度 / 8)。
- 匯流排複用。匯流排複用是指一種訊號線在不同的時間傳輸不同的資訊,因此可以使用較少的線傳輸更多的資訊,從而節省空間和成本。
- 訊號線數。地址匯流排、資料匯流排和控制匯流排 3 種匯流排書的總和稱為訊號線數。
其中,匯流排最主要的效能指標為匯流排寬度、匯流排工作頻率、匯流排頻寬,匯流排頻寬是指匯流排本身所能達到的最高傳輸速率,它是衡量匯流排效能的重要指標。匯流排頻寬 = 匯流排寬度 * 匯流排頻率。例如匯流排工作頻率為 22 MHz
,匯流排寬度為 16 位
,則匯流排頻寬= 22 * (16 / 8)= 44 MB/s
。
尾語
感謝大家讀到最後,想信大家都瞭解了匯流排是什麼?計算機為什麼使用匯流排?以及匯流排的設計理念,匯流排一些通用的特性,匯流排和記憶體的互動,接著又聊到了匯流排的結構,DMA等現代計算機的重要技術,最後又介紹匯流排仲裁和其效能指標,希望大家有所收穫
參考資料:
《深入理解計算機系統 第三版》
《計算機組成原理》
《深入淺出計算機組成原理》
https://blog.csdn.net/qq_42896653/article/details/105329078
https://blog.csdn.net/weixin_42394252/article/details/106073221
https://blog.csdn.net/qq_42896653/article/details/105329078
本篇文章到這裡就結束啦,如果我的文章對你有所幫助,還請幫忙一鍵三連:點贊、關注、收藏,你的支援會激勵我輸出更高質量的文章,感謝!
計算機內功、JAVA原始碼、職業成長、專案實戰、面試相關等更多高質量文章,首發於公眾號「小牛呼嚕嚕」,我們下期再見。