馮·諾依曼結構與哈佛結構淺析

前言


1945 年 6 月 30 日, 約翰 · 馮 · 諾依曼與戈德斯坦等人聯名發表著名的 101 頁報告:「First Draft of a Report on the EDVAC (EDVAC 報告書的第一份草案;EDVAC:Electronic Discrete Variable Automatic Computer, 電子數據計算機)


1946年7-8月間, 約翰 · 馮 · 諾依曼等人又提出了一個更加完善的設計報告「Preliminary Discussion of the the Logical Design of an Electronic Computing Instrument」(電子計算機邏輯設計初探)。 


報告指出:

(1)計算機應採用二進制, 不但數據採用二進制, 程序指令也採用二進制;

(2)計算機由5部分構成: 運算器、 控制器、 存儲器、 輸入和輸出裝置

(3)程序由指令組成並和數據一起存放在存儲器中, 機器按程序指定的邏輯順序, 把指令從存儲器中讀出來並逐條執行, 從而自動完成程序描述的處理工作, 即「存儲程序」思想。


馮·諾伊曼結構


這裏我們不談論前兩點,只談談由第三點“存儲程序”思想衍生出的結構: 馮 · 諾依曼結構, 即「將程序指令和數據存儲在一起」的存儲器結構, 也可稱之爲普林斯頓結構(可能是隻以他的名字命名較爲不公, 所以也有人以約翰 · 馮· 諾依曼曾任教的大學普林斯頓來命名該結構)。 下面是個人對馮 · 諾依曼結構的理解。

  • 首先,馮·諾伊曼結構的本質是「存儲器結構, 什麼是存儲器(Memory)? 現代的存儲器種類很多, 個人認爲馮 · 諾依曼結構當中的存儲器指的是我們現在說的 RAM(Random Access Memory,隨機讀取存儲器), 暫時可以理解爲是 PC 中的內存(條), 而不是指硬盤等存儲器(如有不同看法,歡迎發表), 理解這一點很重要。
  • 其次, 什麼是程序指令和數據? 程序指令本質就是控制計算機進行相關運算的一些二進制「編碼」(在馮·諾依曼機中指的是二進制碼),但是這些編碼」是人爲事先定義、計算機可理解。那麼數據呢?數據就是人爲輸入和程序指令被執行後產生的編碼」, 計算機不可理解」。馮 · 諾依曼之所以將這兩者都存儲在 RAM 中,就是因爲它們本質上都是編碼」。但是這兩者之間還有一個重要的區別: 程序指令在執行時是不可變的, 而數據則是可變的。 所以我們可以認爲程序指令的目的實際上就是爲了產生數據和改變數據。 這意味着將程序指令和數據放在同一塊存儲器上可能造成程序指令的不穩定(即程序指令在執行時容易被改寫, 這也是爲什麼 PC 機上程序容易出現崩潰的部分原因)。
  • 最後, CPU 和存儲器之間通過什麼進行溝通? 我們知道馮 · 諾依曼機的 CPU 需要從 RAM 中讀寫數據, 取指令、 翻譯指令、 執行指令。 後兩者 CPU 可獨立完成, 前兩者 CPU 則需要通過系統總線與 RAM 進行溝通。 系統總線分爲地址總線, 數據總線和控制總線, 分別用於傳輸地址信號、 數據信號和控制信號(但要注意這幾種總線不一定是獨立的,比如數據總線可能會承擔地址總線的功能), 由於將指令和數據放在一起,馮 · 諾依曼結構是比較節省總線資源的。

明白了上述幾點,就可以理解下圖了:



哈佛結構


那麼哈佛結構呢? 哈佛結構遠沒有馮 · 諾依曼結構那麼有名, 但個人認爲這種結構的地位應當是與馮 · 諾依曼相當的。 也有很多人認爲哈佛結構是馮·諾依曼的改進型, 但很少人知道哈佛結構是早於馮 · 諾依曼結構出現的。 這種結構的最早體現是在 1937 設計(1944年投入使用)的 ASCC MARK I(馬克1號), 由 IBM 的 Howard Aiken(霍華德·艾肯)設計(具體歷史請參照參考資料 [1], 英文資料)。這臺計算機使用打卡紙存儲程序指令, 而數據則存儲在處理器中, 使用十進制進行計算, 這種結構的計算機計算能力完全無法與現代的計算機相比。 與 EDVAC 的運算能力也相去甚遠, 但爲後來的哈佛結構計算機提供了極其寶貴的參考價值。 當時的哈佛結構並不像現在那麼清晰, 也許 Howard AiKen 本人也沒有意識到將數據和程序指令分開的意義。 而我們現在所認知的哈佛結構實際上是經過後人完善的, 即「將程序指令和數據存儲分開存儲的存儲器結構」。


哈佛結構計算機將程序指令和數據分開的做法實際上是保護了程序指令, 將程序指令放在 ROM (Read Only Memory, 只讀存儲器)或 Flash 等存儲器中, 可以有效地保護程序指令在執行時不被改寫; 而數據則保存在 RAM中, 可以讀寫。 但是由於多了一種存儲器, 那麼 CPU 與 RAM 的系統總線也必然會增加, 這會增加成本和設計的複雜度。 這也是早期的電腦很少使用哈佛結構的原因。 不過後來在此基礎上提出了改進型哈佛結構, 即將兩組系統總線合爲一組, 使用分時複用的方式進行訪問, 節省了總線資源, 而且沒有改變哈佛結構數據和程序指令分開存儲的本質。


下圖即爲哈佛結構示意圖:


在哈佛結構和馮諾依曼結構的基礎上, 後來的人在 CPU 內部增加了緩存(Cache), 分爲 D-Cache 和 I-Cache。 分別用於存儲數據和程序指令; 在外部則使用RAM存儲數據和指令。 只有需要改變時, 緩存纔會到 RAM 中加載新的數據。 這種方式實際上從內部看屬於哈佛結構, 在外部看則屬於馮·諾依曼結構, 這是一種混合式結構, 而現在的計算機大部分都是如此, 而不再是純粹的馮·諾依曼結構或者哈佛結構。


2017年1月19日

Kilento

參考資料


[1] 霍華德·艾肯 : http://history-computer.com/ModernComputer/Relays/Aiken.html

發佈了27 篇原創文章 · 獲贊 31 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章