輪詢與中斷
外部裝置與**處理器互動一般有兩種手段:輪詢和中斷。
(1)輪詢(polling)
很多i/o裝置都有乙個狀態暫存器,用於描述裝置當前的工作狀態,每當裝置狀態發生改變時,裝置將修改相應狀態暫存器位。通過不斷查詢裝置的狀態暫存器,cpu就可以了解裝置的狀態,從而進行必要的i/o操作。為了節約cpu資源,查詢工作往往不是連續的,而是定時進行。
輪詢方式具有簡單、易實現、易控制等優勢,在很多小型系統中有大量應用。對那些實時敏感性不高、具有大量cpu資源的系統來說,輪詢方式有很廣泛的應用。最典型的用途就是在那些任務比較單一的微控制器上,嵌入式系統中也有應用。
輪詢的一種典型的實現可能是這樣的:while(true);當然這裡的select()也可以使用poll()替換。
輪詢方式主要存在以下不足:
<1>增加系統開銷。無論是任務輪詢還是定時器輪詢都需要消耗對應的系統資源。
<2>無法及時感知裝置狀態變化。在輪詢間隔內的裝置狀態變化只有在下次輪詢時才能被發現,這將無法滿足對實時性敏感的應用場合。
<3>浪費cpu資源。無論裝置是否發生狀態改變,輪詢總在進行。在實際情況中,大多數裝置的狀態改變通常不會那麼頻繁,輪詢空轉將白白浪費cpu時間片。
(2)中斷(interrupt)
中斷,顧名思義,就是打斷正在進行中的工作。中斷不需要處理器輪詢裝置的狀態,裝置在自己發生狀態改變時將主動傳送乙個訊號給處理器(pic),後者在接收到這一通知訊號時,會掛起當前正在執行的任務轉而去處理響應外設的中斷請求。中斷通知機制通過硬體訊號非同步喚起處理器的注意,解決了外部裝置與處理器之間速度不匹配導致的資源浪費問題。
現代裝置絕大多數採用中斷的方式與處理器進行溝通,因此裝置驅動程式必須能夠支援裝置的中斷特性。處理器在中斷到達時會根據不同的中斷號找到對應裝置(irr),並對中斷請求進行響應處理。中斷處理例程isr(interrupt service routine)由裝置驅動程式提供,並在裝置驅動模組初始化時註冊到系統中斷向量表中。從裝置發出中斷訊號,到處理器最終呼叫isr進行處理,期間會經過很多步驟,這個過程構成了中斷處理框架。中斷處理框架包括了進入isr之前的很多進入路徑(entry path),例如mips下要經歷這樣幾個步驟:設定或遮蔽相關暫存器;進入異常入口點取指;現場保護;異常分類(mips下中斷也是一種異常)處理;查詢中斷向量表路由isr。不同的作業系統對中斷處理框架的設計不盡相同,但是要達到的目的是一樣的,那就是最終呼叫使用者註冊的裝置isr。
(3)中斷與輪詢的折衷
雖然輪詢方式存在空轉損耗導致名聲不佳,但並非一無是處。中斷模型也並非十全十美,其高優先順序的vip待遇和快速響應要求在極端條件下將造成「活鎖」效應。有時候需要發揮粗暴中斷和溫和輪詢各自的優勢,根據實際應用情景,在兩種模式之間切換。手機導航杆卡死情形的處理是個很好的案例。
在過去的一些手機和pda裝置上安裝有導航杆,它支援3種動作(順時針旋轉、逆時針旋轉和按鍵),可方便選單導航。導航杆的三種動作都會向處理器發出中斷。系統中通用的目的i/o(gpio)埠和導航杆連線。中斷處理函式的工作就是檢視gpio資料暫存器解析出導航杆運動。假定導航杆由於存在運動部件(如旋輪偶爾被卡住)引起的固有的硬體問題,從而在gpio埠產生不同於方波的波形。被卡住的旋輪會不停地產生假的中斷,並可能使系統凍結。為了解決這個問題,可以捕獲波形分析,在卡住的情況下動態地從中斷模式切換到輪詢模式。如果旋輪恢復正常,再動態地從輪詢模式切換到中斷模式,軟體也恢復正常模式。
在本文的最後,將介紹linux網路裝置驅動模型中的napi機制 ,它採用「中斷+輪詢」的處理方式代替純中斷處理方式,是中斷和輪詢的完美合體。
中斷向量表
中斷向量表其實是處理器內部的概念,因為處理器除了會被外部裝置中斷外,其內部也可能產生異常等事件,例如在mips中,中斷只是異常的一種。當這些事件發生時,cpu必須暫停手頭上的工作,轉而去處理中斷或異常,因此處理器需要知道到**去獲得這些中斷或異常的處理函式的目標位址。中斷向量表就是用來解決這個問題,其中每一項都是乙個中斷或異常處理函式的入口位址,具體來說4個位元組的函式指標將指向一段彙編微碼(intconnectcode)執行跳轉。
外部裝置的中斷常常對應向量表中的某一項,這是通用框架的外部中斷處理函式入口,因此在進入通用的中斷處理函式之後,系統必須知道正在處理的中斷是哪乙個裝置產生的,而這正是由軟體中斷號irq定的決。中斷向量表的內容是由作業系統在初始化階段來填寫,對於外部中斷,作業系統負責實現乙個通用的外部中斷處理函式,然後把這個函式的入口位址放到中斷向量表中的對應位置。使用者註冊裝置驅動isr,實際上就是掛接到中斷向量表中,覆蓋某一項的預設處理實現特化。
參考:
《深入linux核心架構》
《精通linux裝置驅動程式開發》
《深入linux裝置驅動程式核心機制》
《中斷和中斷處理》
《linux中的中斷處理分析》
《pci 中斷路由機制》
《linux核心研究-3-中斷》
《ia32上linux核心中斷機制分析》
《linux核心中斷 - tasklet 分析》
《linux 核心軟中斷(softirq)執行分析》
《基於vxworks的多路高速串列埠的通訊方法設計》
《napi模式–中斷和輪詢的折中以及乙個負載均衡的問題》
輪詢 和 中斷 的比較
while 1 週期連續 的檢測外部事件的發生 消耗大量cpu的處理時間 輪詢過程需要和其他 結合 由於cpu可能需要處理其他事件 可能是無關緊要的 可能丟失關鍵事件 週期連續 的檢測外部事件的發生 消耗大量cpu的處理時間 輪詢過程需要和其他 結合 由於cpu可能需要處理其他事件 可能是無關緊要的...
中斷和輪詢的特點
輪詢 對i o裝置的程式輪詢的方式,是早期的計算機系統對 i o裝置的一種管理方式。它定時對各種裝置輪流詢問一遍有無處理要求 輪流詢問之後,有要求的,則加以處理。在處理i o裝置的要求之後,處理機返回繼續工作。儘管輪詢需要時間,但輪詢要比 i o裝置的速度要快得多,所以一般不會發生不能及時處理的問題...
輪詢與長輪詢
資料互動有兩種模式 push 推模式 pull 拉模式 1 推模式指的是客戶端與服務端建立好網路長連線,服務方有相關資料,直接通過長連線通道推送到客戶端。1 優點 及時,一旦有資料變更,客戶端立馬能感知到 另外對客戶端來說邏輯簡單,不需要關心有無資料這些邏輯處理。2 缺點 不知道客戶端的資料消費能力...