歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

計算機組成.零件之間的通信.總線BUS

總線干嘛的?說白了就是用來傳輸數據的,在計算機的各個部件之間。比如我主存裡存的數據CPU要用,需要一條線路傳過去吧,CPU內部各個寄存器之間、寄存器與ALU、CU與各個部件之間等等等等很多地方,總之就是部件之間需要傳輸數據 傳輸的數據分為三種,對應著三種功能的總線

數據總線 地址總線 控制總線 那麼為何稱為“總”線?那是因為大部分情況下,我們沒辦法把任意兩個部件之間都連起來,因為部件的數量太多太多了

所以我們只用一根總線來傳輸, 那麼面臨的第一個問題就是,怎麼區分數據、地址、控制這三類呢?? 確實對於數據和地址有一種技術叫做總線復用,因為計算機是在時序的控制下工作,所以一根總線上的數據在不同的時間段內被規定為“數據”還是“地址”。對於控制信號還沒有這樣做的,,, 還是分三根總線來吧 那麼又有一個問題,只有三根線的話,雖然可以區分是數據還是地址還是控制信號,但是對於眾多的部件來說,它如何知道當前總線上傳輸的數據是不是給它的?因為一條數據線連接了所有的部件,A給B發送數據的時候上面的數據是給B的,對於其他部件是沒用的、是錯誤的數據。 所以說,就需要控制信號來控制嘛。A發送數據的時候,控制信號就只讓B從數據總線接收數據,其他部件是不接收的。 突然想到一個比喻,只是用來解釋總線的工作原理,並非歷史發展

總線大概就像自來水管,自來水廠沒辦法給所有的家庭都鋪設一條專門的管道,所以就只鋪設一條管道連接起所有的家庭。每個家庭都有自己家庭的工作用來給社會做貢獻,哪家需要用水,就可以隨時打開自來水管取水。 後來自來水廠買下了加油站,但是不想再鋪設更多的線路,所以就仍舊用一根管道,但是告訴所有的家庭,只有在你收到了自來水的信號,從管道上才能取出你需要的自來水,收到的是汽油信號,取出來的就是汽油。信號的傳輸也需要一條線,所以就鋪設了一條電線來傳輸信號 事實證明這做是明智的,因為自來水廠經濟越來越發達,逐漸買下了食用油廠、煤氣廠、鹽廠、漢堡廠等等等等,但是依舊使用一根管道就可以服務所有的家庭了,只不過需要傳輸的控制信號多一點,這比多鋪設管道要省錢多了 後來發現家庭之間的交換也比較頻繁,既然有這麼方便的總管道為什麼不用呢?於是大家都在控制信號的控制下,被告知可以往管道上放東西的家庭就可以往管道上放東西,然後再通知誰來取東西。這些管道就變成了雙向的通行,可以取也可以放。 所以總線的一個很重要的特征就是,對掛在上面的部件是共享的。

如果兩個家庭之間達成私下交換的協議,或一個家庭和自來水廠有關系可以讓人把東西專門開車送來,那相當於專門的通信通道,不能稱之為總線 對應到計算機上,這種總線就是“以分時形式共享一組電導線”來實現。 廢話太多了…

總線組成與特性

組成

傳輸線、接口和總線控制器

除了傳輸數據、地址和控制信號的信息線外,還有電源線和接地線來連接到每個部件,也有可能會有備用線來預防總線出故障 接口由三態門和緩沖寄存器組成。三態門可以決定當前總線與這個部件的聯通狀態,三態門的輸出可以是1、0和高阻抗三個狀態,多一個EO使能來控制 由於總線的共享性,所以需要一個總線控制器來控制總線的使用和分配,

特性

功能特性

傳輸線按功能(傳輸的數據是個啥)分類

地址總線 數據總線 控制總線

電氣特性

也就是傳輸方向了啦

單向總線:只能一個方向傳輸數據。地址線單向就夠了=、= 雙向總線:全雙工和半雙工

全雙工:同時可以雙向的傳輸數據 半雙工:一個時刻只能按照一個方向來傳輸數據 別問我怎麼實現的,我不知道。我猜應該是在數字電路這門課上,,,,,,搞得我好想學

時間特性

按照時序來規定了每根傳輸線上的信號在什麼時間才是有效的

不在指定的時間內讀數據的話,大概是(沒錯我又開始猜了),要麼讀不到、要麼讀錯掉

總線設計與實現

說到這還只是單總線的結構,即所有的模塊共用一個總線。

 

\

 

但是 一個總線上接入的模塊是有限的,太多的模塊會讓總線的負荷太高,降低通信效率 每個模塊的工作頻率也可看作速度不盡相同,比如CPU明顯要快於I/O接口,這樣在工作慢的模塊占用總線的時候,工作快的模塊干完了獲要使用總線,但是總線被慢模塊占用所以不得不等待。 所以出現了帶局部總線的多總線結構

 

\

 

然各個部件之間的工作頻率也不相同,這就很難協調,結果就是效率降低,於是就出現了層次總線結構,來處理部件之間的協調性

 

\

 

進一步還有

帶局部總線的層次總線結構 使用橋接器連接的多總線結構 具有更強容錯能力的多重總線結構

總線控制

有兩句話很好的概括了總線的兩個特性

發送的互斥性:某一時刻只允許一個功能部件往總線上發送數據 接受的共享性 :允許多個功能部件在同一時刻接收總線上傳輸的信息

那麼如何協調好多個部件之間的這種信息傳遞的關系,就需要有人站出來控制大家對總線的使用

根據兩個特性來分析

如何決定某一時刻由那個功能部件往總線上發送數據,稱這個部件為主部件,主部件控制了總線。這部分叫“總線仲裁”。 接收信息的時候應該如何控制?萬一我要接收數據的時候主部件還沒有把數據放到總線上呢?萬一我要接收的時候主部件卻把數據從總線上撤銷了咋辦?這部分為總線的通信控制。

總線仲裁

如果很不幸,只有一個人站出來控制總線,那麼就是集中式總線仲裁,誰來當主部件即誰來占用總線由他“集中”控制

串行鏈接方式:所有的部件通過一條線來向總線仲裁器發送“總線請求”信號。

 

\

 

若部件y發送總線請求信號,剛好總線是空閒的,那麼總線仲裁器就發出總線可用的信號,它若接收到了那麼就由它來占用總線,並也由它來發送總線忙的信號來告訴其他部件總線不是空閒的。 但是,總線可用信號的傳遞是從部件0依次向下傳遞的,如果部件0沒有發出總線請求,才會把總線可用信號傳遞到下一個部件1。這很正常啊,誰讓總線可用信號先經過我呢?就算你後面的部件在請求總線,那也是我前面的請求總線的部件先收到總線可用的信號啊。 這就形成了一種默認的優先級,,,而且因為是串聯,所以一旦一個部件壞掉,其後面的部件將永遠收不到總線可用信號 有一個名字叫“菊花鏈”……這一定是很久之前的名字了 定時查詢方式:基於串行鏈式的方式

 

\

 

對所有的部件編號,在第一次收到總線請求的時候,計數器從0開始計數,並將計數器的數值作為總線可用的信號定時廣播到每個部件 這個數值對應著可用接收這個總線可用信號的部件的編號,所以廣播之後,所有的部件收到了總線可用的數值,對比自己的編號如果一樣才可以發出總線忙的信號來占用總線,一旦收到總線忙的信號,計數器就停止計數(而不是歸0,串行鏈接相當於計數器歸0)。 否則的話計數器就+1,那麼在下次發送總線可用信號的時候,可以響應總線可用信號的部件就是下一個了。 而且,計數器的值可以由軟件來控制,這也意味著優先級可以由軟件來隨時更改。 明顯復雜了許多,線路多成本高,而且由於需要提前編號、線路的數目取決於總線部件的數目等,使得可擴展性差。另外由於其定時發出信號的頻率依賴於計數器的工作頻率,所以不會很高。 獨立請求方式

相對於串行的連線,獨立請求就是總線請求和總線可用線對於每個部件都有一根專門與總線仲裁器相連,總線忙信號只需要一根就足夠

 

\

 

每個部件獨立的向總線仲裁器發送總線請求信號,如果當前總線是空閒的(總線忙的線無信號),則總線仲裁器向該部件發送總線可用信號,對於多個同時發送的總線請求信號,總線仲裁器內部根據硬件實現的仲裁算法來確定誰可占用總線 仲裁算法有預定(靜態優先級)、自適應(動態優先級)、循環計數(平等)、先來先服務(隊列)。 靈活性很強,但是成本最昂貴,,,你看那一根根的線,都是錢啊 固定時間片方式

利用了分時的思想 按照固定長度的時間片依次讓各個部件來使用總線,即便當前部件不用總線,那也得等當前時間片過去之後才能換到下一個部件。 最簡單,最公平,成本最低,效果最不好(不過在某些情況下也足夠了)

Copyright © Linux教程網 All Rights Reserved