馮·諾依曼結構

馮·諾依曼結構

馮·諾依曼結構也稱普林斯頓結構,是一種將程式指令存儲器和數據存儲器合併在一起的存儲器結構。程式指令存儲地址和數據存儲地址指向同一個存儲器的不同物理位置,因此程式指令和數據的寬度相同,如英特爾公司的8086中央處理器的程式指令和數據都是16位寬。

歷史

馮·諾依曼 馮·諾依曼

最早的計算機器僅內含固定用途的程式。現代的某些計算機依然維持這樣的設計方式,通常是為了簡化或教育目的。例如一個計算器僅有固定的數學計算程式,它不能拿來當作文書處理軟體,更不能拿來玩遊戲。若想要改變此機器的程式,你必須更改線路、更改結構甚至重新設計此機器。當然最早的計算機並沒有設計成那種可程式化。當時所謂的“重寫程式”很可能指的是紙筆設計程式步驟,接著制訂工程細節,再施工將機器的電路配線或結構改變。

而儲存程式型電腦的概念改變了這一切。藉由創造一組指令集結構,並將所謂的運算轉化成一串程式指令的執行細節,讓此機器更有彈性。接著將指令當成一種特別型態的靜態資料,一台儲存程式型電腦可輕易改變其程式,並在程控下改變其運算內容。

馮·諾伊曼結構與儲存程式型電腦是互相通用的名詞,其用法將於下述。而哈佛結構則是一種將程式資料與普通資料分開儲存的設計概念。

儲存程式型概念也可讓程式執行時自我修改程式的運算內容。本概念的設計動機之一就是可讓程式自行增加內容或改變程式指令的記憶體位置,因為早期的設計都要使用者手動修改。但隨著索引暫存器與間接位置存取變成硬體結構的必備機制後,本功能就不如以往重要了。而程式自我修改這項特色也被現代程式設計所棄揚,因為它會造成理解與除錯的難度,且現代中央處理器的管線與快取機制會讓此功能效率降低。

從整體而言,將指令當成資料的概念使得組合語言、編譯器與其他自動編程工具得以實現;可以用這些“自動編程的程式”,以人類較易理解的方式編寫程式[1];從局部來看,強調I/O的機器,例如Bitblt,想要修改畫面上的圖樣,以往是認為若沒有客制化硬體就辦不到。但之後顯示這些功能可以藉由“執行中編譯”技術而有效達到。

此結構當然有所缺陷,除了下列將述的馮·諾伊曼瓶頸之外,修改程式很可能是非常具傷害性的,無論無意或設計錯誤。在一個簡單的儲存程式型電腦上,一個設計不良的程式可能會傷害自己、其他程式甚或是作業系統,導致當機。緩衝區溢位就是一個典型例子。而創造或更改其他程式的能力也導致了惡意軟體的出現。利用緩衝區溢位,一個惡意程式可以覆蓋調用堆疊(Call stack)並覆寫程式碼,並且修改其他程式檔案以造成連鎖破壞。記憶體保護機制及其他形式的存取控制可以保護意外或惡意的程式碼更動。

介紹

說到計算機的發展,就不能不提到美國科學家馮·諾依曼。從20世紀初,物理學和電子學科學家們就在爭論製造可以進行數值計算的機器應該採用什麼樣的結構。人們被十進制這個人類習慣的計數方法所困擾。所以,那時以研製模擬計算機的呼聲更為響亮和有力。20世紀30年代中期,美國科學家馮·諾依曼大膽的提出:拋棄十進制,採用二進制作為數字計算機的數制基礎。同時,他還說預先編制計算程式,然後由計算機來按照人們事前制定的計算順序來執行數值計算工作。

人們把馮·諾依曼的這個理論稱為馮·諾依曼體系結構。從EDVAC到當前最先進的計算機都採用的是馮諾依曼體系結構。所以馮·諾依曼是當之無愧的數字計算機之父。

馮·諾依曼結構 馮·諾依曼結構

人們把利用這種概念和原理設計的電子計算機系統統稱為“馮.諾曼型結構”計算機。馮.諾曼結構的處理器使用同一個存儲器,經由同一個匯流排傳輸。

內容

特點

馮.諾依曼結構處理器具有以下幾個特點:

1:必須有一個存儲器;2:必須有一個控制器;3:必須有一個運算器,用於完成算術運算和邏輯運算;4:必須有輸入設備和輸出設備,用於進行人機通信。:另外,程式和數據統一存儲並在程式控制下自動工作

功能

根據馮·諾依曼體系結構構成的計算機,必須具有如下 功能

把需要的程式和數據送至計算機中。

必須具有長期記憶程式、數據、中間結果及最終運算結果的能力。

能夠完成各種算術、邏輯運算和數據傳送等數據加工處理的能力。

能夠按照要求將處理結果輸出給用戶。

為了完成上述的功能,計算機必須具備五大基本組成部件,

包括

輸入數據和程式的輸入設備;

記憶程式和數據的存儲器;

完成數據加工處理的運算器;

控制程式執行的控制器;

輸出處理結果的輸出設備。

瓶頸

將CPU與記憶體分開並非十全十美,反而會導致所謂的馮·諾伊曼瓶頸(von Neumann bottleneck):在CPU與記憶體之間的流量(資料傳輸率)與記憶體的容量相比起來相當小,在現代電腦中,流量與CPU的工作效率相比之下非常小,在某些情況下(當CPU需要在巨大的資料上執行一些簡單指令時),資料流量就成了整體效率非常嚴重的限制。CPU將會在資料輸入或輸出記憶體時閒置。由於CPU速度以及記憶體容量的成長速率遠大於雙方之間的流量,因此瓶頸問題越來越嚴重。而馮·諾伊曼瓶頸是約翰·巴科斯在1977年ACM圖靈獎得獎致詞時第一次出現,根據巴科斯所言:

“……確實有一個變更儲存裝置的方法,比藉由馮·諾伊曼瓶頸流通大量資料更為先進。瓶頸這詞不僅是對於問題本身資料流量的敘述,更重要地,也是個使我們的思考方法局限在‘一次一字元’模式的智慧型瓶頸。它使我們怯于思考更廣泛的概念。因此編程成為一種計畫與詳述通過馮·諾伊曼瓶頸的字元資料流,且大部分的問題不在於資料的特徵,而是如何找出資料。”

在CPU與記憶體間的快取記憶體抒解了馮·諾伊曼瓶頸的效能問題。另外,分支預測(branch predictor)算法的建立也幫助緩和了此問題。巴科斯在1977年論述的“智慧型瓶頸”已改變甚多。且巴科斯對於此問題的解決方案並沒有造成明顯影響。現代的函式式編程以及面向對象編程已較少執行如早期Fortran一般會“將大量數值從記憶體搬入搬出的操作”,但平心而論,這些操作的確占用電腦大部分的執行時間。

主要貢獻

馮·諾依曼的主要貢獻就是提出並實現了“存儲程式”的概念。由於指令和數據都是二進制碼,指令和運算元的地址又密切相關,因此,當初選擇這種結構是自然的。但是,這種指令和數據共享同一匯流排的結構,使得信息流的傳輸成為限制計算機性能的瓶頸,影響了數據處理速度的提高。

馮·諾依曼結構圖 馮·諾依曼結構圖

在典型情況下,完成一條指令需要3個步驟,即:取指令、指令解碼和執行指令。從指令流的定時關係也可看出馮·諾依曼結構與哈佛結構處理方式的差別。舉一個最簡單的對存儲器進行讀寫操作的指令,指令1至指令3均為存、取數指令,對馮.諾依曼結構處理器,由於取指令和存取數據要從同一個存儲空間存取,經由同一匯流排傳輸,因而它們無法重疊執行,只有一個完成後再進行下一個。

結構

中央處理器的體系架構可以分為:馮·諾依曼結構和哈佛結構

結構

使用馮·諾伊曼結構的中央處理器和微控制器有很多。除了上面提到的英特爾公司的8086,英特爾公司的其他中央處理器、ARM的ARM7、MIPS公司的MIPS處理器也採用了馮·諾依曼結構。

1945年,馮·諾依曼首先提出了“存儲程式”的概念和二進制原理,後來,人們把利用這種概念和原理設計的電子計算機系統統稱為“馮·諾依曼型結構”計算機。馮·諾依曼結構的處理器使用同一個存儲器,經由同一個匯流排傳輸。

馮·諾曼結構處理器具有以下幾個特點:必須有一個存儲器;必須有一個控制器;必須有一個運算器,用於完成算術運算和邏輯運算;必須有輸入和輸出設備,用於進行人機通信。

哈佛結構

哈佛結構是一種將程式指令存儲和數據存儲分開的存儲器結構。中央處理器首先到程式指令存儲器中讀取程式指令內容,解碼後得到數據地址,再到相應的數據存儲器中讀取數據,並進行下一步的操作(通常是執行)。程式指令存儲和數據存儲分開,可以使指令和數據有不同的數據寬度,如Microchip公司的PIC16晶片的程式指令是14位寬度,而數據是8位寬度。

哈佛結構的微處理器通常具有較高的執行效率。其程式指令和數據指令分開組織和存儲的,執行時可以預先讀取下一條指令。使用哈佛結構的中央處理器和微控制器有很多,除了上面提到的Microchip公司的PIC系列晶片,還有摩托羅拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和ARM公司的ARM9、ARM10和ARM11。

哈佛結構是指程式和數據空間獨立的體系結構,目的是為了減輕程式運行時的訪存瓶頸。

例如最常見的卷積運算中, 一條指令同時取兩個運算元, 在流水線處理時, 同時還有一個取指操作,如果程式和數據通過一條匯流排訪問,取指和取數必會產生衝突,而這對大運算量的循環的執行效率是很不利的。哈佛結構能基本上解決取指和取數的衝突問題。而對另一個運算元的訪問,就只能採用Enhanced哈佛結構了,例如像TI那樣,數據區再split,並多一組匯流排。或向AD那樣,採用指令cache,指令區可存放一部分數據。

在DSP算法中,最大量的工作之一是與存儲器交換信息,這其中包括作為輸入信號的採樣數據、濾波器係數和程式指令。例如,如果將保存在存儲器中的2個數相乘,就需要從存儲器中取3個二進制數,即2個要乘的數和1個描述如何去做的程式指令。DSP內部一般採用的是哈佛結構,它在片內至少有4套匯流排:程式的數據匯流排,程式的地址匯流排,數據的數據匯流排和數據的地址匯流排。這種分離的程式匯流排和數據匯流排,可允許同時獲取指令字(來自程式存儲器)和運算元(來自數據存儲器),而互不干擾。這意味著在一個機器周期內可以同時準備好指令和運算元。有的DSP晶片內部還包含有其他匯流排,如DMA匯流排等,可實現單周期內完成更多的工作。這種多匯流排結構就好像在DSP內部架起了四通八達的高速公路,保障運算單元及時地取到需要的數據,提高運算速度。因此,對DSP來說,內部匯流排是個資源,匯流排越多,可以完成的功能就越複雜。超級哈佛結構(superHarvard architecture,縮寫為SHARC),它在哈佛結構上增加了指令cache(快取)和專用的I/O控制器。

哈佛結構處理器有兩個明顯的特點:使用兩個獨立的存儲器模組,分別存儲指令和數據,每個存儲模組都不允許指令和數據並存;使用獨立的兩條匯流排,分別作為CPU與每個存儲器之間的專用通信路徑,而這兩條匯流排之間毫無關聯。

改進的哈佛結構,其結構特點為:以便實現並行處理;具有一條獨立的地址匯流排和一條獨立的數據匯流排,利用公用地址匯流排訪問兩個存儲模組(程式存儲模組和數據存儲模組),公用數據匯流排則被用來完成程式存儲模組或數據存儲模組與CPU之間的數據傳輸。

兩者區別

馮·諾依曼理論的要點是:數字計算機的數制採用二進制;計算機應該按照程式順序執行。人們把馮諾依曼的這個理論稱為馮諾依曼體系結構。從ENIAC到當前最先進的計算機都採用的是馮諾依曼體系結構。所以馮諾依曼是當之無愧的數字計算機之父。

根據馮諾依曼體系結構構成的計算機,必須具有如下功能:把需要的程式和數據送至計算機中;必須具有長期記憶程式、數據、中間結果及最終運算結果的能力;能夠完成各種算術、邏輯運算和數據傳送等數據加工處理的能力;能夠根據需要控制程式走向,並能根據指令控制機器的各部件協調操作;能夠按照要求將處理結果輸出給用戶。

哈佛結構是為了高速數據處理而採用的,因為可以同時讀取指令和數據(分開存儲的)。大大提高了數據吞吐率,缺點是結構複雜。通用微機指令和數據是混合存儲的,結構上簡單,成本低。假設是哈佛結構:你就得在電腦安裝兩塊硬碟,一塊裝程式,一塊裝數據,記憶體裝兩根,一根儲存指令,一根存儲數據……

是什麼結構要看匯流排結構的。51單片機雖然數據指令存儲區是分開的,但匯流排是分時復用的,所以頂多算改進型的哈佛結構。ARM9雖然是哈佛結構,但是之前的版本也還是馮·諾依曼結構。早期的X86能迅速占有市場,一條很重要的原因,正是靠了馮·諾依曼這種實現簡單,成本低的匯流排結構。處理器雖然外部匯流排上看是諾依曼結構的,但是由於內部CACHE的存在,因此實際上內部來看已經算是改進型哈佛結構的了。至於優缺點,哈佛結構就是複雜,對外圍設備的連線與處理要求高,十分不適合外圍存儲器的擴展。所以早期通用CPU難以採用這種結構。而單片機,由於內部集成了所需的存儲器,所以採用哈佛結構也未嘗不可。處理器,依託CACHE的存在,已經很好的將二者統一起來了。

爭議

馮·諾伊曼結構這個詞出自約翰·馮·諾伊曼的論文:First Draft of a Report on the EDVAC , 於1945年6月30日。馮·諾依曼由於在曼哈頓工程中需要大量的運算,從而使用了當時最先進的兩台計算機Mark I和ENIAC,在使用Mark I和ENIAC的過程中,他意識到了存儲程式的重要性,從而提出了存儲程式邏輯架構。雖然馮·諾伊曼的創見非常新穎,但馮·諾伊曼結構這個詞,對馮·諾伊曼的合作夥伴、時人甚至先輩都不公平。

一份寇蘭德·宙斯(Konrad Zuse)提出的專利套用就已在1936年點出這類概念。而儲存程式型電腦的概念早在馮·諾伊曼知曉ENIAC的存在前就已在賓州大學的摩爾電機學院流傳了。此構想的確實創立者永遠是個謎。

赫曼·魯寇夫(Herman Lukoff) 相信是艾克特創建此概念。

毛奇利(Mauchly)與艾克特(Eckert)在1943年於他們建造ENIAC時寫下關於儲存程式的概念,另外,ENIAC計畫管理員布萊德(Grist Brainerd)在1943年12月為ENIAC做的進度回報,就已隱約提及儲存程式的概念(雖然也同時否決了在ENIAC實作的計畫),他說“為了擁有最簡單的實作計畫以及不複雜的事務,ENIAC建造時後將不需要任何自動整備”。

當設計ENIAC時,它很清楚說明從讀卡機或紙帶讀取指令是不夠快的,因為ENIAC設計用於高速執行運算。因此ENIAC直接以電路管線設計程式,並在需要新程式時重新配接線路。設計師也很清楚他們需要更好的系統結構,因此在ENIAC建造期間第一份EDVAC的報告就已撰寫完畢,並包含了儲存程式的概念,此概念敘述程式指令儲存在高速記憶體(水銀延遲記憶體)中,因此可以在執行時快速存取。

艾倫·圖靈在1946年2月19日講演了一份包含程式儲存型電腦(Pilot ACE)完整設計的論文。

相關詞條

相關搜尋

熱門詞條

聯絡我們