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