硬中断、软中断和信号
硬中斷:
1. 硬中斷是由硬件產生的,比如,像磁盤,網卡,鍵盤,時鐘等。每個設備或設備集都有它自己的IRQ(中斷請求)。基于IRQ,CPU可以將相應的請求分發(fā)到對應的硬件驅動上(注:硬件驅動通常是內核中的一個子程序,而不是一個獨立的進程)。
2. 處理中斷的驅動是需要運行在CPU上的,因此,當中斷產生的時候,CPU會中斷當前正在運行的任務,來處理中斷。在有多核心的系統上,一個中斷通常只能中斷一顆CPU(也有一種特殊的情況,就是在大型主機上是有硬件通道的,它可以在沒有主CPU的支持下,可以同時處理多個中斷。)。
3. 硬中斷可以直接中斷CPU。它會引起內核中相關的代碼被觸發(fā)。對于那些需要花費一些時間去處理的進程,中斷代碼本身也可以被其他的硬中斷中斷。
4. 對于時鐘中斷,內核調度代碼會將當前正在運行的進程掛起,從而讓其他的進程來運行。它的存在是為了讓調度代碼(或稱為調度器)可以調度多任務。
軟中斷:
1. 軟中斷的處理非常像硬中斷。然而,它們僅僅是由當前正在運行的進程所產生的。
2. 通常,軟中斷是一些對I/O的請求。這些請求會調用內核中可以調度I/O發(fā)生的程序。對于某些設備,I/O請求需要被立即處理,而磁盤I/O請求通常可以排隊并且可以稍后處理。根據I/O模型的不同,進程或許會被掛起直到I/O完成,此時內核調度器就會選擇另一個進程去運行。I/O可以在進程之間產生并且調度過程通常和磁盤I/O的方式是相同。
3. 軟中斷僅與內核相聯系。而內核主要負責對需要運行的任何其他的進程進行調度。一些內核允許設備驅動的一些部分存在于用戶空間,并且當需要的時候內核也會調度這個進程去運行。
4. 軟中斷并不會直接中斷CPU。也只有當前正在運行的代碼(或進程)才會產生軟中斷。這種中斷是一種需要內核為正在運行的進程去做一些事情(通常為I/O)的請求。有一個特殊的軟中斷是Yield調用,它的作用是請求內核調度器去查看是否有一些其他的進程可以運行。
問題解答:
1. 問:對于軟中斷,I/O操作是否是由內核中的I/O設備驅動程序完成?
答:對于I/O請求,內核會將這項工作分派給合適的內核驅動程序,這個程序會對I/O進行隊列化,以可以稍后處理(通常是磁盤I/O),或如果可能可以立即執(zhí)行它。通常,當對硬中斷進行回應的時候,這個隊列會被驅動所處理。當一個I/O請求完成的時候,下一個在隊列中的I/O請求就會發(fā)送到這個設備上。
2. 問:軟中斷所經過的操作流程是比硬中斷的少嗎?換句話說,對于軟中斷就是:進程 ->內核中的設備驅動程序;對于硬中斷:硬件->CPU->內核中的設備驅動程序?
答:是的,軟中斷比硬中斷少了一個硬件發(fā)送信號的步驟。產生軟中斷的進程一定是當前正在運行的進程,因此它們不會中斷CPU。但是它們會中斷調用代碼的流程。
如果硬件需要CPU去做一些事情,那么這個硬件會使CPU中斷當前正在運行的代碼。而后CPU會將當前正在運行進程的當前狀態(tài)放到堆棧(stack)中,以至于之后可以返回繼續(xù)運行。這種中斷可以停止一個正在運行的進程;可以停止正處理另一個中斷的內核代碼;或者可以停止空閑進程。
轉自:?http://www.linuxidc.com/Linux/2014-03/98013.htm
硬中斷是外部設備對CPU的中斷,軟中斷是中斷底半部的一種處理機制,信號則是由內核(或其他進程)對某個進程的中斷。
?
①硬中斷是由外部事件引起的因此具有隨機性和突發(fā)性; ?? 軟中斷是執(zhí)行中斷指令產生的,無面外部施加中斷請求信號,因此中斷的發(fā)生不是隨機的而是由程序安排好的。②硬中斷的中斷響應周期,CPU需要發(fā)中斷回合信號(NMI不需要); ?? 軟中斷的中斷響應周期,CPU不需發(fā)中斷回合信號。
③硬中斷的中斷號是由中斷控制器提供的(NMI硬中斷中斷號系統指定為02H); ?? 軟中斷的中斷號由指令直接給出,無需使用中斷控制器。
④硬中斷是可屏蔽的(NMI硬中斷不可屏蔽); ?? 軟中斷不可屏蔽。
?????? 軟中斷是一種推后執(zhí)行的機制。定時器、網卡的數據的處理是很典型的軟中斷,這個和中斷向 量表里的中斷是完全不一樣的。以網絡數據的處理為例,當網卡接到一個數據包后,其中斷處理程序只是把數據復制到緩沖區(qū),然后就告訴網卡,你可以再傳數據給 我了,也就是中斷返回。但在此之前,網卡的中斷處理程序要置一個標志位,告訴操作系統有事要做,這個事就是軟中斷。但軟中斷只是很多中斷返回時要做的事情 之一,操作系統每次中斷返回時會檢查著個標志位,看是否有事要做,如果有,就會去處理,象前面提到的網卡,這時候操作系統就回調用軟中斷的處理函數。網卡 的軟中斷程序就是做分析數據包啊,這個數據應該傳給誰啊等這些工作,沒有,就返回了,除了必須的部分。
編寫兩個中斷服務函數的區(qū)別
1.軟中斷發(fā)生的時間是由程序控制的,而硬中斷發(fā)生的時間是隨機的?
2.軟中斷是由程序調用發(fā)生的,而硬中斷是由外設引發(fā)的?
3.硬件中斷處理程序要確保它能快速地完成它的任務,這樣程序執(zhí)行時才不會等侍較長時間?
編寫這兩類的中斷處理程序我感覺區(qū)別不太大
轉自:?http://blog.csdn.net/u010820757/article/details/48930303
本文主要內容:硬中斷 / 軟中斷的原理和實現
內核版本:2.6.37
Author:zhangskd @ csdn blog
?
概述
?
從本質上來講,中斷是一種電信號,當設備有某種事件發(fā)生時,它就會產生中斷,通過總線把電信號發(fā)送給中斷控制器。
如果中斷的線是激活的,中斷控制器就把電信號發(fā)送給處理器的某個特定引腳。處理器于是立即停止自己正在做的事,
跳到中斷處理程序的入口點,進行中斷處理。
?
(1) 硬中斷
由與系統相連的外設(比如網卡、硬盤)自動產生的。主要是用來通知操作系統系統外設狀態(tài)的變化。比如當網卡收到數據包
的時候,就會發(fā)出一個中斷。我們通常所說的中斷指的是硬中斷(hardirq)。
?
(2) 軟中斷
為了滿足實時系統的要求,中斷處理應該是越快越好。linux為了實現這個特點,當中斷發(fā)生的時候,硬中斷處理那些短時間
就可以完成的工作,而將那些處理事件比較長的工作,放到中斷之后來完成,也就是軟中斷(softirq)來完成。
?
(3) 中斷嵌套
Linux下硬中斷是可以嵌套的,但是沒有優(yōu)先級的概念,也就是說任何一個新的中斷都可以打斷正在執(zhí)行的中斷,但同種中斷
除外。軟中斷不能嵌套,但相同類型的軟中斷可以在不同CPU上并行執(zhí)行。
?
(4) 軟中斷指令
int是軟中斷指令。
中斷向量表是中斷號和中斷處理函數地址的對應表。
int n - 觸發(fā)軟中斷n。相應的中斷處理函數的地址為:中斷向量表地址 + 4 * n。
?
(5)硬中斷和軟中斷的區(qū)別
軟中斷是執(zhí)行中斷指令產生的,而硬中斷是由外設引發(fā)的。
硬中斷的中斷號是由中斷控制器提供的,軟中斷的中斷號由指令直接指出,無需使用中斷控制器。
硬中斷是可屏蔽的,軟中斷不可屏蔽。
硬中斷處理程序要確保它能快速地完成任務,這樣程序執(zhí)行時才不會等待較長時間,稱為上半部。
軟中斷處理硬中斷未完成的工作,是一種推后執(zhí)行的機制,屬于下半部。?
?
開關
?
(1) 硬中斷的開關
簡單禁止和激活當前處理器上的本地中斷:
local_irq_disable();
local_irq_enable();
保存本地中斷系統狀態(tài)下的禁止和激活:
unsigned long flags;
local_irq_save(flags);
local_irq_restore(flags);
?
(2) 軟中斷的開關
禁止下半部,如softirq、tasklet和workqueue等:
local_bh_disable();
local_bh_enable();
需要注意的是,禁止下半部時仍然可以被硬中斷搶占。
?
(3) 判斷中斷狀態(tài)
#define in_interrupt() (irq_count())?// 是否處于中斷狀態(tài)(硬中斷或軟中斷)
#define in_irq()?(hardirq_count()) // 是否處于硬中斷
#define in_softirq() (softirq_count()) // 是否處于軟中斷
?
硬中斷
?
(1) 注冊中斷處理函數
注冊中斷處理函數:
[java]?view plain?copy ??
中斷處理函數本身:
[java]?view plain?copy ??
(2) 注銷中斷處理函數
[java]?view plain?copy ??
軟中斷
?
(1) 定義
軟中斷是一組靜態(tài)定義的下半部接口,可以在所有處理器上同時執(zhí)行,即使兩個類型相同也可以。
但一個軟中斷不會搶占另一個軟中斷,唯一可以搶占軟中斷的是硬中斷。
?
軟中斷由softirq_action結構體表示:
[java]?view plain?copy ??
目前已注冊的軟中斷有10種,定義為一個全局數組:
[java]?view plain?copy ??
(2) 注冊軟中斷處理函數
[java]?view plain?copy ?例如:
open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_RX_SOFTIRQ, net_rx_action);
?
(3) 觸發(fā)軟中斷?
調用raise_softirq()來觸發(fā)軟中斷。
[java]?view plain?copy ?
Percpu變量irq_cpustat_t中的__softirq_pending是等待處理的軟中斷的位圖,通過設置此變量
即可告訴內核該執(zhí)行哪些軟中斷。
[java]?view plain?copy ??
喚醒ksoftirqd內核線程處理軟中斷。
[java]?view plain?copy ??
在下列地方,待處理的軟中斷會被檢查和執(zhí)行:
1. 從一個硬件中斷代碼處返回時
2. 在ksoftirqd內核線程中
3. 在那些顯示檢查和執(zhí)行待處理的軟中斷的代碼中,如網絡子系統中
?
而不管是用什么方法喚起,軟中斷都要在do_softirq()中執(zhí)行。如果有待處理的軟中斷,
do_softirq()會循環(huán)遍歷每一個,調用它們的相應的處理程序。
在中斷處理程序中觸發(fā)軟中斷是最常見的形式。中斷處理程序執(zhí)行硬件設備的相關操作,
然后觸發(fā)相應的軟中斷,最后退出。內核在執(zhí)行完中斷處理程序以后,馬上就會調用
do_softirq(),于是軟中斷開始執(zhí)行中斷處理程序完成剩余的任務。
?
下面來看下do_softirq()的具體實現。
[java]?view plain?copy ??
(4) ksoftirqd內核線程
內核不會立即處理重新觸發(fā)的軟中斷。
當大量軟中斷出現的時候,內核會喚醒一組內核線程來處理。
這些線程的優(yōu)先級最低(nice值為19),這能避免它們跟其它重要的任務搶奪資源。
但它們最終肯定會被執(zhí)行,所以這個折中的方案能夠保證在軟中斷很多時用戶程序不會
因為得不到處理時間而處于饑餓狀態(tài),同時也保證過量的軟中斷最終會得到處理。
?
每個處理器都有一個這樣的線程,名字為ksoftirqd/n,n為處理器的編號。
[java]?view plain?copy ?轉自:?http://blog.csdn.net/zhangskd/article/details/21992933
總結
以上是生活随笔為你收集整理的硬中断、软中断和信号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 麦肯锡方法中的经验(读书摘要)
- 下一篇: Linux下实现USB口的热插拔