1. 程式人生 > >哈佛架構與馮諾依曼架構的區別

哈佛架構與馮諾依曼架構的區別

CISC與RISC的區別:

  • CISC(複雜指令集):複雜指令集就是CPU在工作的時候需要有很多的彙編指令來完成,它可以用一個彙編指令來完成一件複雜的工作。例如:乘法,加法,乘加,乘減等處理的時候,他會每個處理方式用一條指令來完成。因此這種設計實際上是很強大的,因為同樣處理一個運算,它可以用一個機器週期就可以完成了。但是其內部的硬體設計就相對而言的比較複雜了一些。而且,這樣的設計勢必就會遭成功耗的增加。例如現在的大部分PC機的處理器都是這種的。51微控制器也是這種方式的。

RISC(精簡指令集):相對於複雜指令集而言,精簡指令集所需要的彙編指令就會少很多了。例如:在完成(1+1)×(2-1)這樣的運算的時候,第一次先算1+1等於2然後再算2-1等於1,最後在算2×1等於2。這樣他就要經歷好幾個機器週期才能完成一次運算。而如果用複雜指令集的話可能一次就可以算出來結果了。由於現在的CPU主頻基本上在原料不變的情況下是很難再提高他的(主頻)運算速度了。所以,精簡指令集的CPU在單核的效率上是遠不如複雜指令集的CPU的。因此,為了達到與複雜指令集的CPU同樣的運算效率,現在的手機經常會增加核心的數量來提升自身的處理效率。

地址匯流排、資料匯流排和控制匯流排的區別(這裡的匯流排主要指外部匯流排,不包括核心的匯流排):

地址匯流排(Address Bus):當CPU要處理資料的時候首先地址匯流排會根據要處理的資料的地址在記憶體中找到要處理的資料,然後再對其進行相應的處理。也就是說,地址匯流排的寬度決定了CPU能夠處理的資料地址的總量的大小。由於地址匯流排總是由CPU發起的定址要求,因此資料匯流排只能由CPU主動向外部尋找它所需要的地址,而不能被外部的IO主動使用。因此,地址匯流排是單向(只能由CPU主動去讀而不會對其進行寫)三態(高電平、低電平、高阻態)的。

資料匯流排(Data Bus):當CPU需要讀取或寫入資料的時候由地址匯流排先去定址,然後再由資料匯流排對所讀到的地址進行讀或寫操作(CPU一次讀寫的資料總量由資料匯流排的寬度決定)。最終實現CPU所要實現的相應功能。由於CPU會通過資料匯流排對所要處理的地址進行讀和寫兩種方式的操作。因此,資料匯流排是雙向三態的。

控制匯流排(Control Bus):當CPU要對外部的外設(IO裝置或記憶體)進行操作的時候,控制匯流排會對相應的外設發出相應的控制指令,然後再由資料匯流排對其進行操作。由於控制匯流排要對所有的外設進行控制,因此,他是雙向的且十分的靈活,而其匯流排的寬度也是不確定的,主要有外設的數量決定其寬度。

統一編址和獨立編址的區別:

要明白統一編址和獨立編址的區別首先要知道CPU在處理資料的時候其實是要先由控制匯流排傳送控制指令,然後再對外設(這裡的外設包括IO裝置和記憶體)進行定址的操作,只有找到了要操作的硬體或記憶體的地址之後才能對其進行相應的操作。而這個定址的方式是由CPU對地址的編址方式決定的。而編址方式就分為統一編址和獨立編址。

統一編址:統一編址就是當CPU要對IO裝置進行操作的時候,就直接由地址匯流排進行定址,因為地址匯流排的寬度是一定的,也就是所定址的範圍是一定的。而如果由它直接對IO裝置進行定址,那勢必會佔用有限的地址,進而會導致對其能夠操作的記憶體大小就會有所限制。這也就導致了地址匯流排所能尋到的記憶體地址並不和自己的匯流排寬度對應上。(假如一個32位寬度的地址匯流排本來可以定址4GB的記憶體地址,但是由於它一般分外設佔用了他的地址,因此,他所能使用的記憶體就會小於4GB。)

獨立編址:獨立編址的CPU在對IO裝置進行操作的時候會有專門的操作指令,而不會用記憶體操作指令,這樣就會使地址匯流排僅服務於記憶體,而不會被其他IO外設佔用。也因此會使記憶體的大小等於地址匯流排的寬度。

哈佛結構和馮諾依曼結構的區別:

要理解哈弗結構和馮諾依曼結構的區別,首先要知道我們在編寫程式的時候其實可以對程式的程式碼劃分為兩個部分,一部分是程式編寫完成後就不再需要對其進行修改了的(也就是邏輯程式碼部分)另一部分就是在程式編寫完畢後其內容會隨著程式的執行而不斷變化的部分(也就是定義變數)。而哈佛結構和馮諾依曼結構就是對於這個兩部分程式碼的儲存方式的區別。

哈佛結構:哈佛結構就是將程式的邏輯程式碼和變數分開存放的一種結構,而他們存放的位置可以是形同的也可以是不同的,總是隻要是分成兩個部分單獨訪問的結構都可以叫哈佛結構。(例如:51的程式的邏輯程式碼段放在ROM中,而變數部分則放在ROM中;而ARM的邏輯程式碼和變數都是存放在RAM(記憶體)中的,但是,它在記憶體中劃分了兩部分的空間,其中一部分放邏輯程式碼,另一部分方變數。之間不會相互干擾)哈佛結構的優點就是邏輯程式碼和變數單獨存放,使之不會相互干擾,進而當程式出BUG的時候,最多隻會修改變數的值,而不會修改程式的執行順序(邏輯關係)。因此,這種結構大量應用在嵌入式程式設計當中。

馮諾依曼結構:馮諾依曼結構則是將邏輯程式碼段和變數統一都儲存在記憶體當中,他們之間一般是按照程式碼的執行順序依次儲存。這樣就會導致一個問題,如果當程式出現BUG的時候,由於程式沒有對邏輯程式碼段的讀寫限定,因此,他將擁有和普通變數一樣的讀寫操作許可權。於是就會很容易的宕機,一旦他的邏輯執行出現一點該變就會出現非常嚴重的錯誤。但是,馮諾依曼結構的好處是可以充分利用有限的記憶體空間,並且會使CPU對程式的執行十分的方便,不用來回跑。