作者:小牛呼嚕嚕 | https://xiaoniuhululu.com
計算機內功、JAVA底層、面試、職業成長相關資料等更多精彩文章在公眾號「小牛呼嚕嚕」
大家好,我是呼嚕嚕,在之前的文章計算機的基本組成是什麼樣子的中,我們知道了現代計算機還是沿用了馮·諾依曼計算機架構,分別是運算器、控制器、記憶體、輸入裝置、輸出裝置
。那麼計算機是如何讓這些部件相互通訊,傳遞資料的?其實計算機的各個部件就是依賴匯流排系統,相互協調,連線成一個整體,本文就來詳細聊聊匯流排系統。
匯流排是貫穿整個系統的是一組電子管道,是連線各個部件的資訊傳輸線,是各個部件共用的傳輸媒介,稱作匯流排
,它攜帶資訊位元組並負責在各個計算機部件間傳遞。
在匯流排出現之前,我們計算機各個裝置都是各自單獨互相通訊的,如果有n個裝置,由於他們都需各自單獨互相通訊,其中一個裝置需要和其他n-1
個裝置通訊,那系統的複雜度為N^2
為了降低系統複雜度,工程師們想到了一個辦法,在計算機中設計一個公共的線路,其他的各個裝置都不需要各自單獨互相通訊,只需和這個公共線路通訊,將指令和資料傳送給線路,線路代為轉遞,這樣系統複雜度就可以降為了N
。
這條線路就像一個高速公路,我們把它稱為匯流排(Bus),匯流排除了降低了系統複雜性,還提供了一個標準化的資料交換方式,便於介面設計,各個硬體按照匯流排的標準實現介面,而無需考慮對方介面或匯流排的工作原理,有利於各個部件模組化設計。這樣的設計下,註冊在匯流排上的各個模組就是低耦合的,方便未來程式碼的維護或者擴充套件。
計算機系統中的匯流排,按功能可以劃分為以下 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裝置的埠),其位數與主記憶體空間的大小有關。
計算機最小的儲存單位
是位元組(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位寬無關。
64位元、32位元指的是CPU暫存器的資料寬度,也叫 CPU 的位寬,他們最主要區別在於CPU一次能計算多少位元組資料
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 線,作用是讓裝置向匯流排控制器部件反饋已使用完匯流排),匯流排控制邏輯更復雜。
分散式仲裁方式不需要中央仲裁器,每個潛在的主模組都有自己的仲裁號和仲裁器。當它們有匯流排請求時,就會把它們各自唯一的仲裁號傳送到共用的仲裁匯流排上,每個仲裁器將從仲裁匯流排上得到的仲裁號與自己的仲裁號進行比較,若仲裁匯流排上的仲裁號優先順序高,則它的匯流排請求不予響應,並復原它的仲裁號。最後,獲勝者的仲裁號保留在仲裁匯流排上。
其中,匯流排最主要的效能指標為匯流排寬度、匯流排工作頻率、匯流排頻寬,匯流排頻寬是指匯流排本身所能達到的最高傳輸速率,它是衡量匯流排效能的重要指標。匯流排頻寬 = 匯流排寬度 * 匯流排頻率。例如匯流排工作頻率為 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原始碼、職業成長、專案實戰、面試相關等更多高質量文章,首發於公眾號「小牛呼嚕嚕」,我們下期再見。