中斷方式與輪詢方式
標簽(空格分隔): 計算機
原文鏈接:http://lionwq.spaces.eepw.com.cn/articles/article/item/18936#
此文章僅僅用於本人練習MarkDown語法之用,如果作者本人覺得侵權,請留言,本人立即刪除
1. 中斷方式的基本概念
程序中斷通常簡稱中斷,是指CPU在正常運行程序的過程中,由於預選安排或發生了各種隨機的內部或外部事件,使CPU中斷正在運行的程序,而轉到為相應的服務程序去處理,這個過程稱為程序中斷。
2. 80 x86微處理器的中斷
80 x86微處理器的中斷類型一般分為2類,即由於執行某些指令引起的軟中斷和由處理器以外其他控制電路發出中斷請求信號引起的硬中斷。 CPU要從主程序轉入中斷服務程序,必須知道該中斷服務程序的入口地址,即中斷向量。80 x86為CPU的PC機共有256個中斷向量。
中斷的一般過程:
主程序只是在設備A,B,C數據准備就緒時,才去處理A,B,C,進行數據交換。在速度較慢的外圍設備准備自己的數據時,CPU照常執行自己的主程序 。在這個意義上說,CPU和外圍設備的一些操作是並行地進行的,因而同串行進行的程序查詢方式相比,計算機系統的效率是大大提高了。如下圖:
Start-->|主程序| node1
node1 --> node2
node2 --> node3
node3 --> End
A[鼠標]-->|請求中斷| node1
node1 --> |響應中斷| A
B[鍵盤]-->|請求中斷| node2
node2 --> |響應中斷| B
C[攝像頭]-->|請求中斷| node3
node3 --> |響應中斷| C
實際的中斷過程還要復雜一些,下圖示出了中斷處理過程的詳細流程圖.當CPU執行完—條現行指令時,如果外設向CPU發出中斷請求
,那么CPU在滿足響應條件的情況下,將發出中斷響應
信號,與此同時關閉中斷
(中斷屏蔽
觸發器置1
),表示CPU不再受理另外—個設備的中斷。這時、CPU將尋找中斷請求源
是哪個設備。並保存CPU自己的程序計數器(PC)的內容
.然后,它將轉移到處理該中斷源的中斷服務程序
.CPU再保存現場信息
,執行設備服務(如交換數據)以后.將恢復現場信息
。在這些動作完成以后,開放中斷
(中斷屏蔽
觸發器置0
),並返回到原來被中斷的主程序的下一條指令。
start=>start
op1=>operation: 取指令
op2=>operation: 執行指令
op3=>operation: 響應中斷
op4=>operation: 轉移到中斷服務子程序
op5=>operation: 關閉中斷,中斷屏蔽復位
op6=>operation: 找出中斷源,保存計數器(PC)
op7=>operation: 保存CPU現場
op8=>operation: 執行設備服務
op9=>operation: 恢復CPU現場
op10=>operation: 打開中斷,返回主程序執行下一條命令
cond1=>condition: 中斷
sub1=>subroutine: 中斷服務程序(比如鍵盤輸入響應程序)
start->op1->op2->cond1
cond1(no)->op1
cond1(yes)->op3->op4->sub1->op9->op10->op1
- 盡管外界中斷請求是隨機的,但CPU只有在當前一條指令執行完畢后,即轉入公操作[1]時才受理設備的中斷請求,這樣才不致於使當前指令的執行受到干擾。公操作是指一條指令執行結束后CPU所進行的操作,如中斷處理、直接內存傳送、取下條指令等。外界中斷請求信號通常存放在接口中的
中斷源鎖存器
里,並通過中斷請求線連至CPU,每當一條指令執行到末尾,CPU便檢查中斷請求信號。若中斷請求信號為1
,則CPU轉入中斷周期
,受理外界中斷。 - 為了在中斷服務程序執行完畢以后正確地返回到原來主程序被中斷的斷點(PC內容)而繼續執行主程序,必須把程序計數器PC的內容,以及當前指令執行結束后CPU的狀態(包括寄存器的內容和一些狀態標志位)都保存到堆棧中去。這些操作叫做保存現場。
- 當CPU響應中斷后,正要去執行中斷服務程序時,可能有另一個新的中斷源向它發出中斷請求。為了不致造成混亂,在CPU的中斷管理部件中必須有一個
中斷屏蔽觸發器
,它可以在程序的控制下置1
(設置屏蔽),或置0
(取掉屏蔽)。只有在中斷屏蔽標志為0
時,CPU才可以受理中斷。當一條指令執行完畢,CPU接受中斷請求並作出響應時,它一方面發出中斷響應信號INTA
,另一方面把中斷屏蔽標志置1
,即關閉中斷。這樣,CPU不能再受理另外的新的中斷源發來的中斷請求。只有在CPU把中斷服務程序執行完畢以后,它才重新使中斷屏蔽標志置0
,即開放中斷,並返回主程序。因此,中斷服務程序的最后必須有兩條指令
,即開中斷指令
和返主指令
,同時在硬件上要保證返主指令執行以后才受理新的中斷請求。 - 中斷處理過程是由
硬件
和軟件
結合來完成的。如在前圖中,中斷周期由硬件實現,而中斷服務程序由機器指令序列
實現。后者除執行保存現場
、恢復現場
、開放中斷並返回主程序
任務外,對要求中斷的設備進行服務,使其同CPU交換一定的數據,或作其他服務。
3. 輪詢方式的基本概念
輪詢(Polling)I/O方式
,也稱作程序控制I/O方式
,是讓CPU以一定的周期按次序查詢每一個外設,看它是否有數據輸入或輸出的要求,若有,則進行相應的輸入/輸出
服務;若無,或I/O處理完畢后,CPU就接着查詢下一個外設。
- 所需硬件:外設接口提供狀態端口、數據端口
- 軟件機制:應用程序必須定時查詢各個接口的狀態端口,判斷是否需要輸入、輸出數據,如果需要,則通過數據端口進行數據操作。
- 特點:CPU通過執行指令主動對外部設備進行查詢,外部設備處於被動地位 。
st=>start: 開始
end=>end: 結束
cond1=>condition: 設備需要數據交換
sub1=>subroutine: 執行一段應用程序
cond2=>condition: 是否結束
op1=>operation: 通過端口執行數據交換
st->cond1
cond1(no)->sub1->cond2
cond1(yes)->op1->sub1
cond2(yes)->end
cond2(no)->cond1
4. 輪詢方式與中斷方式的比較
速度
程序控制方式
硬件的速度指標:由於程序控制方式
完全采用軟件的方式對外設接口進行控制,所以它的硬件操作只是普通的端口讀寫,並無特別之處,其速度指標由總線傳輸速度
、端口的響應速度
共同決定。
對於這種外設控制方式,速度指標關鍵在於軟件。
中斷處理方式
中斷處理方式本身所作的原子操作解釋和程序控制方式是一致的。
只不過因為加入了中斷請求和響應機制,對狀態端口的讀取變成了在中斷響應過程中對中斷號的讀取,對狀態端口的判斷變成了對中斷入口地址的確定。
從本質上來說,中斷處理方式和程序控制方式本身的速度指標一致,沒有大的差別。
可靠性
程序控制方式
由於硬件不支持中斷方式,因此操作系統把CPU控制權交給應用程序后,只要應用程序不交還CPU控制權,操作系統就始終不能恢復對CPU的控制(無定時中斷)。應用程序與操作系統都是軟件模塊,操作系統屬於核心模塊,它們之間存在交接CPU控制權的關系。正是由於這樣的關系,一旦使用對外設的程序控制方式
時,應用程序出現死鎖,則操作系統永遠無法恢復對系統的控制。應用程序的故障通過外設控制方式波及到作為核心模塊的操作系統,因此,根據關聯可靠性指標的計算可知,程序控制方式
的關聯可靠性指標很低。
中斷處理方式
由於提供定時中斷,操作系統可以在應用程序當前時間片結束后通過中斷服務程序重新獲得對CPU的控制權。應用程序的故障不會波及到操作系統,因此,中斷處理方式的關聯可靠性指標高。
可擴展性
程序控制方式
由於所有應用程序中都包含對端口的操作,一旦硬件接口的設計發生變化,則所有應用程序都必須進行修改,這會使修改費用升高很多倍。因此,程序控制方式會使相關硬件模塊的局部修改指標相對較低。
中斷處理方式
應用程序不直接操作端口,對端口的操作是由中斷服務程序來完成的。如果某個硬件接口的設計發生了變化,只需要修改它相關的中斷服務程序即可。因此,中斷處理方式使得相關硬件模塊的局部修改指標較高。
生命期
程序控制方式(CPU查詢方式)
在早期的計算機系統中能夠滿足應用需求;但是隨着外部設備種類的增多、速度差異的加大,這種方式逐漸成為系統性能提高的障礙。它的生命期只限於早期計算機階段,因為當時外部設備少,且都是低速設備,到8位機出現以后,這種外設控制方式(體系結構)被淘汰。
中斷處理方式(外設請求方式)
能夠協調CPU與外設間的速度差異,能夠協調各種外設間的速度差異,提高系統的工作效率(速度指標)。使應用程序與外設操作基本脫離開來,降低了程序的設備相關性(關聯可靠性指標、局部修改指標)。雖然目前某些快速設備相互間的通信沒有通過CPU,也沒有使用中斷處理方式,但是對於慢速設備、設備故障的處理來說,中斷處理方式仍然是最有效的。無論將來計算機系統中的元件怎樣變化,只要存在慢速設備與快速CPU之間的矛盾,使用中斷處理方式都是適合的。即便不使用中斷服務程序,中斷的概念也會保持很久。在短時期內,計算機系統還無法在所有領域離開人工交互操作,人的操作速度一定比機器的處理速度慢,因此慢速設備將仍然保持存在(但這不是慢速設備存在的唯一原因)。正因為存在這樣的需求,中斷處理方式具有較長的生命期。
公操作:所謂公操作,就是一條指令執行完畢后,CPU所開始進行的一些操作,這些操作主要是CPU對外圍設備請求的處理,如中斷處理、通道處理等。如果外圍設備沒有向CPU請求交換數據,那么CPU又轉向下一條指令。由於所有指令的取指周期是完全一樣的,因此,取指令也可以認為是
公操作
。這是因為,一條指令執行結束后,如果沒有外設請求,CPU一定轉 入“取指令”操作。 ↩︎