將CPU與內(nèi)存分開并非十全十美,反而會(huì)導(dǎo)致所謂的馮·諾伊曼瓶頸(von Neumann bottleneck):在CPU與內(nèi)存之間的流量(資料傳輸率)與內(nèi)存的容量相比起來相當(dāng)小,在現(xiàn)代電腦中,流量與CPU的工作效率相比之下非常小,在某些情況下(當(dāng)CPU需要在巨大的資料上執(zhí)行一些簡(jiǎn)單指令時(shí)),資料流量就成了整體效率非常嚴(yán)重的限制。CPU將會(huì)在資料輸入或輸出內(nèi)存時(shí)閑置。由于CPU速度以及內(nèi)存容量的成長(zhǎng)速率遠(yuǎn)大于雙方之間的流量,因此瓶頸問題越來越嚴(yán)重。而馮·諾伊曼瓶頸是約翰·巴科斯在1977年ACM圖靈獎(jiǎng)得獎(jiǎng)致詞時(shí)第一次出現(xiàn),根據(jù)巴科斯所言:
“……確實(shí)有一個(gè)變更儲(chǔ)存裝置的方法,比借由馮·諾伊曼瓶頸流通大量資料更為先進(jìn)。瓶頸這詞不僅是對(duì)于問題本身資料流量的敘述,更重要地,也是個(gè)使我們的思考方法局限在‘一次一字符’模式的智能瓶頸。它使我們怯于思考更廣泛的概念。因此編程成為一種計(jì)劃與詳述通過馮·諾伊曼瓶頸的字符資料流,且大部分的問題不在于資料的特征,而是如何找出資料。”
在CPU與內(nèi)存間的快取內(nèi)存抒解了馮·諾伊曼瓶頸的效能問題。另外,
分支預(yù)測(cè)(branch predictor)算法的建立也幫助緩和了此問題。巴科斯在1977年論述的“智能瓶頸”已改變甚多。且巴科斯對(duì)于此問題的解決方案并沒有造成明顯影響。現(xiàn)代的
函數(shù)式編程以及面向?qū)ο缶幊桃演^少執(zhí)行如早期Fortran一般會(huì)“將大量數(shù)值從內(nèi)存搬入搬出的操作”,但平心而論,這些操作的確占用電腦大部分的執(zhí)行時(shí)間。
結(jié)構(gòu)
1945年,
馮·諾依曼首先提出了“存儲(chǔ)程序”的概念和
二進(jìn)制原理,后來,人們把利用這種概念和原理設(shè)計(jì)的電子計(jì)算機(jī)系統(tǒng)統(tǒng)稱為“馮·諾依曼型結(jié)構(gòu)”計(jì)算機(jī)。馮·諾依曼結(jié)構(gòu)的處理器使用同一個(gè)存儲(chǔ)器,經(jīng)由同一個(gè)總線傳輸。
馮·諾曼結(jié)構(gòu)處理器具有以下幾個(gè)特點(diǎn):必須有一個(gè)存儲(chǔ)器;必須有一個(gè)控制器;必須有一個(gè)運(yùn)算器,用于完成算術(shù)運(yùn)算和邏輯運(yùn)算;必須有輸入和輸出設(shè)備,用于進(jìn)行人機(jī)通信。
哈佛結(jié)構(gòu)
哈佛結(jié)構(gòu)是一種將程序指令存儲(chǔ)和
數(shù)據(jù)存儲(chǔ)分開的存儲(chǔ)器結(jié)構(gòu)。
中央處理器首先到程序指令存儲(chǔ)器中讀取程序指令內(nèi)容,解碼后得到數(shù)據(jù)地址,再到相應(yīng)的數(shù)據(jù)存儲(chǔ)器中讀取數(shù)據(jù),并進(jìn)行下一步的操作(通常是執(zhí)行)。程序指令存儲(chǔ)和數(shù)據(jù)存儲(chǔ)分開,可以使指令和數(shù)據(jù)有不同的數(shù)據(jù)寬度,如Microchip公司的PIC16芯片的程序指令是14位寬度,而數(shù)據(jù)是8位寬度。
哈佛結(jié)構(gòu)的微處理器通常具有較高的執(zhí)行效率。其程序指令和數(shù)據(jù)指令分開組織和存儲(chǔ)的,執(zhí)行時(shí)可以預(yù)先讀取下一條指令。使用哈佛結(jié)構(gòu)的中央處理器和微控制器有很多,除了上面提到的Microchip公司的PIC系列芯片,還有
摩托羅拉公司的MC68系列、Zilog公司的Z8系列、
ATMEL公司的AVR系列和ARM公司的ARM9、ARM10和ARM11。
哈佛結(jié)構(gòu)是指程序和數(shù)據(jù)空間獨(dú)立的體系結(jié)構(gòu),目的是為了減輕程序運(yùn)行時(shí)的訪存瓶頸。
例如最常見的卷積運(yùn)算中, 一條指令同時(shí)取兩個(gè)
操作數(shù), 在流水線處理時(shí), 同時(shí)還有一個(gè)取指操作,如果程序和數(shù)據(jù)通過一條總線訪問,取指和取數(shù)必會(huì)產(chǎn)生沖突,而這對(duì)大運(yùn)算量的循環(huán)的執(zhí)行效率是很不利的。哈佛結(jié)構(gòu)能基本上解決取指和取數(shù)的沖突問題。而對(duì)另一個(gè)操作數(shù)的訪問,就只能采用Enhanced哈佛結(jié)構(gòu)了,例如像TI那樣,數(shù)據(jù)區(qū)再split,并多一組總線;蛳駻D那樣,采用指令cache,指令區(qū)可存放一部分?jǐn)?shù)據(jù)。
在
DSP算法中,最大量的工作之一是與存儲(chǔ)器交換信息,這其中包括作為輸入信號(hào)的
采樣數(shù)據(jù)、濾波器系數(shù)和程序指令。例如,如果將保存在存儲(chǔ)器中的2個(gè)數(shù)相乘,就需要從存儲(chǔ)器中取3個(gè)
二進(jìn)制數(shù),即2個(gè)要乘的數(shù)和1個(gè)描述如何去做的程序指令。DSP內(nèi)部一般采用的是
哈佛結(jié)構(gòu),它在片內(nèi)至少有4套總線:程序的
數(shù)據(jù)總線,程序的
地址總線,數(shù)據(jù)的數(shù)據(jù)總線和數(shù)據(jù)的地址總線。這種分離的程序總線和數(shù)據(jù)總線,可允許同時(shí)獲取
指令字(來自
程序存儲(chǔ)器)和
操作數(shù)(來自數(shù)據(jù)存儲(chǔ)器),而互不干擾。這意味著在一個(gè)
機(jī)器周期內(nèi)可以同時(shí)準(zhǔn)備好指令和操作數(shù)。有的DSP芯片內(nèi)部還包含有其他總線,如DMA總線等,可實(shí)現(xiàn)單周期內(nèi)完成更多的工作。這種多
總線結(jié)構(gòu)就好像在DSP內(nèi)部架起了四通八達(dá)的高速公路,保障運(yùn)算單元及時(shí)地取到需要的數(shù)據(jù),提高運(yùn)算速度。因此,對(duì)DSP來說,
內(nèi)部總線是個(gè)資源,總線越多,可以完成的功能就越復(fù)雜。超級(jí)哈佛結(jié)構(gòu)(superHarvard architecture,縮寫為SHARC),它在哈佛結(jié)構(gòu)上增加了指令cache(
緩存)和專用的I/O控制器。
哈佛結(jié)構(gòu)處理器有兩個(gè)明顯的特點(diǎn):使用兩個(gè)獨(dú)立的存儲(chǔ)器模塊,分別存儲(chǔ)指令和數(shù)據(jù),每個(gè)存儲(chǔ)模塊都不允許指令和數(shù)據(jù)并存;使用獨(dú)立的兩條總線,分別作為CPU與每個(gè)存儲(chǔ)器之間的專用通信路徑,而這兩條總線之間毫無關(guān)聯(lián)。
改進(jìn)的哈佛結(jié)構(gòu),其結(jié)構(gòu)特點(diǎn)為:以便實(shí)現(xiàn)
并行處理;具有一條獨(dú)立的
地址總線和一條獨(dú)立的
數(shù)據(jù)總線,利用公用地址總線訪問兩個(gè)存儲(chǔ)模塊(程序存儲(chǔ)模塊和
數(shù)據(jù)存儲(chǔ)模塊),公用數(shù)據(jù)總線則被用來完成程序存儲(chǔ)模塊或數(shù)據(jù)存儲(chǔ)模塊與CPU之間的數(shù)據(jù)傳輸。
兩者區(qū)別
馮·諾依曼理論的要點(diǎn)是:數(shù)字計(jì)算機(jī)的數(shù)制采用二進(jìn)制;計(jì)算機(jī)應(yīng)該按照程序順序執(zhí)行。人們把
馮諾依曼的這個(gè)理論稱為
馮諾依曼體系結(jié)構(gòu)。從ENIAC到當(dāng)前最先進(jìn)的計(jì)算機(jī)都采用的是馮諾依曼體系結(jié)構(gòu)。所以馮諾依曼是當(dāng)之無愧的數(shù)字計(jì)算機(jī)之父。
根據(jù)馮諾依曼體系結(jié)構(gòu)構(gòu)成的計(jì)算機(jī),必須具有如下功能:把需要的程序和數(shù)據(jù)送至計(jì)算機(jī)中;必須具有長(zhǎng)期記憶程序、數(shù)據(jù)、中間結(jié)果及最終運(yùn)算結(jié)果的能力;能夠完成各種算術(shù)、邏輯運(yùn)算和數(shù)據(jù)傳送等數(shù)據(jù)加工處理的能力;能夠根據(jù)需要控制程序走向,并能根據(jù)指令控制機(jī)器的各部件協(xié)調(diào)操作;能夠按照要求將處理結(jié)果輸出給用戶。
哈佛結(jié)構(gòu)是為了高速數(shù)據(jù)處理而采用的,因?yàn)榭梢酝瑫r(shí)讀取指令和數(shù)據(jù)(分開存儲(chǔ)的)。大大提高了
數(shù)據(jù)吞吐率,缺點(diǎn)是結(jié)構(gòu)復(fù)雜。通用微機(jī)指令和數(shù)據(jù)是混合存儲(chǔ)的,結(jié)構(gòu)上簡(jiǎn)單,成本低。假設(shè)是哈佛結(jié)構(gòu):你就得在電腦安裝兩塊硬盤,一塊裝程序,一塊裝數(shù)據(jù),內(nèi)存裝兩根,一根儲(chǔ)存指令,一根存儲(chǔ)數(shù)據(jù)……
是什么結(jié)構(gòu)要看
總線結(jié)構(gòu)的。51單片機(jī)雖然數(shù)據(jù)指令存儲(chǔ)區(qū)是分開的,但總線是
分時(shí)復(fù)用的,所以頂多算改進(jìn)型的
哈佛結(jié)構(gòu)。ARM9雖然是哈佛結(jié)構(gòu),但是之前的版本也還是馮·諾依曼結(jié)構(gòu)。早期的X86能迅速占有市場(chǎng),一條很重要的原因,正是靠了
馮·諾依曼這種實(shí)現(xiàn)簡(jiǎn)單,成本低的總線結(jié)構(gòu)。處理器雖然
外部總線上看是諾依曼結(jié)構(gòu)的,但是由于內(nèi)部CACHE的存在,因此實(shí)際上內(nèi)部來看已經(jīng)算是改進(jìn)型哈佛結(jié)構(gòu)的了。至于優(yōu)缺點(diǎn),哈佛結(jié)構(gòu)就是復(fù)雜,對(duì)
外圍設(shè)備的連接與處理要求高,十分不適合外圍存儲(chǔ)器的擴(kuò)展。所以早期通用CPU難以采用這種結(jié)構(gòu)。而
單片機(jī),由于內(nèi)部集成了所需的存儲(chǔ)器,所以采用哈佛結(jié)構(gòu)也未嘗不可。處理器,依托CACHE的存在,已經(jīng)很好的將二者統(tǒng)一起來了。
哈佛體系架構(gòu)有個(gè)致命的弱點(diǎn)在動(dòng)態(tài)加載程序上面,想象我們從外存中讀取一段程序然后加載到RAM,這個(gè)程序是在數(shù)據(jù)內(nèi)存當(dāng)中的,我們需要一種機(jī)制將數(shù)據(jù)內(nèi)存再傳輸?shù)匠绦騼?nèi)存當(dāng)中去,這反而增加了設(shè)備復(fù)雜度。另外,絕對(duì)不允許CPU/DSP讀取程序內(nèi)存來當(dāng)作數(shù)據(jù),這也是不現(xiàn)實(shí)的,程序一般都有只讀數(shù)據(jù)區(qū)和靜態(tài)數(shù)據(jù)區(qū),燒寫程序的時(shí)候會(huì)當(dāng)作程序的一部分燒進(jìn)ROM中,想像一下如果為了把程序和數(shù)據(jù)分開,而需要設(shè)置兩塊ROM,再把其中一塊ROM和RAM通過復(fù)用器接起來,這是多么慘烈的景象,更不用說每次燒寫都要分開燒兩塊ROM了。實(shí)際上即使是DSP通常也允許從程序內(nèi)存的總線上讀取一些數(shù)據(jù)。
對(duì)于多任務(wù)操作系統(tǒng)來說,管理程序內(nèi)存是一件非常重要的事情,而且僅僅是保護(hù)模式下的頁面映射等等機(jī)制就已經(jīng)足夠復(fù)雜了,如果還要求將程序和數(shù)據(jù)分開管理,復(fù)雜度就太高了。這種時(shí)候馮諾依曼體系結(jié)構(gòu)就有非常大的優(yōu)勢(shì)了。純的(或者接近純的)哈佛結(jié)構(gòu)只用于非常簡(jiǎn)單的硬件系統(tǒng),這種系統(tǒng)當(dāng)中通常程序完全運(yùn)行在ROM中,數(shù)據(jù)幾乎完全存儲(chǔ)于RAM中,這樣的結(jié)構(gòu)足夠簡(jiǎn)單。而要支持多任務(wù)的處理器通常引入Cache層,在Cache層實(shí)現(xiàn)一個(gè)哈佛體系架構(gòu),這樣可以兼顧性能和靈活性。
轉(zhuǎn)自知乎 鏈接:https://www.zhihu.com/question/22406681/answer/109474052
實(shí)際上,絕大多數(shù)現(xiàn)代計(jì)算機(jī)使用的是所謂的“Modified Harvard Architecture”,指令和數(shù)據(jù)共享同一個(gè) address space,但緩存是分開的?梢哉f是兩種架構(gòu)的一種折中吧。
在現(xiàn)實(shí)世界中很少有非常純粹的概念,特別是在實(shí)際的應(yīng)用里。教科書里的大多是理想化的模型,便于掌握某個(gè)概念的重點(diǎn)和本質(zhì),但實(shí)際中很難達(dá)到這種理想化的狀態(tài)。
哈佛結(jié)構(gòu)和馮諾依曼結(jié)構(gòu)主要區(qū)別在是否區(qū)分指令與數(shù)據(jù)。在教科書里這是兩種截然不同的做法。
實(shí)際上在內(nèi)存里,指令和數(shù)據(jù)是在一起的。而在CPU內(nèi)的緩存中,還是會(huì)區(qū)分指令緩存和數(shù)據(jù)緩存,最終執(zhí)行的時(shí)候,指令和數(shù)據(jù)是從兩個(gè)不同的地方出來的。你可以理解為在CPU外部,采用的是馮諾依曼模型,而在CPU內(nèi)部用的是哈佛結(jié)構(gòu)。
大部分的DSP都沒有緩存,因而直接就是哈佛結(jié)構(gòu)。
哈佛結(jié)構(gòu)設(shè)計(jì)復(fù)雜,但效率高。馮諾依曼結(jié)構(gòu)則比較簡(jiǎn)單,但也比較慢。CPU廠商為了提高處理速度,在CPU內(nèi)增加了高速緩存。也基于同樣的目的,區(qū)分了指令緩存和數(shù)據(jù)緩存。有時(shí)為了解決現(xiàn)實(shí)問題,究竟是什么主義真的沒那么重要。因而個(gè)人認(rèn)為爭(zhēng)論到底是哪種結(jié)構(gòu)意義不大。
轉(zhuǎn)自知乎 鏈接:https://www.zhihu.com/question/22406681/answer/21264994