本文轉載自inter官方網址:https://software.intel.com/zh-cn/articles/book-Processor-Architecture_CPU_work_process
CPU的工作過程
CPU的基本工作是執行存儲的指令序列,即程序。程序的執行過程實際上是不斷地取出指令、分析指令、執行指令的過程。
CPU從存放程序的主存儲器里取出一條指令,譯碼並執行這條指令,保存執行結果,緊接着又去取指令,譯碼,執行指令……,如此周而復始,反復循環,使得計算機能夠自動地工作。除非遇到停機指令,否則這個循環將一直進行下去。其過程如圖3-3所示
圖3-3 程序的執行過程
3.2.1 指令的執行過程
幾乎所有的馮•諾伊曼型計算機的CPU,其工作都可以分為5個階段:取指令、指令譯碼、執行指令、訪存取數和結果寫回。如圖3-4所示。
圖3-4 指令的執行過程
1.取指令階段
取指令(Instruction Fetch,IF)階段是將一條指令從主存中取到指令寄存器的過程。
程序計數器PC中的數值,用來指示當前指令在主存中的位置。當一條指令被取出后,PC中的數值將根據指令字長度而自動遞增。若為單字長指令,則(PC)+1PC,若為雙字長指令,則(PC)+2PC,依此類推。
2.指令譯碼階段
取出指令后,計算機立即進入指令譯碼(Instruction Decode,ID)階段。
在指令譯碼階段,指令譯碼器按照預定的指令格式,對取回的指令進行拆分和解釋,識別和區分出不同的指令類別及各種獲取操作數的方法。
在組合邏輯控制的計算機中,指令譯碼器對不同的指令操作碼產生不同的控制電位,以形成不同的微操作序列;在微程序控制的計算機中,指令譯碼器用指令操作碼找到執行該指令的微程序的入口,並從此入口開始執行。
在傳統的設計里,CPU中負責指令譯碼的部分是無法改變的硬件。不過,在眾多運用微程序控制技術的新型CPU中,微程序有時是可重寫的,可以通過修改成品CPU來改變CPU的譯碼方式。
3.執行指令階段
在取指令和指令譯碼階段之后,接着進入執行指令(Execute,EX)階段。
此階段的任務是完成指令所規定的各種操作,具體實現指令的功能。為此,CPU的不同部分被連接起來,以執行所需的操作。
例如,如果要求完成一個加法運算,算術邏輯單元(ALU)將被連接到一組輸入和一組輸出,輸入端提供需要相加的數值,而輸出端將含有最后的運算結果。
4.訪存取數階段
根據指令需要,有可能要訪問主存,讀取操作數,這樣就進入了訪存取數(Memory,MEM)階段。
此階段的任務是:根據指令地址碼,得到操作數在主存中的地址,並從主存中讀取該操作數用於運算。
5.結果寫回階段
作為最后一個階段,結果寫回(Writeback,WB)階段把執行指令階段的運行結果數據“寫回”到某種存儲形式。結果數據經常被寫到CPU的內部寄存器中,以便被后續的指令快速地存取。在有些情況下,結果數據也可被寫入相對較慢、但較廉價且容量較大的主存。許多指令還會改變程序狀態字寄存器中標志位的狀態,這些標志位標識着不同的操作結果,可被用來影響程序的動作。
在指令執行完畢、結果數據寫回之后,若無意外事件(如結果溢出等)發生,計算機就接着從程序計數器PC中取得下一條指令地址,開始新一輪的循環,下一個指令周期將正常地順序取出下一條指令。
許多新型CPU可以同時取出、譯碼和執行多條指令,體現出並行處理的特性。
3.2.2 指令周期
1.指令周期的基本概念
(1)指令周期
CPU取出一條指令並執行該指令所需的時間稱為指令周期。
指令周期的長短與指令的復雜程度有關。
(2)CPU周期
指令周期常常用若干個CPU周期數來表示。
由於CPU內部的操作速度較快,而CPU訪問一次主存所花的時間較長,因此通常用從主存讀取一條指令的最短時間來規定CPU周期。
CPU周期也稱為機器周期。
(3)時鍾周期
一個CPU周期包含有若干個時鍾周期。
時鍾周期是處理操作的最基本時間單位,由機器的主頻決定。
一個CPU周期的時間寬度由若干個時鍾周期的總和決定。
圖3-5為采用定長CPU周期的指令周期示意圖。
圖3-5 指令周期
(4)取出和執行任何一條指令所需的最短時間為兩個CPU周期。
任何一條指令,它的指令周期至少需要兩個CPU周期,而復雜指令的指令周期則需要更多的CPU周期。這是因為,一條指令的取出階段需要一個CPU周期時間,而一條指令的執行階段則需要至少一個CPU周期時間。由於不同復雜度指令的執行周期所需的CPU周期數不盡相等,因此,各種指令的指令周期也是不盡相同的。
例題3-1:現有一個由5條典型指令組成的程序(如表3-1所示),請分析每一條指令的指令周期。
表3-1 一個由5條典型指令組成的程序
主存儲器
|
操作說明
|
|
---|---|---|
地址
|
指令或數據內容
|
|
…
|
…
|
|
020
|
CLA
|
0→AC,累加器AC清零
|
021
|
ADD 30
|
(AC)+(30)AC,累加器AC的值與主存地址30中的數據相加,結果存入累加器AC
|
022
|
STA 40
|
(AC)40,把累加器AC的值存入主存地址40
|
023
|
NOP
|
空操作,沒有任何功能
|
024
|
JMP 21
|
無條件轉移到主存地址21處開始執行
|
…
|
…
|
|
030
|
|
操作數
|
…
|
…
|
|
040
|
|
存放運算結果
|
…
|
…
|
|
【解】
①CLA指令
CLA指令是一條不訪問主存的清零指令,它需要2個CPU周期,其中取指令階段需要1個CPU周期,執行指令階段需要1個CPU周期。
圖3-6 CLA指令周期
在第1個CPU周期,即取指令階段,CPU從主存取出指令,對程序計數器PC加1,並對指令操作碼進行譯碼,以確定執行何種操作;
在第2個CPU周期,即執行指令階段,CPU完成指令所要求的操作。
②ADD 30指令
ADD 30指令是一條訪問主存取數並執行加法的指令,其指令周期由3個CPU周期組成,其中取指令階段需要1個CPU周期,執行指令階段需要2個CPU周期。
圖3-7 ADD 30指令周期
在第1個CPU周期,即取指令階段,CPU從主存取出指令並譯碼,以確定執行何種操作;
執行指令階段由2個CPU周期組成,其中在第2個CPU周期,CPU將指令的地址碼(操作數地址)部分(30)送往地址寄存器,並完成地址譯碼,而在第3個CPU周期,CPU從主存取出操作數,並執行加法操作。
③STA 40指令
STA 40指令是一條訪問主存的存數指令,其指令周期由3個CPU周期組成,其中取指令階段需要1個CPU周期,執行指令階段需要2個CPU周期。
圖3-8 STA 40指令周期
在第1個CPU周期,即取指令階段,CPU從主存取出指令並譯碼,以確定執行何種操作;
執行指令階段由2個CPU周期組成,其中在第2個CPU周期,CPU將指令的地址碼(操作數地址)部分(40)送往地址寄存器,並完成地址譯碼,而在第3個CPU周期,CPU把累加寄存器的內容寫入主存單元(40)中。
④NOP指令
NOP指令是一條空操作指令,沒有任何功能,相當於CPU空轉,但仍需要2個CPU周期,其中取指令階段需要1個CPU周期,執行指令階段需要1個CPU周期。(指令周期圖與圖3-6 CLA指令相同)
在第1個CPU周期,即取指令階段,CPU從主存取出指令並譯碼,以確定執行何種操作;
在第2個CPU周期,即執行指令階段,操作控制器不發出任何控制信號,CPU不做任何操作。
⑤JMP 21指令
JMP 21指令是一條直接尋址的程序控制(轉移)指令,由2個CPU周期組成,其中取指令階段需要1個CPU周期,執行指令階段需要1個CPU周期。
圖3-9 JMP 21指令周期
在第1個CPU周期,即取指令階段,CPU從主存取出指令並譯碼,以確定執行何種操作;
在第2個CPU周期,即執行指令階段,CPU把指令的地址碼(轉移地址)部分(21)送到程序計數器PC中,從而改變程序的執行順序,實現程序的無條件轉移。
2.用指令流程圖表示指令周期
在進行計算機設計時,可以像畫程序流程圖那樣,采用指令流程圖來表示一條指令的指令周期。
在指令流程圖中,
方框:代表一個操作步驟,方框中的內容表示數據通路的操作或某種控制操作。
菱形框:通常用來表示某種判別或測試,其動作依附於它前面的一個方框。
公操作符號“~”:表示一條指令已經執行完畢,轉入公操作。所謂公操作,就是一條指令執行完畢后,CPU所開始進行的一些操作,這些操作主要是CPU對外設請求的處理。如果外設沒有向CPU請求交換數據,那么CPU又轉向主存取下一條指令。
例題3-2:對於例題3-1中由5條典型指令組成的程序,請用指令流程圖表示其指令周期。
【解】
圖3-10 用指令流程圖表示指令周期
由圖3-10可見,所有指令的取指階段是完全相同的,而且是一個CPU周期。
但是指令的執行階段,由於各條指令的功能不同,所用的CPU周期是各不相同的。其中,CLA、NOP、JMP指令是一個CPU周期,ADD、STA指令是兩個CPU周期。
一般指令流程圖有一個公共的流程段和許多並列的分支。公共流程段是取指令操作的流程序列。取指令操作是每條指令共同的操作步驟,而且所有的指令讀取步驟是相同的,所以所有讀指令的操作流程是相同的。執行指令階段的操作是各指令互不相同的操作,所以在取指令階段之后,流程就根據指令分成許多分支,通常為每種指令都安排一個分支流程。
例題3-3:如圖3-11所示為雙總線結構機器的數據通路,IR為指令寄存器,PC為程序計數器(具有自增功能),M為主存(受R/W信號控制),AR為主存地址寄存器,DR為數據寄存器,ALU由+、-控制信號決定完成何種操作,控制信號G控制的是一個門電路。另外,線上標注有控制信號,例如Yi表示Y寄存器的輸入控制信號,R1o為寄存器R1的輸出控制信號,未標字符的線為直通線,不受控制。
“ADD R2,R0”指令完成(R0)+(R2)→R0的功能操作,試畫出其指令周期流程圖(假設該指令的地址已放入PC中),並列出相應的微操作控制信號序列。
圖3-11 雙總線結構機器的數據通路
【解】
“ADD R2,R0”指令是一條加法指令,參與運算的兩個數放在寄存器R2和R0中,指令周期流程圖包括取指令階段和執行指令階段兩部分。根據給定的數據通路圖,“ADD R2,R0”指令的詳細指令周期流程圖如圖3-12所示,圖的右邊部分標注了每一個機器周期中用到的微操作控制信號序列。
圖3-12 “ADD R2,R0”指令的詳細指令周期流程圖
3.2.3 時序發生器
1.時序信號
在計算機高速運行的過程中,計算機內各部件的每一個動作都必須嚴格遵守時間規定,不能有任何差錯。
計算機內各部件的協調動作需要時間標志,而時間標志則是用時序信號來體現的。
計算機各部分工作所需的時序信號,在CPU中統一由時序發生器來產生。
例題3-4:用二進制碼表示的指令和數據都放在主存里,那么CPU是怎樣識別出它們是數據還是指令呢?
【解】
從時間上來說,取指令事件發生在指令周期的第一個CPU周期中,即發生在“取指令”階段,而取數據事件發生在指令周期的后面幾個CPU周期中,即發生在“執行指令”階段。
從空間上來說,如果取出的代碼是指令,那么一定送往指令寄存器,如果取出的代碼是數據,那么一定送往運算器。
2.時序發生器
CPU中的時序信號發生器,其功能是用邏輯電路來發出時序信號,實現時序控制,使計算機可以准確、迅速、有條不紊地工作。
時序信號發生器是產生指令周期控制時序信號的部件,當CPU開始取指令並執行指令時,操作控制器利用時序信號發生器產生的定時脈沖的順序和不同的脈沖間隔,提供計算機各部分工作時所需的各種微操作定時控制信號,有條理、有節奏地指揮機器各個部件按規定時間動作。
從操作控制器設計方法而言,組合邏輯控制器的時序電路比較復雜,而微程序控制器的時序電路則比較簡單。
3.2.4 控制方式
控制器控制一條指令運行的過程是依次執行一個確定的操作序列的過程。
為了使機器能夠正確執行指令,控制器必須能夠按正確的時序產生操作控制信號。
控制不同操作序列的時序信號的方法,稱為控制器的控制方式。
控制方式通常分為三種:同步控制方式、異步控制方式、聯合控制方式,其實質反映了時序信號的定時方式。
1.同步控制方式
同步控制方式是指操作序列中每一步操作的執行,都由確定的具有基准時標的時序信號來控制,其特點是系統有一個統一的時鍾,所有的控制信號均來自這個統一的時鍾信號。
在同步控制方式中,在任何情況下,給定的指令在執行時所需的CPU周期數和時鍾周期數都是固定不變的。
同步控制方式有時又稱為固定時序控制方式或無應答控制方式。
根據不同情況,同步控制方式可選取以下幾種方案:
- 采用完全統一的機器周期執行各種不同的指令。顯然,對簡單指令和簡單的操作而言,這將造成時間上的浪費。
- 采用不定長機器周期。將大多數操作安排在一個較短的機器周期內完成,而對於某些時間緊張的操作,則采取延長機器周期的辦法來加以解決。
- 中央控制與局部控制結合。將大部分指令安排在固定的機器周期完成(稱為中央控制),而對於少數復雜指令(乘、除、浮點運算)則采用另外的時序進行定時(稱為局部控制)。
同步控制方式設計簡單,操作控制容易實現。
2.異步控制方式
異步控制方式是一種按每條指令、每個操作的實際需要而占用時間的控制方式,不同指令所占用的時間完全根據需要來決定。
在異步控制方式中,每條指令的指令周期既可由數量不等的機器周期數組成,也可由執行部件完成CPU要求的操作后發回控制器的應答信號來決定。也就是說,CPU訪問的每個操作控制信號的時間由其需要占用的時間來決定,每條指令、每個操作控制信號需要多少時間就占用多少時間。
顯然,用這種方式形成的操作控制序列沒有固定的CPU周期數和嚴格的時鍾周期與之同步,所以稱為異步方式。
異步控制方式有時又稱為可變時序控制方式或應答控制方式。
在異步控制方式下,指令的運行效率高,但控制線路的硬件實現比較復雜。
異步控制方式在計算機中得到了廣泛的應用。例如CPU對主存的讀寫、I/O設備與主存的數據交換等一般都采用異步控制方式,以保證執行時的高速度。
3.聯合控制方式
現代計算機系統中一般采用的方式是同步控制和異步控制相結合的方式,即聯合控制方式。
聯合控制方式的設計思想是:在功能部件內部采用同步控制方式,而在功能部件之間采用異步控制方式,並且在硬件實現允許的情況下,盡可能多地采用異步控制方式。
聯合控制方式通常選取以下兩種方案:
- 大部分操作序列安排在固定的機器周期中,對某些時間難以確定的操作則以執行部件的應答信號作為本次操作的結束;
- 機器周期的時鍾周期數固定,但是各條指令周期的機器周期數不固定。