Linux運維-必備專業知識馮諾伊曼體系
摘 要:馮·諾伊曼結構(von Neumann architecture),也稱普林斯頓結構,是一種將程序指令存儲器和數據存儲器合並在一起的電腦設計概念結構。描述的是一種實現通用圖靈機的計算設備,以及一種相對於並行計算的串行式結構參考模型(referential model)。
本結構隱約指導了將存儲設備與中央處理器分開的概念,因此依本結構設計出的計算機又稱存儲程序型電腦。
關鍵字:馮·諾依曼體系結,馮·諾依曼理論,計算機,二進制
馮諾伊曼體系
一、發展背景
最早的計算機器僅內涵固定用途的程序。現代的某些計算機依然維持這樣的設計方式,通常是為了簡化或教育目的。例如一個計算器僅有固定的數學計算程序,它不能拿來當作文字處理軟件,更不能拿來玩游戲。若想要改變此機器的程序,你必須更改線路、更改結構甚至重新設計此機器。當然最早的計算機並沒有設計的那個可編程化。當時所謂的“重寫程序”很可能指的是紙筆設計程序步驟,接著制訂工程細節,再施工將機器的電路配線或結構改變。
而存儲程序型電腦的概念改變了這一切。借由創造一組指令集結構,並將所謂的運算轉化成一串程序指令的運行細節,讓此機器更有彈性。借著將指令當成一種特別型態的靜態數據,一台存儲程序型電腦可輕易改變其程序,並在程控下改變其運算內容。馮·諾伊曼結構與存儲程序型電腦是互相通用的名詞,其用法將於下述。而哈佛結構則是一種將程序數據與普通數據分開存儲的設計概念,但是它並未完全突破馮.諾伊曼架構。
存儲程序型概念也可讓程序運行時自我修改程序的運算內容。本概念的設計動機之一就是可讓程序自行增加內容或改變程序指令的存儲器位置,因為早期的設計都要用戶手動修改。但隨著索引暫存器與間接位置訪問變成硬件結構的必備機制後,本功能就不如以往重要了。而程序自我修改這項特色也被現代程序設計所棄揚,因為它會造成理解與除錯的難度,且現代中央處理器的管線與高速緩存機制會讓此功能效率降低。
從整體而言,將指令當成數據的概念使得匯編語言、編譯器與其他自動編程工具得以實現;可以用這些“自動編程的程序”,以人類較易理解的方式編寫程序[1];從局部來看,強調I/O的機器,例如Bitblt,想要修改畫面上的圖樣,以往是認為若沒有客制化硬件就辦不到。但之後顯示這些功能可以借由“運行中編譯”技術而有效達到。
此結構當然有所缺陷,除了下列將述的馮·諾伊曼瓶頸之外,修改程序很可能是非常具傷害性的,無論無意或設計錯誤。在一個簡單的存儲程序型電腦上,一個設計不良的程序可能會傷害自己、其他程序甚或是操作系統,導致死機。緩存溢出就是一個典型例子。而創造或更改其他程序的能力也導致了惡意軟件的出現。利用緩存溢出,一個惡意程序可以覆蓋調用堆棧(Call stack)並改寫代碼,並且修改其他程序文件以造成連鎖破壞。存儲器保護機制及其他形式的訪問控制可以保護意外或惡意的代碼更動。
二、體系結構
2.1體系結構
(1)采用存儲程序方式,指令和數據不加區別混合存儲在同一個存儲器中,(數據和程序在內存中是沒有區別的,它們都是內存中的數據,當EIP指針指向哪 CPU就加載那段內存中的數據,如果是不正確的指令格式,CPU就會發生錯誤中斷. 在現在CPU的保護模式中,每個內存段都其描述符,這個描述符記錄著這個內存段的訪問權限(可讀,可寫,可執行).這最就變相的指定了哪個些內存中存儲的是指令哪些是數據)
指令和數據都可以送到運算器進行運算,即由指令組成的程序是可以修改的。
(2)存儲器是按地址訪問的線性編址的一維結構,每個單元的位數是固定的。
(3)指令由操作碼和地址組成。操作碼指明本指令的操作類型,地址碼指明操作數和地址。操作數本身無數據類型的標志,它的數據類型由操作碼確定。
(4)通過執行指令直接發出控制信號控制計算機的操作。指令在存儲器中按其執行順序存放,由指令計數器指明要執行的指令所在的單元地址。指令計數器只有一個,一般按順序遞增,但執行順序可按運算結果或當時的外界條件而改變。
(5)以運算器為中心,I/O設備與存儲器間的數據傳送都要經過運算器。
(6)數據以二進制表示。
2.2馮? 諾依曼體系結構實例
我們想想這個:Cpu的控制器共有32個變化位,那它怎麼跟內存進行通信呢?
Cpu要想和內存通信,彼此之間必須通過一種媒介,連接起來。
想想我們需要把一箱貨物運送到另一個地方,需要用車拉,車拉上後通過公路進行搬運,這樣才能運送到目的地。
Cpu也如此,需要靠線路運送,我們把線路叫總線(Bus)。 你可以理解為線路
那一條線路是不是很慢,多一點,兩天路並行,那一下就可以發兩條數據過去,那我們總線是多大呢?32根總線,每一個總線連接一個尋址位,這樣可以達到4G的尋址能力。那這個總線上它實際上是從我們從存儲器中讀取數據和指令。
數據和指令在cpu中放置的位置是不一樣的,數據是靠運算器運算的,指令靠控制器控制的,而且他們放置的寄存器也不一樣。
所以既有數據總線,指令總線,為了避免更復雜,總線是合並起來的,復用的。對於cpu來講,讀數據和指令都通過總線來實現,這種cpu跟內存交換數據的總線叫做前端總線。
Cpu和內存的速度是不一樣的,這個速度叫做帶寬。兩者速度不匹配。
Cpu的時鐘周期,即運算頻率,例:3.0GHz
內存的頻率, 例:1333MHz
大家知道頻率(Hz)是單位時間的變化量,是靠時間為驅動的,因此cpu的驅動能力是靠時間的流逝來完成的,大家應該記住這點,所以計算機的大多數操作都是時間驅動的概念,必須要靠時鐘驅動。
這又引出一個問題,當我拿了一塊表,我可以很明確的知道現在的時間是多少,但如果我有兩塊表,兩塊表的時間不一致,是不是我就很難准確的知道現在的時間。這就是手表定理。
同樣的,cpu有自己的頻率,內存也有自己的頻率,由於cpu和內存頻率不匹配。這樣計算方法就不一樣了,因此為了讓大家的始終周期是一致的,或者說是讓時間長度是一致的,主板或者各種芯片需要在某種晶體振蕩器下按照某種固定的頻率計算時間。
這些跟linux沒有什麼關系,是計算機的基礎知識。
2.3 cpu計算1+1實例
以cpu計算1+1為例:
請問:當我們要計算1+1時,cpu怎麼知道我們要計算1+1?
Cpu本身不是什麼智能中心,我們要計算1+1,cpu怎麼知道我們要計算1+1?為什麼不是1*1呢,思考下。
那麼,這就意味著,我們要計算1+1.那麼我們就要把1+1= 這個需求做成一個獨立的程序,程序是什麼呢,說白了,就是能被cpu自動裝入,能夠有一個入口,讓cpu自動執行它的指令集合。
大家要知道,cpu在內部,cpu的生產廠商無論是IBM,intel,AMD.他們生產的cpu都是內身都有一定的微碼(匯編語言),能夠完成一定意義上的智能操作,這個智能操作就包括能從某一個位置載入某段程序,並讓他運行起來,所以每個芯片都有內置的智能接口,這個接口是通過微碼(匯編語言)向外提供的,
而且其中的程序必須要按照某種格式,而且必須是二進制格式,從入口出開始執行。這就意味著控制器要告訴運算器程序從哪一位開始運算。
那麼我們程序就必須告訴控制器“1”在哪個位置,“+”在哪個位置,因此,控制器在讀到程序指令時,就知道需要在某個地址讀取數據,將數據載入進來,
於是,控制器就控制著操作過程,通過總線向存儲器發送指令,存儲器就把該地址數據(假設“1”數據)放在地址總線,於是cpu得到此數據( “1”數據)。 同樣的,“1”“+”都被讀進來,於是控制器控制計算器進行計算。
需要記住這一點,讀取被加數需要一個時鐘周期(就是一個Hz),讀取加數有需要一個時鐘周期,讀取操作福也需要一個時鐘周期,在經過一個周期運算器計算結束,在經過一個周期,運算器把運算結果放在總線上。
所以就算是1+1這一個過程,在cpu內部就要經過n個周期才能完成,注意這點。這一切都要靠控制器完成。
運算是靠運算器完成的,控制器剛讀進來數據時,運算器不能馬上就計算,就要依次讀進來“1”“1”“+”才能計算,所以其內部就有一個暫存的空間叫做寄存器,暫存數據,當所有運算數據讀進來就可以運算了。
2.4特點
(1)計算機處理的數據和指令一律用二進制數表示
(2)順序執行程序
計算機運行過程中,把要執行的程序和處理的數據首先存入主存儲器(內存),計算機執行程序時,將自動地並按順序從主存儲器中取出指令一條一條地執行,這一概念稱作順序執行程序。
(3)計算機硬件由運算器、控制器、存儲器、輸入設備和輸出設備五大部分組成。
三、影響
馮.諾依曼體系結構是現代計算機的基礎,現在大多計算機仍是馮.諾依曼計算機的組織結構,只是作了一些改進而已,並沒有從根本上突破馮體系結構的束縛。馮.諾依曼也因此被人們稱為“計算機之父”。然而由於傳統馮.諾依曼計算機體系結構天然所具有的局限性,從根本上限制了計算機的發展。
根據馮·諾依曼體系結構構成的計算機,必須具有如下功能:把需要的程序和數據送至計算機中。必須具有長期記憶程序、數據、中間結果及最終運算結果的能力。能夠完成各種算術、邏輯運算和數據傳送等數據加工處理的能力。能夠根據需要控制程序走向,並能根據指令控制機
馮· 諾依曼體系結構
馮· 諾依曼體系結構
器的各部件協調操作。能夠按照要求將處理結果輸出給用戶。
將指令和數據同時存放在存儲器中,是馮·諾依曼計算機方案的特點之一 計算機由控制器、運算器、存儲器、輸入設備、輸出設備五部分組成 馮·諾依曼提出的計算機體系結構,奠定了現代計算機的結構理念
四、其他結構
4.1哈佛結構
(英語:Harvard architecture)是一種將程序指令儲存和數據儲存分開的存儲器結構。中央處理器首先到程序指令儲存器中讀取程序指令內容,解碼後得到數據地址,再到相應的數據儲存器中讀取數據,並進行下一步的操作(通常是執行)。程序指令儲存和數據儲存分開,數據和指令的儲存可以同時進行,可以使指令和數據有不同的數據寬度,如Microchip公司的PIC16芯片的程序指令是14位寬度,而數據是8位寬度。
哈佛結構的微處理器通常具有較高的執行效率。其程序指令和數據指令分開組織和儲存的,執行時可以預先讀取下一條指令。
在Linux運維之前,需要搞清楚很多計算機基礎問題,比如馮諾伊曼體系,哈佛結構等等。
2014年1月5日