做 在線觀看免費網(wǎng)站網(wǎng)站投放廣告費用
馮諾依曼模型
馮諾依曼模型主要由五部分組成:運算器、控制器、存儲器、輸入設備、輸出設備。
控制器(Control Unit):從內存中取指令、翻譯指令、分析指令,然后根據(jù)指令的內存向有關部件發(fā)送控制命令,控制相關部件執(zhí)行指令所包含的操作。
運算器(ALU):處理數(shù)據(jù),完成各種算術運算和邏輯運算。
計算機運算時,運算器的操作對象和操作種類由控制器決定。運算器操作的數(shù)據(jù)從內存中讀取,處理的結果再寫入內存(或暫時放在內部寄存器中),而且運算器對內存數(shù)據(jù)的讀寫是由控制器來進行的。
存儲器(Memory):存儲程序和各種數(shù)據(jù)。
- 內部存儲器(內存、主存):存取速度快,容量小價格高。用來存放即將執(zhí)行的程序和數(shù)據(jù),可供CPU直接讀取。
- 隨機存儲器(RAM):可以被CPU隨機讀取(讀取任何一個地址數(shù)據(jù)的速度是一樣的,寫入任何一個地址數(shù)據(jù)的速度也是一樣的),一般存放CPU將要執(zhí)行的程序、數(shù)據(jù),斷電丟失。
- 只讀存儲器(ROM):只能被CPU讀,不能輕易被CPU寫,用來存儲永久性的程序和數(shù)據(jù),比如:系統(tǒng)引導程序、監(jiān)控程序等。掉電易失。
- 高速緩存存儲器(cache):Cache是計算機中的一個高速小容量存儲器,其中存放的是CPU近期要執(zhí)行的指令和數(shù)據(jù),其存取速度可以和CPU的速度匹配,一般采用靜態(tài)RAM充當Cache。
- 外部存儲器:存取速度慢。用來存放暫時不用的程序和數(shù)據(jù),可以和內存交換數(shù)據(jù),不需要依賴電來存儲數(shù)據(jù)。如硬盤、光盤...
輸入設備與輸出設備:鼠標、鍵盤、顯示器、打印機等
存儲單元與輸入輸出設備要和中央處理器打交道的話離不開總線。所以他們的關系如下:
內存
我們的程序和數(shù)據(jù)都存儲在內存,存儲的區(qū)域是線性的。
在計算機數(shù)據(jù)存儲中,存儲數(shù)據(jù)的基本單位是字節(jié)(byte), 1字節(jié) = 8 位(bit)。每個字節(jié)都對應一個內存地址。
內存的地址是從 0 開始編號的,然后自增排序,最后一個地址為內存總字節(jié)數(shù)-1,這種結構與程序中的數(shù)組類似,所以內存中讀寫任何一個數(shù)據(jù)的速度都是相同的。
中央處理器
中央處理器也就是CPU,32位和64位CPU的主要區(qū)別在于一次性能計算多少字節(jié)數(shù)據(jù):
- 32位CPU一次可以計算4個字節(jié)
- 64位CPU一次可以計算8個字節(jié)
這里的32位和64位,通常稱為CPU的位寬,代表的是CPU一次可以計算(運算)的數(shù)據(jù)量。
之所以CPU要這樣設計,是為了能計算更大的數(shù)值,如果是8位CPU那么一次只能計算一個字節(jié)- 0~255范圍內的數(shù)值,這樣就無法完成1000*500的計算,為了能一次計算大數(shù)的運算,CPU需要支持多個byte一起計算,所以CPU位寬越大,可以計算的數(shù)值就越大,比如32位CPU能計算的最大整數(shù)是4294967295。
CPU內部還有一些組件,常見的有寄存器、控制單元和邏輯運算單元。其中,控制單元負責控制CPU的工作,邏輯運算單元負責計算,而寄存器可以分為多種類型,每種寄存器的功能不盡相同。
為什么有了內存還需要寄存器?
因為內存離CPU太遠了,而寄存器就在CPU內,緊挨著控制單元和邏輯運算單元,速度會更快。
常見寄存器種類:
- 通用寄存器,用來存放需要進行運算的數(shù)據(jù),比如需要進行加和運算的兩個數(shù)據(jù)
- 程序計數(shù)器,用來存儲CPU要執(zhí)行的下一條指令[所在的內存地址],注意不是存儲下一條要執(zhí)行的指令,此時指令還在內存中,程序計數(shù)器只是存儲了下一條指令[的地址]。
- 指令寄存器,用來存放當前正在執(zhí)行的指令,也就是指令本身,指令被執(zhí)行完之前都存儲在這里。
總線
總線是用于CPU和內存以及其他設備之間的同學,總線分為三種:
- 地址總線,用于指定CPU將要操作的內存地址
- 數(shù)據(jù)總線,用于讀寫內存的數(shù)據(jù)
- 控制總線,用于發(fā)送和接收信號,比如中斷、設備復位等信號
當CPU要讀寫內存數(shù)據(jù)的時候,一般需要通過下面這三個總線:
- 首先要通過[地址總線]來指定內存的地址
- 然后通過[控制總線]控制是讀或寫的命令
- 最后通過[數(shù)據(jù)總線]來傳輸數(shù)據(jù)
線路位寬與CPU位寬
數(shù)據(jù)是如何通過線路傳輸?shù)哪?#xff1f;其實是通過操作電壓,低電壓表示0,高電壓表示1.
如果構造了 高低高 這樣的電壓,其實就是 101 二進制,十進制表示5,如果只有一條線路,就意味著每次只能傳遞1bit的數(shù)據(jù),即0 或 1 ,那么傳輸 101 這個數(shù)據(jù),就需要3次才能傳輸完成,這樣效率非常低。
這樣一位一位傳輸?shù)姆绞?#xff0c;稱為串行,下一個bit必須等待上一個bit傳輸完成才能進行傳輸。想一次傳多一些數(shù)據(jù),增加線路即可,這時數(shù)據(jù)就可以并行傳輸。
為了避免低效率的串行傳輸方式,線路的位寬最好一次能夠訪問到所有的內存地址。
CPU想要操作[內存地址]就需要[地址總線]:
- 如果地址總線只有1條,那每次只能表示 [ 0 或 1]這兩種地址,所以CPU能操作的內存地址最大數(shù)量為 2 個。(不能理解為同時操作兩個內存地址)
- 如果地址總線有2條,那么能表示00、01、10、11四種地址,所以CPU能操作的內存地址最大數(shù)量為 4 個
那么,想要CPU操作4G的內存,就需要 32條地址總線。?
CPU的位寬最好不要小于線路的位寬 ,比如32位CPU控制40位寬的地址總線和數(shù)據(jù)總線的話,工作起來會非常麻煩,所以32位的CPU最好和32位寬的線路搭配,因為32位CPU一次最多只能操作32位寬的地址總線和數(shù)據(jù)總線。
如果用32位CPU去加和兩個64位大小的數(shù)字·,就需要把這兩個64位的數(shù)字分成2個低位32位數(shù)字和2個高位32位數(shù)字來計算,先加兩個低位的32位數(shù)字,算出進位,然后加和兩個高位的32位數(shù)字,最后再加上進位就能算出結果了,可以發(fā)現(xiàn)32位CPU并不能一次性算出加和兩個64位的數(shù)字的結果。
對于64位CPU就可以一次性算出加和兩個64位數(shù)字的結果,因為64位CPU可以一次讀入64位的數(shù)字,并且64位CPU內部的邏輯運算單元也支持64位數(shù)字的計算。
但是并不代表64位CPU性能比32位CPU高很多,很少應用需要算超過32位的數(shù)字,所以如果計算的數(shù)額不超過32位數(shù)字的情況下,32位和64位CPU之間沒什么區(qū)別,只有當計算超過32位數(shù)字的情況下,64位的優(yōu)勢才能體現(xiàn)出來。
另外,32位CPU最大只能操作4GB內存,就算裝了8GB的內存條,也沒用。而64位CPU尋址范圍則很大,理論最大尋址空間為.
程序執(zhí)行的基本過程
程序實際上是一條一條的指令,所以程序的運行過程就是把每一條指令一步一步的執(zhí)行起來,負責執(zhí)行指令的就是CPU。
?CPU執(zhí)行程序的過程如下:
- CPU讀取[程序計數(shù)器]的值,這個值是指令的內存地址,然后CPU的[控制單元]操作[地址總線]指定需要訪問的內存地址,接著通知內存設備準備數(shù)據(jù),數(shù)據(jù)準備好后通過[數(shù)據(jù)總線]將指令數(shù)據(jù)傳給CPU,CPU收到內存?zhèn)鱽淼臄?shù)據(jù)后,將這個指令數(shù)據(jù)存入到[指令寄存器]。
- [程序計數(shù)器]的值自增,表示指向下一個指令[地址]。這個自增的大小由CPU的位寬決定,比如32位的CPU,指令是4個字節(jié),需要4個內存地址存放,因此[程序計數(shù)器]的值會加4。
- CPU分析[指令寄存器]中的指令,確定指令的類型和參數(shù),如果是計算類型的指令,就把指令交給[邏輯運算單元]運算;如果是存儲類型的指令,則交由[控制單元]執(zhí)行。
總結:一個程序執(zhí)行的時候,CPU會根據(jù)程序計數(shù)器的內存地址,從內存里面把需要執(zhí)行的指令讀到指令寄存器里面執(zhí)行,然后根據(jù)指令長度自增,開始順序讀取下一條指令。
CPU從程序計數(shù)器讀取指令、到執(zhí)行、再到下一條指令,這個過程會不斷循環(huán),直到程序結束,這個不斷循環(huán)的過程被稱為CPU的指令周期
a = 1 + 2的具體執(zhí)行過程
CPU是不認識 a = 1 + 2 這個字符串的,這些字符串只是方便我們認識,想要這段程序能跑起來,還需要把整個程序翻譯成匯編語言的程序,這個過程被稱為編譯
除此之外,我們還需要用匯編器翻譯成機器碼,這些機器碼由 0 和 1 組成機器語言,這一條條機器碼,就是一條條的計算機指令,這個才是CPU認識的東西。
?a = 1 + 2 在32位CPU的執(zhí)行過程。
程序編譯過程中,編譯器通過分析代碼,發(fā)現(xiàn) 1 和 2 是數(shù)據(jù),于是程序運行時,內存會有一個專門的區(qū)域來存放這些數(shù)據(jù),這個區(qū)域就是[數(shù)據(jù)段]。
- 數(shù)據(jù)1被存放到0x200位置
- 數(shù)據(jù)2被存放到0x204位置
數(shù)據(jù)和指令是分開存放的,存放數(shù)據(jù)的區(qū)域稱為[數(shù)據(jù)段],存放指令的區(qū)域稱為[正文段]。
編譯器會把 a = 1 + 2 翻譯成 4 條指令,存放到正文段中。如圖,這4條指令被存放到了0x100~0x10c的區(qū)域中:
- 0x100的內容是 load 指令將0x200地址中的數(shù)據(jù) 1 裝入到寄存器 R0 ;
- 0x104的內容是 load 指令將0x204地址中的數(shù)據(jù) 2 裝入到寄存器 R1 ;
- 0x108的內容是 add 指令將寄存器 R0 和 R1 的數(shù)據(jù)相加,并把結果存放到寄存器 R2 ;
- 0x10c的內容是 store 指令將寄存器 R2 中的數(shù)據(jù)存回數(shù)據(jù)段中的0x208地址中,這個地址也就是變量 a 內存中的地址;
編譯完成后,具體執(zhí)行程序的時候,程序計數(shù)器會被設置為0x100地址,然后依次執(zhí)行這4條指令。(上面的例子中,由于是在32位CPU執(zhí)行的,因此指令是占32位大小,所以每條指令的地址隔4個字節(jié)。數(shù)據(jù)的大小事根據(jù)程序中指定的變量類型,比如 int 類型的數(shù)據(jù)占4個字節(jié),char類型的數(shù)據(jù)占1個字節(jié))
總結
64位相比32位優(yōu)勢在哪? 64位CPU性能一定比32位CPU高很多嗎?
64位相比32位CPU的優(yōu)勢主要體現(xiàn)在兩個方面:
- 64位CPU可以一次計算超過32位的數(shù)字,而32位CPU如果要計算超過32位的數(shù)字,要分多步驟進行計算,效率就沒那么高,但是大部分應用程序很少會計算那么大的數(shù)字,所以只有運算大數(shù)字的時候,64位CPU的優(yōu)勢才能體現(xiàn)出來,否則和32位CPU的計算性能相差不大。
- 通常來說64位CPU的地址總線是48位,而32位CPU的地址總線是32位,所以64位CPU可以尋址更大的物理內存空間。如果一個32位CPU的地址總線是32位那么該CPU的最大尋址能力是4G,即使使用8G大小的內存,也還是只能尋址到4G大小的地址,而如果一個64位CPU的地址總線是48位,那么該CPU的最大尋址范圍是
,遠超于32位CPU的最大尋址能力。
32位軟件和64位軟件的區(qū)別?32位操作系統(tǒng)能夠運行在64位電腦上嗎?
64位和32位軟件,實際上代表指令是64位還是32位:
- 如果32位指令在64位機器上執(zhí)行,需要一套兼容機制就可以做到兼容運行了。但是如果64位指令在32位機器上運行,就比較困難,因為32位寄存器存不下64位的指令。
- 操作系統(tǒng)其實也是一種程序,操作系統(tǒng)也分為32位和64位,其代表的意思就是操作系統(tǒng)中程序的指令是多少位,64位操作系統(tǒng)指令為64位,不能裝在32位的機器上。
硬件的64位和32位指的是CPU的位寬,軟件的32位和64位指的是指令的位寬。