所有的事物都是依靠中斷來解決問題的。計算機更是如此,依靠時鐘發生器,人為的設定沒幾個時鐘週期做乙個任務,不管是否做完,一旦規定的時間到了,那麼就要強制「中斷」,以作下乙個任務……就這樣,直道所有的任務都作過了(但不一定都做完畢),再接著做第乙個沒有做完的任務,就這樣走而復始迴圈工作。完成所謂的「多工」。
要不然,乙個cpu,如果即能一邊打字,一邊看到螢幕呢?這就是乙個cpu核心,不斷地一會檢測鍵盤,一會檢測螢幕……
還有就是軟中斷,具體詳細的細節,可以參考微機原理。
中斷系統
中斷裝置和中斷處理程式統稱為中斷系統。
中斷系統是計算機的重要組成部分。實時控制、故障自動處理、計算機與外圍裝置間的資料傳送往往採用中斷系統。中斷系統的應用大大提高了計算機效率。
不同的計算機其硬體結構和軟體指令是不完全相同的,因此,中斷系統也是不相同的。計算機的中斷系統能夠加強cpu對多工事件的處理能力。中斷機制是現代計算機系統中的基礎設施之一,它在系統中起著通訊網路作用,以協調系統對各種外部事件的響應和處理。中斷是實現多道程式設計的必要條件。中斷是cpu對系統發生的某個事件作出的一種反應。引起中斷的事件稱為中斷源。中斷源向cpu提出處理的請求稱為中斷請求。發生中斷時被打斷程式的暫停點成為斷點。cpu暫停現行程式而轉為響應中斷請求的過程稱為中斷響應。處理中斷源的程式稱為中斷處理程式。cpu執行有關的中斷處理程式稱為中斷處理。而返回斷點的過程稱為中斷返回。中斷的實現實行軟體和硬體綜合完成,硬體部分叫做硬體裝置,軟體部分成為軟體處理程式。
中斷系統的功能
1)實現中斷響應和中斷返回
當cpu收到中斷請求後,能根據具體情況決定是否響應中斷,如果cpu沒有更急、更重要的工作,則在執行完當前指令後響應這一中斷請求。cpu中斷響應過程如下:首先,將斷點處的pc值(即下一條應執行指令的位址)推入堆疊保留下來,這稱為保護斷點,由硬體自動執行。然後,將有關的暫存器內容和標誌位狀態推入堆疊保留下來,這稱為保護現場,由使用者自己程式設計完成。保護斷點和現場後即可執行中斷服務程式,執行完畢,cpu由中斷服務程式返回主程式,中斷返回過程如下:首先恢復原保留暫存器的內容和標誌位的狀態,這稱為恢復現場,由使用者程式設計完成。然後,再加返回指令reti,reti指令的功能是恢復pc值,使cpu返回斷點,這稱為恢復斷點。恢復現場和斷點後,cpu將繼續執行原主程式,中斷響應過程到此為止。
2)實現優先權排隊
通常,系統中有多個中斷源,當有多個中斷源同時發出中斷請求時,要求計算機能確定哪個中斷更緊迫,以便首先響應。為此,計算機給每個中斷源規定了優先級別,稱為優先權。這樣,當多個中斷源同時發出中斷請求時,優先權高的中斷能先被響應,只有優先權高的中斷處理結束後才能響應優先權低的中斷。計算機按中斷源優先權高低逐次響應的過程稱優先權排隊,這個過程可通過硬體電路來實現,亦可通過軟體查詢來實現。
3)實現中斷巢狀
當cpu響應某一中斷時,若有優先權高的中斷源發出中斷請求,則cpu能中斷正在進行的中斷服務程式,並保留這個程式的斷點(類似於子程式巢狀),響應高階中斷,高階中斷處理結束以後,再繼續進行被中斷的中斷服務程式,這個過程稱為中斷巢狀。如果發出新的中斷請求的中斷源的優先權級別與正在處理的中斷源同級或更低時,cpu不會響應這個中斷請求,直至正在處理的中斷服務程式執行完以後才能去處理新的中斷請求。
中斷、異常和系統呼叫
所謂中斷是指cpu對系統發生的某個事件做出的一種反應,cpu暫停正在執行的程式,保留現場後自動地轉去執行相應的處理程式,處理完該事件後再返回斷點繼續執行被「打斷」的程式。
中斷可分為三類,第一類是由cpu外部引起的,稱作中斷,如i/o中斷、時鐘中斷、控制台中斷等。第二類是來自cpu的內部事件或程式執行中的事件引起的過程,稱作異常,如由於cpu本身故障(電源電壓低於105v或頻率在47~63hz之外)、程式故障(非法操作碼、位址越界、浮點溢位等)等引起的過程。
第三類由於在程式中使用了請求系統服務的系統呼叫而引發的過程,稱作「陷入」(trap,或者陷阱)。前兩類通常都稱作中斷,它們的產生往往是無意、被動的,而陷入是有意和主動的。
1.中斷處理
中斷處理一般分為中斷響應和中斷處理兩個步驟。中斷響應由硬體實施,中斷處理主要由軟體實施。
(1)中斷響應
對中斷請求的整個處理過程是由硬體和軟體結合起來而形成的一套中斷機構實施的。發生中斷時,cpu暫停執行當前的程式,而轉去處理中斷。這個由硬體對中斷請求作出反應的過程,稱為中斷響應。一般說來,中斷響應順序執行下述三步動作:
◆中止當前程式的執行;
◆儲存原程式的斷點資訊(主要是程式計數器pc和程式狀態暫存器ps的內容);
◆從中斷控制器取出中斷向量,轉到相應的處理程式。
通常cpu在執行完一條指令後,立即檢查有無中斷請求,如果有,則立即做出響應。
當發生中斷時,系統作出響應,不管它們是來自硬體(如來自時鐘或者外部裝置)、程式性中斷(執行指令導致「軟體中斷」—softwareinterrupts),或者來自意外事件(如訪問頁面不在記憶體)。
如果當前cpu的執行優先順序低於中斷的優先順序,那麼它就中止對當前程式下條指令的執行,接受該中斷,並提公升處理機的執行級別(一般與中斷優先順序相同),以便在cpu處理當前中斷時,能遮蔽其它同級的或低階的中斷,然後儲存斷點現場資訊,通過取得的中斷向量轉到相應的中斷處理程式的入口。
(2)中斷處理
cpu從中斷控制器取得中斷向量,然後根據具體的中斷向量從中斷向量表idt中找到相應的表項,該表項應是乙個中斷門。於是,cpu就根據中斷門的設定而到達了該通道的總服務程式的入口。
核心對中斷處理的順序主要由以下動作完成:
◆儲存正在執行程序的各暫存器的內容,把它們放入核心棧的新幀麵中。
◆確定「中斷源」或核查中斷發生,識別中斷的型別(如時鐘中斷或盤中斷)和中斷的裝置號(如哪個磁碟引起的中斷)。系統接到中斷後,就從機器那裡得到乙個中斷號,它是檢索中斷向量表的位移。中斷向量因機器而異,但通常都包括相應中斷處理程式入口位址和中斷處理時處理機的狀態字。
◆核心呼叫中斷處理程式,對中斷進行處理。
◆中斷處理完成並返回。中斷處理程式執行完以後,核心便執行與機器相關的特定指令序列,恢復中斷時暫存器內容和執行核心棧退棧,程序回到使用者態。如果設定了重排程標誌,則在本程序返回到使用者態時做程序排程。
2.系統呼叫
在unix/linux系統中,系統呼叫像普通c函式呼叫那樣出現在c程式中。但是一般的函式呼叫序列並不能把程序的狀態從使用者態變為核心態,而系統呼叫卻可以做到。
c語言編譯程式利用乙個預先確定的函式庫(一般稱為c庫),其中有各系統呼叫的名字。c庫中的函式都專門使用一條指令,把程序的執行狀態改為核心態。linux的系統呼叫是通過中斷指令「int0x80」實現的。
每個系統呼叫都有惟一的號碼,稱作系統呼叫號。所有的系統呼叫都集中在系統呼叫入口表中統一管理。
系統呼叫入口表是乙個函式指標陣列,以系統呼叫號為下標在該陣列中找到相應的函式指標,進而就能確定使用者使用的是哪乙個系統呼叫。不同系統中系統呼叫的個數是不同的,目前linux系統中共定義了221個系統呼叫。
另外,系統呼叫表中還留有一些餘項,可供使用者自行新增。
當cpu執行到中斷指令「int0x80」時,硬體就做出一系列響應,其動作與上述的中斷響應相同。cpu穿過陷阱門,從使用者空間進入系統空間。相應地,程序的上下文從使用者堆疊切換到系統堆疊。
接著執行核心函式system_call()。首先,進一步儲存各暫存器的內容;接著呼叫syscall_trace(),以系統呼叫號為下標檢索系統呼叫入口表sys_call_table,從中找到相應的函式;然後轉去執行該函式,完成具體的服務。
執行完服務程式,核心檢查是否發生錯誤,並作相應處理。如果本程序收到訊號,則對訊號作相應處理。最後程序從系統空間返回到使用者空間。
上面兩講簡要介紹了linux核心的主要資料結構和相應的演算法。linux核心包含了豐富的內容,這裡僅是其中的一點點,以求起到「拋磚引玉」的作用。
訊號的中斷與系統呼叫的重起
#include int sigaction(ints signo, const structsigaction *act, struct sigaction *oact) ;struct sigaction ; 當更改訊號動作時,如果sa_handler指向乙個訊號捕捉函式(不是常數sig_ign或sig_dfl),則sa_mask欄位說明了乙個訊號集,在呼叫訊號捕捉函式之前,該訊號集要加到程序的訊號遮蔽字中。僅當從訊號捕捉函式返回時再將程序的訊號遮蔽字恢復為原先值。這樣,在呼叫訊號處理程式時就能阻塞某些訊號。在訊號處理程式被呼叫時,系統建立的新訊號遮蔽字會自動包括正被遞送的訊號。因此保證了在處理乙個給定的訊號時,如果這種訊號再次發生,那麼它會被阻塞到對前乙個訊號的處理結束為止。a.可自動重起的signal()的實現:#include #typpdef voidsigfunc(int signo); sigfunc *signal(int signo, sigfunc *func)else // for other signal if (sigaction(signo, &act, &oac)< 0) return (sig_err); return (oact.sa_handler);}注:在if語句中,我們檢查是否為sigalrm訊號,如果是,且系統定義了sa_interrupt(sunos),即為sunos,該系統預設的系統呼叫是自動重起的,我們阻止該訊號中斷的系統呼叫重起,因為我們要用該訊號中斷i/o操作,實現定時的功能.接著的else語句中的訊號為sigalrm之外的其他訊號,且系統定義了sa_restart,即為svr4或4.3+bsd類系統,該類系統中預設的系統呼叫是不可重起的,所以應該加上sa_restart標誌,使由這些訊號中斷的系統呼叫自動重起.b.不可重起的signal_intr()實現: sigfunc *signal_intr(int signo,sigfunc *func)
注:只有sunos為自動重起的,其他為不自動重起的,所以只要將sunos標誌為非自動重起即可.如上.
程式設計中斷言函式作用
編寫 時,我們總是會做出一些假設,斷言就是用於在 中捕捉這些假設。斷言表示為一些布林表示式,程式設計師相信在程式中的某個特定點該表示式值為真,可以在任何時候啟用和禁用斷言驗證 因此可以在測試時啟用斷言而在部署時禁用斷言。同樣,程式投入執行後,終端使用者在遇到問題時可以重新啟用斷言。使用斷言可以建立更...
中斷自平衡的好處與副作用
有的時候提高linux系統網絡卡的吞吐量,需要開啟中斷平衡,但前提是核心或者應用程式需要支援多核下的併發操作,否則會因為併發錯誤,導致程式行為出差。需要關閉中斷自平衡和固定繫結中斷號到固定的cpu,程式執行退回到單核模式。1.關閉irqbalance service irqbalance stop ...
中斷 中斷的種類
一 基本概念 計算機的中斷系統能夠加強cpu對多工事件的處理能力,中斷機制是現代計算機系統中的基礎設施之一,它在系統中起著通訊網路的作用,已協調系統對各種外部事件的響應和處理 中斷時實現的事件稱為中斷源 中斷源向cpu提出處理的請求稱為中斷請求 發生中斷時被打斷的程式的暫停點稱為斷點 cpu暫停現行...