https://www.cnblogs.com/my_life/articles/14360605.html
https://rootw.github.io/2017/03/%E4%B8%AD%E6%96%AD/
從計算機系統內部看,中斷無時無刻不在,這篇博文就和大家一起探討中斷的原理,並以x86_64平台上的linux 3.10內核為例來分析底層實現細節。
什么是中斷?
中斷是一個系統過程,是計算系統中外部設備向CPU(或CPU之間)通知事件發生的一種機制。
這種說法也許有些偏底層,可以從上層更直觀的角度來理解:想象你正面對你的個人電腦,當你按下一個鍵盤按鍵時,你就觸發了一個中斷,隨后屏幕上會出現你期望的字母;或者當你移動鼠標時,你也會觸會一個中斷,隨后光標會隨鼠標的移動而移動。
嚴格意義上說,中斷只是一個系統過程(系統調用過程如果拋開其核心處理函數的執行,也是一個系統過程),是系統的一個部分,而不是一個完整系統,因為它不具備完整系統所應有的功能、性能、可靠性、可擴展性、安全性、兼容性、可維護性等各方面的屬性。比如,通過按動鍵盤,你以中斷的方式向計算系統發送命令,但真正執行命令並返回結果的是計算機系統而不是按鍵動作本身。
為什么需要中斷?
計算機是個“死腦筋”,從打開電源鍵開始,就算你不向她發送任何指令,她也會按設定的程序開始忙祿,大多時候都在執行一個叫做IDEL的無聊程序。如何讓她聽命於你呢?
兩種方法,要么讓她隨時可被打斷,去做你想讓她做的事,隨后再去干原來被打斷的事;
要么讓她不停地一直問你想讓她做什么,其它的事啥也不干,這樣你一發話,她可以立刻響應你的命令。
第一種方式,便是中斷(interrupt),第二種方式叫輪詢(polling)。
在大多數場景下,中斷都是一種更為高效的(從完成任務數來看)通知方式,因為計算機干了更多有意義的事,而不是一直在“傻問”;
輪詢時,如果你想讓計算機干得活不是很多,那么計算機大多數問詢得到結果都是“謝謝,我不需要你做什么”,這就白白浪費了她的寶貴精力,但是每次你想讓計算機做事時,她總是先主動地詢問你,之后便立刻進入工作狀態了,這比下達命令之后才慢吞吞開始行動的中斷方式更為高效(從任務響應時間來看)。
因此中斷和輪詢各有優點,各有各的適用場景:中斷適用大多數設備通知場景,而在處理時延敏感場景下(如高性能網絡轉發),輪詢表現得更好。
如何實現中斷?
下面我們深入系統內部,更細致地理解中斷過程。前期的博文介紹過intel i440fx體系的基本組成,這里我們做些簡化,只看和中斷過程相關的幾個部分,並按中斷發生后的時序對中斷過程作一個概括性的描述:

- 首先,我們可以看到在南橋芯片上集成了一個稱為IOAPIC的部件,它共有24根中斷引腳可以接收來自外部設備(如鍵盤、鼠標)的中斷請求;當外設觸發中斷請求后,IOAPIC芯片會根據設備驅動初始化時設定的內容(一個內存地址Address和一個數據Data)向總線發送中斷信息(將Data值寫入Address地址代表的內存),如圖中綠色線條所示,直觀地理解,這個Address指明了接收本次中斷的具體CPU,而Data代表中斷向量號(粗略地講,可以認為這是不同中斷相互區別的一個整數值,0~255)。
- 其次,對於PCI設備而言,有兩種中斷觸發方式:一種是通過intx中斷引腳觸發(最終通過IOAPIC發送中斷信號,如圖中虛線所示);另一種是MSI/MSI-X方式(Message Signal Interrupt),PCI設備通過驅動初始化時設定的內容直接向總線發送中斷,如圖中藍線所示,其發送原理類似IOAPIC,由於外部設備中斷過程並非本文討論的重點,有興趣的同學可以查閱PCI規范中相關內容來獲得更深入的理解。
- 此外,CPU之間可以通過寫ICR寄存器發送IPI(Inter Processors Interrupt)中斷來進行核間通信,如圖中粉色線條所示。
- 最后,每個CPU邏輯核都有一個稱為LAPIC的子部件,它負責接收總線上的中斷信息,當確認是發送給本地邏輯核時,便會引發本地CPU的中斷過程:CPU會對保存當前正在執行任務的狀態信息,之后會根據中斷信息找到具體的中斷處理邏輯函數;在完成中斷處理函數后,CPU便會恢復先前保存的任務狀態,繼續處理原先的作務。
CPU如何處理中斷?
介紹完系統內部整體的中斷過程后,我們把焦點放到CPU上,更深入地從代碼級別看看它是如何處理中斷的。
1、硬件自動完成動作
x86_64 CPU在中斷發生時會執行一系列硬件動作,完成執行上下文的切換,這些都是硬件自動完成的,不受軟件控制,如下圖所示:
圖中上半部分表示中斷發生前寄存器狀態(這里以用戶態上下文狀態舉例):
- CS(代碼段寄存器)和rip(指令指針寄存器)指向了當前正在執行的用戶態指令的位置(綠色線條所示);
- SS(堆棧段寄存器)和rsp(棧指針寄存器)指向了當前用戶態堆棧的棧項位置;
- rflags(標志寄存器)中的IF位為1,表示允許中斷發生;
- TR(Task Register)任務寄存器指向當前任務的任務狀態段TSS(Task State Segment),其中的rsp0域指向了內核態棧頂位置(內核特權級為0);
- IDTR(Interrupt Descriptor Table Register)指向了全局中斷描述符表(Interrupt Descriptor Table),表中共有256個中斷描述符(Interrupt Descriptor),每個描述符指向一個中斷處理函數入口,中斷描述符在表中的索引(下標)稱為中斷向量(Interrupt Vector)。
中斷發生后(只能發生在指令邊界,不能打斷單條指令的執行),寄存器狀態將發生變化,如上圖下半部分所示:
- 對於運行在用戶態的程序,中斷發生后需要切換到內核態執行中斷處理函數,出於安全的考慮,堆棧也需要切換到內核態(注意,每個進程在內核態都有一個獨立的棧空間,3.10內核中有16K大小,棧項指針保存在TSS);
- 切換到內核態棧后,CPU自動將用戶態SS、rsp、rflags、CS、rip壓入棧中(從上到下,棧頂在下,棧底在上);
- CPU根據中斷向量,取出中斷描述符表中對應的中斷描述符,將CS:rip指向中斷描述符中的函數入口地址;
- 對於類型為Interrupt Gate的中斷描述符,rflags中的IF標置位將被清零,表示CPU此時開始不響應外部中斷。
細心的同學可能會問如果程序正好在執行系統調用進入內核態,那中斷的硬件過程是怎樣的?除了不用進行棧切換外,其它的過程和上面的一樣,因為系統調用已經完成了棧切換的動作。
2、中斷描述符表
https://blog.csdn.net/u011391839/article/details/107504147
1、概念說明
CPU 是一種硬件資源,和任何其他硬件設備一樣也需要驅動和管理程序才能使用,我們可以把內核的進程調度看作是 CPU 的管理程序,用來管理和分配CPU 資源,合理安排進程搶占 CPU,並決定哪個進程該使用 CPU、哪個進程該等待。
操作系統內核里的進程調度主要用來調度兩類資源:進程(或線程)和中斷,進程調度給不同的資源分配了不同的優先級,優先級最高的是硬件中斷,其次是內核(系統)進程,最后是用戶進程。
每個 CPU 都維護着一個可運行隊列,用來存放那些可運行的線程。
線程要么在睡眠狀態(blocked 正在等待 IO)要么在可運行狀態,如果 CPU 當前負載太高而新的請求不斷,就會出現進程調度暫時應付不過來的情況,這個時候就不得不把線程暫時放到可運行隊列里。
1.1 Interrupt rate
中斷簡介:
中斷其實就是由硬件或軟件所發送的一種稱為IRQ(中斷請求)的信號。
中斷允許讓設備,如鍵盤,串口卡,並口等設備表明它們需要CPU。
一旦CPU接收了中斷請求,CPU就會暫時停止執行正在運行的程序,並且調用一個稱為中斷處理器或中斷服務程序(interrupt service routine)的特定程序。
中斷服務程序或中斷處理器可以在中斷向量表中找到,而這個中斷向量表位於內存中的固定地址中。
中斷被CPU處理后,就會恢復執行之前被中斷的程序。其實,在機器啟動的時候,系統就已經識別了所有設備,並且也把相應的中斷處理器加載到中斷表中。
Interrupt rate:
每秒內的設備中斷數。CPU接收硬件驅動發出的中斷請求數。當一個驅動器有一個時間需要被kernel操作時。
例如:如果一個磁盤控制器從磁盤上取得了一個數據塊,kernel需要讀取使用這個塊,那么磁盤控制器會觸發一個中斷; kernel接收每個中斷。
在系統中,中斷處理器的優先級非常高,而且執行速度非常快。
很多時候,有些中斷處理並不需要很高的處理優先級,所以也有soft-interrupt handler。如果有很多的中斷,kernel需要花費大量的時間去處理中斷。可以檢查/proc/interrupts能夠知道中斷發生在哪個CPU 上。
Interrupt Rate中包括內核由於進程的時間片中斷,內核的時鍾頻率可以通過如下命令知道,每秒總的時鍾中斷數就是 = cpu個數 * 核數 * CONFIG_HZ
cat /boot/config-`uname -r` | grep '^CONFIG_HZ='
CONFIG_HZ=100
通過cat /proc/interrupts可以查看中斷的類型以及次數,用vmstat查看的 in(Interrupt)就是這個參數
1.2 Context Switch Rate
大部分現在的CPU在同一時間只能運行一個process,雖然也有一些CPU,例如超線程技術的CPU,能實現同時運行超過一個process。
linux把這種CPU看作多個單線程CPU,linux內核不斷的在不同process間切換,造成一個錯覺,讓人感覺一個單CPU同時處理多個任務,不同process之間的切換稱作 Context Switch。
當系統做Context Switch時,CPU保存所有old process的context信息並獲得new process的所有context信息,Context信息包括大量的linux追蹤每個process信息,尤其是一些資源:
那些process正在執行,被分配了哪些內存,它打開了那些文件,等等。切換Context會觸發大量的信息移動,這是比較高的開銷。
首先,kernel調度觸發context switches。
為了保證每個process平等的共享CPU時間,kernel周期性中斷running的process,如果合適kernel調度器會開始一個其他的process而不是讓當前的process繼續執行,每次的周期性中斷或者定時中斷都可能觸發context switch。
每秒定時中斷的次數因不同架構和不同的kernel版本而不同。
獲取每秒中斷次數的一個簡單辦法是通過監控 /proc/interrupts文件,通過命令cat /proc/interrupts | grep timer; sleep 10 ; cat /proc/interrupts | grep timer 可以看到在指定的時間內timer次數的變化。
如果你的context switch比timer中斷大很多。那么context switch更多的可能是I/O請求或者其他長時間的系統調用(比如sleep)產生。
當一個應用請求一個操作不能立即實現時,kernel開始 context switch操作:
存入請求的process並且試着切換到其他runnable process。這將使得CPU保持工作狀態。
Context Switch大體上由兩個部分組成:中斷和進程(包括線程)切換,一次中斷(Interrupt)會引起一次切換,進程(線程)的創建、激活之類的也會引起一次切換。
Context Switch 的值也和TPS(Transaction Per Second)相關的,假設每次調用會引起N次CS,那么就可以得出
Context Switch Rate = Interrupt Rate + TPS* N
CSR減掉IR,就是進程/線程的切換,假如主進程收到請求交給線程處理,線程處理完畢歸還給主進程,這里就是2次切換。
也可以用CSR、IR、TPS的值代入公式中,得出每次事物導致的切換數。因此,要降低CSR,就必須在每個TPS引起的切換上下功夫,只有N這個值降下去,CSR就能降低,理想情況下N=0,但是無論如何如果N >= 4,則要分析。用vmstat查看 cs(Context Switch)就是這個參數
2、CPU中斷過程
2.1 cpu中斷技術的定義
計算機處於執行期間
系統內發生了非尋常或非預期的急需處理事件
CPU暫時中斷當前正在執行的程序而轉去執行相應的事件處理程序
處理完畢后返回原來被中斷處繼續執行
舉個現實中的例子:
你正在看書,突然你的朋友打來電話,於是你放下書本去接電話,電話打完接着看書。電話響->放下書本->接電話->繼續看書這一個過程,就類似於CPU中斷的處理過程。
2.2 CPU中斷的作用
早期的CPU處理外設的事件(比如接收鍵盤輸入),往往采用“輪詢”的方式。
即CPU像個查崗的一樣輪番對外設順序訪問,比如它先看看鍵盤有沒被按下,有的話就處理,沒的話繼續往下看鼠標有沒有移動,再看看打印機……這種方式使CPU的執行效率很低,且CPU與外設不能同時工作(因為要等待CPU來“巡查”)。
中斷模式時就是說CPU不主動訪問這些設備,只管處理自己的任務。
如果有設備要與CPU聯系,或要CPU處理一些事情,它會給CPU發一個中斷請求信號。這時CPU就會放下正在進行的工作而去處理這個外設的請求。處理完中斷后,CPU返回去繼續執行中斷以前的工作。
中斷模式的作用和優點
可以使CPU和外設同時工作,使系統可以及時地響應外部事件,外設的處理速度一般慢於cpu,cpu不能一直等待外部事件
可允許多個外設同時工作,大大提高了CPU的利用率,也提高了數據輸入、輸出的速度。
可以使CPU及時處理各種軟硬件故障(比如計算機在運行過程中,出現了難以預料的情況或一些故障,如電源掉電、存儲出錯、運算溢出等等。計算機可以利用中斷系統自行處理,而不必停機或報告工作人員。)
2.3 CPU中斷的類型
在計算機系統中,根據中斷源的不同,通常將分為硬件中斷和軟件中斷
(1)硬件中斷
硬件中斷又稱外部中斷,分為:可屏蔽中斷、非屏蔽中斷。
可屏蔽中斷。
常由計算機的外設或一些接口功能產生,如鍵盤、打印機、串行口等;
這種類型的中斷可以在CPU要處理其它緊急操作時,被軟件屏蔽或忽略。
例如打印機中斷,CPU對打印機中斷請求的響應可以快一些,也可以慢一些,因為讓打印機稍等待一會也是完全合理的。
非屏蔽中斷。
由意外事件導致,如電源斷電、內存校驗錯誤等;對於這種類型的中斷事件,無法通過軟件進行屏蔽,CPU必須無條件響應。
例如電源斷電,一旦出現此中斷請求,必須立即無條件地響應,否則進行其他任何工作都是沒有意義的。
在x86架構的處理器中,CPU的中斷控制器由兩根引腳(INTR和NMI)接收外部中斷請求信號。其中: 1. INTR接收可屏蔽中斷請求;2. NMI接收非屏蔽中斷請求
(2)軟件中斷
軟件中斷又稱內部中斷、異常,是指在程序中調用INTR中斷指令引起的中斷。比如winAPI中,keybd_event和mouse_event兩個函數,就是用來模擬鍵盤和鼠標的輸入(只是猜測)。
2.4 CPU中斷的過程
(1)中斷請求
中斷請求是由中斷源向CPU發出中斷請求信號。
外部設備發出中斷請求信號要具備以下條件:外部設備的工作已經告一段落。
例如輸入設備只有在啟動后,將要輸入的數據送到接口電路的數據寄存器(即准備好要輸入的數據)之后,才可以向CPU發出中斷請求;系統允許該外設發出中斷請求。
如果系統不允許該外設發出中斷請求,可以將這個外設的請求屏蔽。當這個外設中斷請求被屏蔽,雖然這個外設准備工作已經完成,也不能發出中斷請求。
(2)中斷響應、處理和返回
當滿足了中斷的條件后,CPU就會響應中斷,轉入中斷程序處理。關閉中斷信號接收器;保存現場(context);給出中斷入口,轉入相應的中斷服務程序;處理完成,返回並恢復現場(context);開啟中斷信號接收器
(3)中斷排隊和中斷判優
中斷申請是隨機的,有時會出現多個中斷源同時提出中斷申請。CPU每次只能響應一個中斷源的請求。CPU不可能對所有中斷請求一視同仁,它會根據各中斷源工作性質的輕重緩急,預先安排一個優先級順序。當多個中斷源同時申請中斷時,即按此優先級順序進行排隊,等候CPU處理。
3、中斷處理機制
Linux中斷下半部處理有三種方式:軟中斷、tasklet、工作隊列。
3.1 下半部
中斷處理函數所做的第一件事情就是屏蔽中斷(或者是什么都不做,因為常常是如果不清除IF位,就等於屏蔽中斷了),當然只屏蔽同一種中斷。
之所以要屏蔽中斷,是因為新的中斷會再次調用中斷處理函數,導致原來中斷處理現場的破壞。即破壞了interrupt context。
隨着系統的不斷復雜,中斷處理函數要做的事情也越來越多,多到都來不及接收新的中斷了。
於是發生了中斷丟失,這顯然不行,於是產生了新的機制:分離中斷接收與中斷處理過程。
系統為了解決中斷程序執行過長和中斷丟失的問題,Linux將中斷處理過程分成了兩個階段,也就是上半部和下半部
Linux中斷分為兩個半部:上半部(tophalf)和下半部(bottom half)。
上半部的功能是"登記中斷",當一個中斷發生時,它進行相應地硬件讀寫后就把中斷例程的下半部掛到該設備的下半部執行隊列中去。
因此,上半部 執行的速度就會很快,可以服務更多的中斷請求。但是,僅有"登記中斷"是遠遠不夠的,因為中斷的事件可能很復雜。
因此,Linux引入了一個下半部,來完 成中斷事件的絕大多數使命。
下半部和上半部最大的不同是下半部是可中斷的,而上半部是不可中斷的,下半部幾乎做了中斷處理程序所有的事情,而且可以被新的中斷打斷!
下半部則相對來說並不是非常緊急的,通常還是比較耗時的,因此由系統自行安排運行時機,不在中斷服務上下文中執行。
總之:
1.上半部用來快速處理中斷,它在中斷禁止模式下運行,主要處理跟硬件緊密相關或者時間敏感的工作
2.下半部用來延遲處理上半部未完成的工作,通常以內核線程的方式運行
3.2 軟中斷
linux中斷處理。作為一個操作系統顯然不能任由每個中斷都各自為政,統一管理是必須的。
不可中斷部分的共同部分放在函數do_IRQ中,需要添加中斷處理函數時,通過request_irq實現。
下半部放在do_softirq中,也就是軟中斷,通過open_softirq添加對應的處理函數。
3.3 Tasklet
隨着中斷數的不停增加,軟中斷不夠用了,於是下半部又做了進化。軟中斷用輪詢的方式處理。假如正好是最后一種中斷,則必須循環完所有的中斷類型,才能最終執行對應的處理函數。顯然當年開發人員為了保證輪詢的效率,於是限制中斷個數為32個。為了提高中斷處理數量,順道改進處理效率,於是產生了tasklet機制。
Tasklet采用無差別的隊列機制,有中斷時才執行,免去了循環查表之苦。Tasklet作為一種新機制,顯然可以承擔更多的優點。正好這時候SMP越來越火了,因此又在tasklet中加入了SMP機制,保證同種中斷只在一個cpu上執行。在軟中斷時代,顯然沒有這種考慮。因此同一種中斷可以在兩個cpu上同時執行,很可能造成沖突。tasklet的優點無類型數量限制;效率高無需循環查表;支持SMP機制;
3.4工作隊列
前面的機制不論如何折騰,有一點是不會變的。它們都在中斷上下文中。即它們不可掛起。而且由於是串行執行,因此只要有一個處理時間較長,則會導致其他中斷響應的延遲。為了完成這些不可能完成的任務,於是出現了工作隊列。工作隊列說白了就是一組內核線程,作為中斷守護線程來使用。多個中斷可以放在一個線程中,也可以每個中斷分配一個線程。工作隊列對線程作了封裝,使用起來更方便。因為工作隊列是線程,所以我們可以使用所有可以在線程中使用的方法。
Tasklet其實也不一定是在中斷上下文中執行,它也有可能在線程中執行。假如中斷數量很多,而且這些中斷都是自啟動型的(中斷處理函數會導致新的中斷產生),則有可能cpu一直在這里執行中斷處理函數,會導致用戶進程永遠得不到調度時間。為了避免這種情況,linux發現中斷數量過多時,會把多余的中斷處理放到一個單獨的線程中去做,就是ksoftirqd線程。這樣又保證了中斷不多時的響應速度,又保證了中斷過多時不會把用戶進程餓死。
問題是我們不能保證我們的tasklet或軟中斷處理函數一定會在線程中執行,所以還是不能使用進程才能用的一些方法,如放棄調度、長延時等。
Linux實現下半部的機制主要有tasklet和工作隊列
示例:
以網卡接收數據為例
網卡接收到數據包后,會通過硬件中斷的方式,通知內核有新的數據到了,這時內核就應該調用中斷處理程序來響應它;
對於上半部分來說,要把網卡的數據讀到內存中,然后更新硬件寄存器的狀態(表示數據已經讀好了),最后再發送一個軟中斷信號,通知下半部做進一步的處理
下半部被軟中斷信號喚醒后,需要從內存中找到網絡數據,再按照網絡協議棧,對數據進行逐層解析和處理,直到把它送給應用程序
上半部分直接處理硬件請求,也就是硬件中斷,特點是快速執行
下半部分則是由內核處理,也就是軟中斷,特點是延遲執行
上半部會打斷CPU正在執行的人物,然后立即執行中斷處理程序,而下半部以內核線程的方式執行,並且每個CPU都對應一個軟中斷內核線程,名字為 ksoftireqd/CPU編號
比如0號CPU對應的軟中斷內核線程名字是 ksoftirqd/0
一些內核自定義的事件也屬於軟中斷,比如內核調度和RCU鎖(Read-Copy Update的縮寫,是Linux內核中最常用的鎖之一)
4. 指標范圍
4.1 Interrupt rate
應該與cpu利用率結合分析,如果cpu利用率在合理范圍內,大量的中斷也是可以接受的。一個巨大的中斷值,同時伴隨着緩慢的系統性能表現,指示存在硬件問題
4.2 Context Switch Rate
應該與cpu利用率結合分析,如果cpu利用率在合理范圍內,大量的中斷也是可以接受的。
當每次調用引起的上下文切換大於等於4時,需要結合分析
網上也有說,需要少於5000*cpu個數
https://blog.51cto.com/noican/1355357
- /proc/interrupts 文件
在linux的機器上,/proc/interrupts這個文件包含有關於哪些中斷正在使用和每個處理器各被中斷了多少次的信息。
● 第一列表示IRQ號, 最后一列中斷名稱
● 第二、三、四列表示相應的CPU核心被中斷的次數。在上面的例子中,timer表示中斷名稱(為系統時鍾)。3710374484表示CPU0被中斷了3710374484次。i8042表示控制鍵盤和鼠標的鍵盤控制器。
● 對於像rtc(real time clock)這樣的中斷,CPU是不會被中斷的。因為RTC存在於電子設備中,是用於追蹤時間的。
● NMI和LOC是系統所使用的驅動,用戶無法訪問和配置。
IRQ號決定了需要被CPU處理的優先級。IRQ號越小意味着優先級越高。
例如,如果CPU同時接收了來自鍵盤和系統時鍾的中斷,那么CPU首先會服務於系統時鍾,因為他的IRQ號是 0 。
● IRQ0 :系統時鍾(不能改變)
● IRQ1 :鍵盤控制器(不能改變)
● IRQ3 :串口2的串口控制器(如有串口4,則其也使用這個中斷)
● IRQ4 :串口1的串口控制器(如有串口3,則其也使用這個中斷)
● IRQ5 :並口2和3 或 聲卡
● IRQ6 :軟盤控制器
● IRQ7 : 並口1。它被用於打印機或若是沒有打印機,可以用於任何的並口。
- RES: 2450431 5279697 Rescheduling interrupts; 重調度中斷(RES)個中斷類型表示,喚醒空閑狀態的 CPU 來調度新的任務運行,通常也被稱為處理器間中斷(Inter-Processor Interrupts,IPI)
而對於像操作桿(或稱為游戲手柄)上的CPU,它並不會等待設備發送中斷。
因為操作桿主要用於游戲,操作桿的移動必須非常快,因此使用輪詢的方式檢測設備是否需要CPU的關注還是比較理想的。
使用輪詢方式的缺點是CPU就處於了忙等狀態,因為CPU會不停的多次檢查設備。但是需要注意的是在linux中,這種處理信號的方式也是必不可少的。
硬中斷
對於上文所討論的場景都是屬於硬中斷的例子。硬中斷主要分為兩種類別:
1. 非屏蔽中斷(Non-maskable interrupts,即NMI):就像這種中斷類型的字面意思一樣,這種中斷是不可能被CPU忽略或取消的。
NMI是在單獨的中斷線路上進行發送的,它通常被用於關鍵性硬件發生的錯誤,如內存錯誤,風扇故障,溫度傳感器故障等。
2. 可屏蔽中斷(Maskable interrupts):這些中斷是可以被CPU忽略或延遲處理的。
當緩存控制器的外部針腳被觸發的時候就會產生這種類型的中斷,而中斷屏蔽寄存器就會將這樣的中斷屏蔽掉。我們可以將一個比特位設置為0,來禁用在此針腳觸發的中斷。
軟中斷
這些中斷是在CPU執行指令(也就是說在進程正在運行的時候)的時候產生的,因為在執行指令時,CPU(確切的說應是在CPU中的運算器)自身會產生一個異常(此處的異常也可理解為軟中斷)。
例如,一個數字除以0(當然這是不可能的),此時就會導致一個divide-by-zero的異常,從而導致計算機將此計算取消或者顯示一個錯誤的信息。
在文件/proc/stat中,包含了一些關於系統內核的統計信息,也包含了一些中斷信息。
SMP_AFFINITY
SMP是指對稱多處理器。smp_affinity文件主要用於某個特定IRQ要綁定到哪個CPU核心上。
在/proc/irq/IRQ_NUMBER/目錄下都有一個smp_affinity文件,這個文件中,所表示的CPU核心以十六進制來表示的。
例如,網卡的中斷號是:
上面的十六進制對應的十進制是1,也就是說所有的和網卡驅動相關的中斷都是有CPU0來提供服務的。
我們可以通過手動改變smp_affinity文件中的值來將IRQ綁定到指定的CPU核心上,或者啟用irqbalance服務來自動綁定IRQ到CPU核心上。
IRQ Balance
Irqbalance是一個linux的實用程序,它主要是用於分發中斷請求到CPU核心上,有助於性能的提升。它的目的是尋求省電和性能優化之間的平衡。你可以使用yum進行安裝:
啟動irqbalance服務后,中斷在CPU上的分布如下: