2.2 馮·諾伊曼結構的要點
計算機組成
2 計算機基本結構
2.2 馮·諾伊曼結構的要點
現在的計算機形態各異,但是究其本質,幾乎全部采用了馮諾依曼結構要了解計算機,首先要知道什麽是馮諾依曼結構。當然,馮諾依曼結構的內涵是非常豐富的。在這一節,我們先來探究其中的一些要點。
要說馮諾依曼結構,我們就要從《EDVAC的報告草案》中說起。在馮諾依曼署名編寫的這份報告中,詳細描述了EDVAC這臺計算機的設計方案。從那之後一直到現在,絕大多數計算機都基於這個結構進行設計。這樣的結構就被稱為馮諾依曼計算機結構,簡稱馮諾依曼結構。
這是這份報告當中的一頁。我們可以看到下方還有 EDVAC 的字樣。這份報告長達101頁,雖然最終並未完稿,但其內容已經非常的豐富。主要論述了兩個重要的思想。第一,控制計算機的程序應該存放在存儲器中,而不是有開關連線來實現。開關連線會大大降低計算機的運行效率。第二,計算機應該采用二進制,而不是十進制。十進制的的方式會導致計算機的內部結構變得異常的復雜。這份報告還明確了計算機的內部結構應該有五個部分組成。包括運算器、控制器、存儲器、輸入設備和輸出設備。我們想要了解這五個部分的含義,不妨先來看一個小例子。
讓我們跨越到70年代。在1971年,誕生了世界上第一個商業微處理器。Intel4004 圖中這顆金色的芯片就是4004,它的面積很小,采用了10微米的制造工藝,內部晶體管2250個,主頻最高740KHz,字長是4位。那麽跟今天相比,它的各項指標都顯得非常落後了。現在的微處理器制造工藝已經達到了10納米這個量級晶體管數量甚至可以達到數十億。而主頻也提高了幾千倍。字長現在常用的是64位或者32位。但是如果跟馮·諾依曼所處的時代相比4004已經擁有了非常不錯的性能。實際上4004擁有與ENIAC相當的性能,那4004是用來做什麽的呢?其實他最初的目的並不是用來制造計算機的。
這就是4004最初的產品。大家看是什麽?其實他就是一個計算器。和我們現在經常拿在手上用的是同一個類型。那麽當時,正是應日本一家生產廠商的要求,intel才設計了4004。那我們把這臺機器打開看一看,這是這臺機器的主板,我們把一個局部放大,中間這塊金色的芯片自然就是4004,他旁邊這塊芯片是4001,是一塊只讀的存儲器,它裏面存放著一些指令,但是只能讀,不能寫,它的特點是斷電以後,內容不會丟失。4004左邊這塊是4002,是一塊隨機存儲器。它的特點在於可以很方便的進行讀和寫,但是斷電以後內容就會丟失。那麽4003呢是移位計算機的芯片,實際用來負責進行輸入和輸出。那我們可以看到4004之所以叫做4004,其實它還有一幫兄弟,從4001、4002到4003,他們和4004一起呢構成了一個完整的芯片組。
這個芯片的組合被稱為MCS。那這張照片是這個芯片組的另一種實現,同樣也連接了這個計算器的鍵盤和打印機的輸出。雖然這只是一個計算器,還算不上一臺計算機,但他和馮諾依曼結構有著簡潔明了的對應關系。首先4004作為微處理器或者叫CPU,其實包含了運算器和控制器的功能,4002對應著存儲器,而鍵盤通過一片4003進行連接構成了輸入設備。另一片4003連接了打印機,構成了輸出設備。在這裏我們就可以看到這個計算器其實非常簡潔明了的對應了馮諾依曼結構。至於4001他並不屬於我們現在要說的馮諾依曼結構的五大組成部分。但是在馮諾依曼結構當中也有它的一席之地, 這一點我們以後再說。
回來看馮諾依曼結構的要點。馮諾依曼結構中規定了計算機的五大組成部分。第一部分,運算器,簡稱CA,這是英文中央算術運算的縮寫。第二部分控制器,簡稱CC,這是中央控制的縮寫。存儲器,簡稱M。輸入設備,簡稱I。輸出設備,簡稱O。這五大部分連接形成一體。就構成了馮諾依曼結構的計算機。
那麽馮諾依曼結構除了說明計算機應該由這五大部分組成之外,還指出計算機的數據和程序均已二級制代碼的形式,不加區別的存放在存儲器中,存放的位置由存儲器的地址指定。第三, 計算機在工作時能夠自動的從存儲器中取出指令加以執行。當然這份報告中描述內容還有很多,我們先來看這幾點。其實第二點和第三點,其核心內容就是我們所說的存儲程序的概念。那我們就圍繞著運算器、控制器和存儲器這一部分,先來看一看存儲程序到底指的是什麽。
運算器、控制器和存儲器是馮諾依曼結構的核心。如果要與現代計算機進行對照的話,運算器和控制器應該對應於現在計算機中的CPU,而存儲器應該對應於現在計算機中的主存儲器,我們又常稱之為主存或者內存。CPU和主存儲器之間一般通過系統總線進行連接。
我們以個人計算機為例,在這塊個人計算機的主板上會有CPU芯片、主存,通過主板上的系統總線進行連接。首先我們來看主存是如何組織的。
我們要關註兩個名詞。一個是地址,一個是內容。地址是指每個存儲單元對應的序號,一般是從0開始,0、1、2、3逐個編制,在這裏我們是用二進制進行表示的。而內容是指存儲單元中存放的信息,在現在的計算機當中一般一個存儲單元就是一個字節,也就是8個二進制位。主存的地址和內容的關系我們再來解釋一下。就好比有這麽一個貨架,這個貨架有四層。那我們為每一格進行一個編號,編為第0格、第1格、第2格、第3格,這些編號就相當於主存的地址,而貨架上存放的物品就是貯存的內容。主存中存放的就是我們計算機當中所需要使用的程序和數據。那麽存儲程序的概念又是如何體現的呢?我們一起來看。
如果把馮諾依曼結構的計算機比作一個餐館的話,其中的CPU就好比是廚房,主存好比是餐館當中的倉庫。在CPU當中大廚自然是控制器,運算器呢就好比是廚具。你給了他不同的原料,經過運算以後就可以得到相應的結果。那麽在倉庫當中就放滿著我們剛才所說過的那樣的貨架,有很多,而且貨架是被連續編號(主存地址)的。第一個貨架編了0,1,2,3,第二個是4,5,6,7,後面我們應該還能看到有很多的貨架。那麽這些貨架上放的是什麽呢?我們會看到這裏有一些像一張一張紙一樣的東西,它就是這個餐館廚師會要用到的任務單,上面會寫著要你這個廚師接下來該做一些什麽事。一張任務單上寫著一條指令,可能是要你炒一個菜,也可能要你從廚房搬個東西,這都有可能,對於計算機來說這就是一條一條的指令。若幹條的指令就可以組合成一個程序,把這個程序存放在存儲器當中,這就是存儲程序的一個很重要的概念。後面這些蔬菜實際上就是餐館的原料了,就相當於計算機當中的數據。這裏就體現出了馮·諾依曼結構當中所說的將程序和數據不加區分的存放在存儲器當中。那麽不是馮·諾依曼結構又是什麽樣的呢?就好比這個餐館裏的庫房裏存放的全是原料,就是這些蔬菜,原料。 沒有這些任務單,廚師的任務呢是通過別的方式發布給廚師的。比如說要通過餐館的經理,直接把任務單送到廚師這來,送一張任務單廚師就完成一項任務,這就是ENIAC的工作方式。那大家覺得這樣有什麽不好呢?這似乎更自然一些,我們現實生活中也是這樣的,哪有把廚師要做的任務單跟這些蔬菜放到一起呢,對吧。前提在於現實生活中這樣的運轉可能沒有問題,餐館經理給廚師下達的任務單速度也挺快,送來一張任務單,廚師做一盤菜,過一會兒又送來一張任務單,廚師再做一盤菜。銜接是非常合適的。對於計算機來說,它的要點在於CPU運轉的很快,即使ENIAC那個時候速度也是相當快的,而外部人們能給它下指令的速度太慢了,我們想象一下這個餐館如果開在火星,我們一次已經把他做菜所需要的原料運到這火星這個餐館的倉庫裏了,但是廚師要做的事情呢卻是由我們地球上的這個經理一張一張任務單送過去,我們現在到火星送一張任務單過去可能要花一年的時間,廚師收到這張任務單以後,很快就從倉庫裏取來蔬菜,然後做了一盤菜可能就花十分鐘的時間,然後他怎麽辦呢?只能坐在那接著等第二張任務單,因為他不知道下面該做什麽了。再等一年再收到一張任務單,再花十分鐘做一盤菜。這樣的效率大家看到是非常低的,這正好就是ENIAC的工作方式。
現在我們就能明白了馮·諾依曼結構中存儲程序的概念。計算機所需要的程序和數據,通過輸入設備進入了存儲器,控制器發出地址給存儲器,獲得程序當中的對應的指令,還可以得到相應的數據。控制器發命令給運算器,指揮運算器對數據進行相應的運算。運算器可能會返回一些運算的狀態,比如說是否正確完成等等,最後還會將運算的結果存放到存儲器中。最後還需要通過輸出設備將結果輸出到計算機外部的某些存儲介質上。這樣才能完成整個計算的過程。
現在我們已經知道了馮·諾依曼結構中最重要的部分。那這個結構又是如何運轉的呢?下一節我們將通過一個小故事來了解這一點。
2.2 馮·諾伊曼結構的要點