程序是如何在 CPU 中運(yùn)行的(三)
筆者能力有限,如果文章出現(xiàn)錯(cuò)誤的地方歡迎各位朋友能夠給我指出來(lái),我將不勝感激,謝謝~
前言
在之前的兩篇文章中,在 程序是如何在 CPU 中運(yùn)行的(一)中講述了一條一條指令和數(shù)據(jù)是如何在 CPU 中被運(yùn)行的,在 程序是如何在 CPU 中運(yùn)行的 (二)中以 PC 寄存器為中心,從匯編語(yǔ)言的角度闡述了程序是如何在 CPU 中有序執(zhí)行的,該篇文章講述流水線機(jī)制在 CPU 中的應(yīng)用。
相關(guān)概念
在進(jìn)入流水線的講解之前,有必要知道兩個(gè)概念,一個(gè)是指令周期,一個(gè)是時(shí)鐘周期。
指令周期:指令周期的意思從其名稱(chēng)就能看出來(lái),就是運(yùn)行一條指令的時(shí)間,筆者在該系列文章的第一篇中說(shuō)到一條指令的運(yùn)行能夠大致分為三個(gè)階段:取指 -> 譯碼 -> 執(zhí)行,也就是說(shuō)這三個(gè)階段執(zhí)行的總的時(shí)間就是指令周期,也可以用下面這樣的一張圖表示,循環(huán)的執(zhí)行取指,譯碼,執(zhí)行的周期就稱(chēng)之為指令周期。
指令周期 時(shí)鐘周期:時(shí)鐘周期就是我們 CPU 的主頻,也就是晶振帶來(lái)的每一次“滴答”,就是時(shí)鐘周期時(shí)間。
了解了這兩個(gè)概念之后,我們首先來(lái)看單指令周期處理器。
單指令周期處理器
在引入流水線機(jī)制之前,先來(lái)看看單指令周期處理器,之所以稱(chēng)之為單指令周期處理器,是因?yàn)檫@樣機(jī)制的處理器在運(yùn)行一條指令的時(shí)候,從取指到譯碼到執(zhí)行,不能有第二條指令的加入,也就是說(shuō)如果前后有兩條指令需要運(yùn)行,那第二條指令的運(yùn)行必須等待第一條指令運(yùn)行完畢之后才能得到運(yùn)行。
前文所述一條指令大致可以分為三個(gè)階段執(zhí)行,而這個(gè)過(guò)程的執(zhí)行,至少都需要一個(gè)時(shí)鐘周期,因?yàn)樵谌≈傅臅r(shí)候我們的 PC 指針寄存器在一個(gè)時(shí)鐘周期的驅(qū)動(dòng)下遞增,從而實(shí)現(xiàn)下一條指令的取指,同樣的,為了盡可能地提高 CPU 效率,我們也希望指令的運(yùn)行能夠在一個(gè)時(shí)鐘周期內(nèi)完成,既然所有的指令的運(yùn)行都在一個(gè)時(shí)鐘周期內(nèi)運(yùn)行,但是指令各有不同,有的指令執(zhí)行的時(shí)間長(zhǎng),有的指令執(zhí)行的時(shí)間短,因此,為了兼顧所有指令都能夠得到運(yùn)行,那么時(shí)鐘周期就應(yīng)該滿足執(zhí)行時(shí)間最長(zhǎng)的指令的運(yùn)行,下面展示了三條不同的指令在一個(gè)時(shí)鐘周期內(nèi)所占的時(shí)間。
通過(guò)上圖我們可以明顯的看到采用單指令周期機(jī)制的弊端,時(shí)鐘周期受到最長(zhǎng)執(zhí)行時(shí)間指令的影響,而對(duì)于執(zhí)行時(shí)間較短的指令來(lái)說(shuō),又會(huì)有大部分時(shí)間處于啥也干不了的狀態(tài),浪費(fèi)了資源,這樣的機(jī)制雖然使得每一條指令都在一個(gè)時(shí)鐘周期內(nèi)就執(zhí)行完畢了,但是也降低了 CPU 的主頻,因?yàn)槿绻叩脑?,有些?fù)雜的指令就不能執(zhí)行完。
基于此,也就有了流水線技術(shù)的出現(xiàn)。
流水線設(shè)計(jì)
流水線的概念來(lái)源于工業(yè)制造領(lǐng)域,可以以汽車(chē)裝配為例子來(lái)解釋流水線的工作方式,假設(shè)裝配一輛汽車(chē)需要四個(gè)步驟:沖壓 -> 焊接 -> 涂裝 -> 總裝,最簡(jiǎn)單的方式就是先裝配一輛汽車(chē),裝配完一輛之后,在裝下一輛,這樣的方式就類(lèi)似我們上述講的單指令周期處理器的工作方式。所以為了使得工作效率提高,人們提出了流水線的工作方式,也就是說(shuō)當(dāng)?shù)谝惠v汽車(chē)裝配到第二道工序(焊接)的時(shí)候,第二輛汽車(chē)開(kāi)始第一道工序(沖壓),這樣也就不會(huì)使得第一輛汽車(chē)裝配完了之后才裝配第二輛汽車(chē),大大地提高了工作效率。
那么 CPU 又是如何以流水線機(jī)制運(yùn)行的呢?我們?cè)谇拔囊恢痹谏婕暗揭粋€(gè)概念,就是說(shuō)一條指令的運(yùn)行大致可以分為三個(gè)階段:取址 ->譯碼 -> 執(zhí)行,在這里我們將其再進(jìn)行細(xì)分,因?yàn)樵谡麄€(gè)的執(zhí)行過(guò)程中,還包括從寄存器或者內(nèi)存中讀取數(shù)據(jù),通過(guò) ALU 進(jìn)行計(jì)算,再將結(jié)果寫(xiě)回到寄存器或者內(nèi)存中,所以,也就是說(shuō)一條指令的運(yùn)行也可以細(xì)分為五個(gè)階段,如下圖所示:
這細(xì)分的各個(gè)步驟就像汽車(chē)裝配的各個(gè)工序,在單指令周期中,必須等一條指令運(yùn)行完上述所有的步驟之后,才進(jìn)行下一條指令的運(yùn)行,但是引入流水線之后,當(dāng)?shù)谝粭l指令執(zhí)行到第二個(gè)步驟(譯碼)的時(shí)候,第二條指令就可以執(zhí)行第一個(gè)步驟(取指)了,詳細(xì)地運(yùn)行步驟如下圖所示:
通過(guò)上圖可以很清楚地看到指令流水線的執(zhí)行過(guò)程,這里要指出的一點(diǎn)是由于上圖將一條指令的執(zhí)行過(guò)程拆分成了五個(gè)步驟來(lái)執(zhí)行,所以上述所示的流水線也被稱(chēng)之為五級(jí)流水線,在圖中我們可以看到取指和譯碼兩個(gè)步驟不是緊挨著的,這是因?yàn)樽g碼這個(gè)步驟執(zhí)行的時(shí)間要短于取指執(zhí)行的時(shí)間,所以在執(zhí)行譯碼之前要等待一會(huì)兒。另外,圖中,筆者用紅色箭頭標(biāo)注了一個(gè)時(shí)鐘周期所對(duì)應(yīng)的指令,可以看到在這個(gè)時(shí)鐘周期里運(yùn)行著五條指令的不同階段。因此,對(duì)于五級(jí)流水線的定義也可以是這樣的:五級(jí)的流水線,就表示我們?cè)谕粋€(gè)時(shí)鐘周期里面,同時(shí)運(yùn)行五條指令的不同階段。至此,關(guān)于流水線的基本概念就介紹完了,下面,我們來(lái)看一下,使用流水線相和單指令周期運(yùn)行同樣的指令的差異。
單指令周期和流水線的比較
首先,我們看這樣一個(gè)例子,我們順序執(zhí)行三條指令:
一條整數(shù)的加法,需要 200ps
一條整數(shù)的乘法,需要 300ps
一條浮點(diǎn)數(shù)的乘法,需要 600ps
根據(jù)前文所述,單指令周期處理器的時(shí)鐘周期取決于執(zhí)行時(shí)間最長(zhǎng)的指令,在這里也就是 600 ps,那么在單指令周期下三條指令的執(zhí)行過(guò)程是這樣的:
通過(guò)上圖我們可以看到受到最長(zhǎng)執(zhí)行時(shí)間指令的影響,現(xiàn)在的時(shí)鐘周期為 600ps,并且由于是單指令周期,指令的執(zhí)行必須執(zhí)行完第一條之后才能執(zhí)行第二條,因此,執(zhí)行完三條指令的時(shí)間是 1800 ps。
我們接下來(lái)看有流水線技術(shù)后,指令的執(zhí)行時(shí)間是多少,為了使得圖更加直觀,這里采用6級(jí)流水線,時(shí)鐘周期定為 100 ps,執(zhí)行示意圖如下:
通過(guò)上圖可以看到流水線技術(shù)的引入使得指令的運(yùn)行不必等待上一條指令完全執(zhí)行完才執(zhí)行下一條指令,從花費(fèi)的時(shí)間上看 6 級(jí)流水線執(zhí)行三條指令花費(fèi)了 800 ps,而單指令周期處理器卻花費(fèi)了 1800 ps,可見(jiàn)差距是巨大的。
嵌入式處理器流水線
上述便是關(guān)于單指令周期和流水線的大致內(nèi)容,那在嵌入式中常用的處理器又是怎么一回事呢,我們拿我們經(jīng)常接觸的 ARM Cortex M3 的處理器來(lái)說(shuō),下圖是筆者在權(quán)威指南中看到的一張圖:
從圖中我們可以看到,Cortex-M3處理器是三級(jí)流水線,在指令的運(yùn)行過(guò)程中,處理器將其分為 取指 -> 譯碼 -> 執(zhí)行 三個(gè)步驟。而我們常見(jiàn)的 51 單片機(jī)在運(yùn)行時(shí)是沒(méi)有流水線的,也可以理解為單流水線。
總結(jié)
上述就是關(guān)于流水線技術(shù)和單指令周期的相關(guān)內(nèi)容,當(dāng)然這只是很小的一部分,真實(shí)的處理器上的流水線遠(yuǎn)遠(yuǎn)不止如此,還會(huì)涉及到其他的處理,比如分支預(yù)測(cè),亂序執(zhí)行等等,詳細(xì)系統(tǒng)的知識(shí)還得學(xué)習(xí)計(jì)算機(jī)組成原理的相關(guān)內(nèi)容,這次的分享就到這里啦~
您的在看是最我最大的鼓勵(lì),您的建議是對(duì)我最大的提升,歡迎點(diǎn)擊下方圖片進(jìn)入小程序進(jìn)行評(píng)論
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!





