CPU的發(fā)展史
CPU的工作原理
總的來說锁摔,CPU從內(nèi)存中一條一條地取出指令和相應(yīng)的數(shù)據(jù),按指令操作碼的規(guī)定识椰,對(duì)數(shù)據(jù)進(jìn)行運(yùn)算處理绝葡,直到程序執(zhí)行完畢為止。
CPU指令周期
指令周期是取出并執(zhí)行一條指令的時(shí)間腹鹉。指令周期常常有若干個(gè)CPU周期藏畅,CPU周期也稱為機(jī)器周期,由于CPU訪問一次內(nèi)存所花費(fèi)的時(shí)間較長功咒,因此通常用內(nèi)存中讀取一個(gè)指令字的最短時(shí)間來規(guī)定CPU周期愉阎。
一條指令還是相當(dāng)復(fù)雜的,處理器在一個(gè)時(shí)鐘周期內(nèi)肯定是完不成的力奋,可能需要好多個(gè)時(shí)鐘周期來完成執(zhí)行榜旦。如果這樣讓處理器執(zhí)行完一條指令,再去執(zhí)行另一條景殷,處理器的效率是很低的溅呢,假如一條指令是5個(gè)時(shí)鐘周期完成,對(duì)于500MHZ的處理器串行運(yùn)行指令猿挚,1秒內(nèi)取指100000000次咐旧。
因此處理器引入了流水線技術(shù),將一條指令劃分為多個(gè)功能绩蜻,由不同的功能部件來執(zhí)行铣墨,并且這些功能部件可以并行工作。
流水線技術(shù)
CPU在工作時(shí)办绝,需要將一條指令分為多個(gè)步驟依次執(zhí)行(注意硬件不同有可能不一樣),由于每一個(gè)步會(huì)使用到不同的硬件操作伊约,比如取指時(shí)會(huì)只有PC寄存器和存儲(chǔ)器姚淆,譯碼時(shí)會(huì)執(zhí)行到指令寄存器組,執(zhí)行時(shí)會(huì)執(zhí)行ALU(算術(shù)邏輯單元)屡律、寫回時(shí)使用到寄存器組腌逢。為了提高硬件利用率,CPU指令是按流水線技術(shù)來執(zhí)行的疹尾,如下:
從圖中可以看出當(dāng)指令1還未執(zhí)行完成時(shí)上忍,第2條指令便利用空閑的硬件開始執(zhí)行,這樣做是有好處的纳本,如果每個(gè)步驟花費(fèi)1ms,那么如果第2條指令需要等待第1條指令執(zhí)行完成后再執(zhí)行的話腋颠,則需要等待5ms繁成,但如果使用流水線技術(shù)的話,指令2只需等待1ms就可以開始執(zhí)行了淑玫,這樣就能大大提升CPU的執(zhí)行性能巾腕。
理想情況下,CPU按照流水線執(zhí)行指令絮蒿,然而指令流水線除了在資源不足的情況下會(huì)卡住之外尊搬,指令之間的相關(guān)性也是導(dǎo)致流水線阻塞的重要原因。
雖然流水線技術(shù)可以大大提升CPU的性能土涝,但不幸的是一旦出現(xiàn)流水中斷佛寿,所有硬件設(shè)備將會(huì)進(jìn)入一輪停頓期,當(dāng)再次彌補(bǔ)中斷點(diǎn)可能需要幾個(gè)周期但壮,這樣性能損失也會(huì)很大冀泻,就好比工廠組裝手機(jī)的流水線,一旦某個(gè)零件組裝中斷蜡饵,那么該零件往后的工人都有可能進(jìn)入一輪或者幾輪等待組裝零件的過程弹渔。因此我們需要盡量阻止指令中斷的情況,指令重排就是其中一種優(yōu)化中斷的手段溯祸。
指令亂序
指令流水線并不是串行的肢专,并不會(huì)因?yàn)橐粋€(gè)耗時(shí)很長的指令在“執(zhí)行”階段呆很長時(shí)間,而導(dǎo)致后續(xù)的指令都卡在“執(zhí)行”之前的階段上焦辅。相反博杖,流水線是并行的,多個(gè)指令可以同時(shí)處于同一個(gè)階段氨鹏,只要CPU內(nèi)部相應(yīng)的處理部件未被占滿即可欧募。
然而,這樣一來仆抵,亂序可能就產(chǎn)生了跟继。比如一條加法指令原本出現(xiàn)在一條除法指令的后面种冬,但是由于除法的執(zhí)行時(shí)間很長,在它執(zhí)行完之前舔糖,加法可能先執(zhí)行完了娱两。再比如兩條訪存指令,可能由于第二條指令命中了cache而導(dǎo)致它先于第一條指令完成金吗。
一般情況下十兢,指令亂序并不是CPU在執(zhí)行指令之前刻意去調(diào)整順序。CPU總是順序的去內(nèi)存里面取指令摇庙,然后將其順序的放入指令流水線旱物。但是指令執(zhí)行時(shí)的各種條件,指令與指令之間的相互影響卫袒,可能導(dǎo)致順序放入流水線的指令宵呛,最終亂序執(zhí)行完成。這就是所謂的“順序流入夕凝,亂序流出”宝穗。
CPU的亂序執(zhí)行并不是任意的亂序,而是以保證程序上下文因果關(guān)系為前提的码秉。有了這個(gè)前提逮矛,CPU執(zhí)行的正確性才有保證。
相比于CPU的亂序转砖,編譯器的亂序才是真正對(duì)指令順序做了調(diào)整须鼎。但是編譯器的亂序也必須保證程序上下文的因果關(guān)系不發(fā)生改變。