欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 淺析linux內核的軟中斷情況

淺析linux內核的軟中斷情況

熱門標簽:上海電銷卡外呼系統供應商 岑溪電銷機器人 大連企業電銷機器人線路 義烏市400電話辦理 電銷機器人錄音用什么軟件 布谷電銷機器人價格 營銷智能外呼系統口碑推薦 優邁系統外呼顯示亂層 怎么查看地圖標注的地點

軟中斷介紹

把可以延遲的處理從硬中斷處理程序獨立出來,這樣這個處理可以在開中斷的情況下運行,這個處理就是軟中斷。可見,軟中斷的這種脫離可以大大縮短硬中斷的響應時間,對于很多實時應用來說及其重要。

我們本文只談軟中斷,至于tasklet、workqueue等我們以后再談。我們在講述軟中斷流程(參考linux kernel 4.0)時會嘗試深入理解其中的各個細節之處,分享我們自己的理解(如果不正,還望指出,謝謝)。
軟中斷數據結構的定義

軟中斷目前有10(由NR_SOFTIRQS定義)個,通過softirq_vec[NR_SOFTIRQS]數組來管理這些軟中斷,全部cpu共用。
軟中斷的注冊

通過open_softirq()將具體的軟中斷處理函數和軟中斷編號綁定。如網絡系統注冊了收發包的軟中斷處理函數:

   

復制代碼
代碼如下:
open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_RX_SOFTIRQ, net_rx_action);

軟中斷的激活

每個cpu都有一個32bit的位圖(即__softirq_pending)來維護本cpu上的軟中斷是否激活。

   

復制代碼
代碼如下:
typedef struct {
unsigned int __softirq_pending;
#ifdef CONFIG_SMP
unsigned int ipi_irqs[NR_IPI];
#endif
} ____cacheline_aligned irq_cpustat_
irq_cpustat_t irq_stat[NR_CPUS] ____cacheline_aligned;

軟中斷的激活時機之一:irq_exit

irq_exit函數里可能會激活軟中斷,激活條件是:

不在硬中斷里并且不在軟中斷里并且本cpu的__softirq_pending中有置位。

   

復制代碼
代碼如下:
if (!in_interrupt() local_softirq_pending())
invoke_softirq();

由這個條件,我們可以知道,軟中斷和硬中斷在這里是同等對待(在in_interrupt里)的,體現都是中斷處理這一個本質。不能在硬中斷里的條件,表明必須優先性,必須硬中斷全部處理完,才考慮軟中斷;不能在軟中斷里的條件,表明屏蔽了軟中斷的嵌套。

invoke_softirq函數的處理是,要么(先喚醒ksoftirqd)將軟中斷交由ksoftirqd專門線程處理,要么直接調用__do_softirq即時處理(當然,即時處理要區分是在哪個棧上:是當前棧上還是在獨立的軟中斷棧上)。

我們看看即時處理這個流程。local_softirq_pending前肯定會清除preempt_count中的硬中斷位,如果此時preempt_count里沒有軟中斷位則可以被搶占(即時關閉硬中斷)。在進入到__do_softirq處理各個軟中斷期間,肯定是禁止搶占了。在硬(軟)中斷上下文里的搶占是眾所周知不被允許的:會讓被中斷的進程執行時間不確定,也是不公平的(也就是說,不要在硬中斷和軟中斷的處理中有調度離開的意向)。
軟中斷的激活時機之二:raise_softirq

網卡收包方式從非NAPI進化到NAPI方式,就充分展示了軟中斷的優點:把收報任務最大程度地交給軟中斷處理,最大程度簡化硬中斷處理。這種進化,我們以后再講。

raise_softirq函數會調用__raise_softirq_irqoff函數,在指定cpu的__softirq_pending位圖上置位相應的軟中斷。raise_softirq_irqoff函數和raise_softirq函數的區別是關中斷的操作是否已經完成了。置位位圖是一個競爭操作,所有硬中斷里都可能做,所以得保證在關中斷的情況下完成。
軟中斷的激活之三:ksoftirqd

每個cpu都有一個ksoftirqd線程在軟中斷量大時專門處理軟中斷:

   

復制代碼
代碼如下:
DEFINE_PER_CPU(struct task_struct *, ksoftirqd);

ksoftirqd線程的核心函數run_ksoftirqd的(循環)處理是:關中斷看本cpu的__softirq_pending的置位情況,如有則執行__do_softirqd(),執行完開中斷)。這個執行很順暢,因為是在該線程自己的棧上,不會有影響用戶進程的問題。

這里有個疑問,此處以前是關搶占保護,現在是關中斷的保護了(參考2012年的patch 3e339b,softirq: Use hotplugthread infrastructure)?我們的理解是:關搶占的保護方式,會讓后續更多的軟中斷由ksoftirqd處理,不符合ksoftirqd的輔助地位。就處理軟中斷的地位而言,應該是irq_exit的為主,ksoftirqd的為輔。)

ksoftirqd里也可以看到,在執行軟中斷前是可以被搶占的,但是一旦開始執行就不能被搶占了(和上面的調度之一:irq_exit中的講述的思想是一致的)。就是說,軟中斷和硬中斷的處理思想是一致的:執行期間不允許發生調度!

上述不能搶占的原因其實就是類似事務性的一個原則:一旦開始不能停止。另外一個原因是,執行的是用戶自定義的硬(軟)中斷程序,操作具有不確定性,如果讓這些操作期間具有調度可能,則會脫離內核的控制范圍。
軟中斷的激活之四:其他地方

比如netif_rx_ni(),執行do_softirq前關搶占,不能在執行軟中斷期間調度。
軟中斷的激活之五:local_bh_enable

   

復制代碼
代碼如下:
if (unlikely(!in_interrupt() local_softirq_pending()))
do_softirq();

想想,如果異常和軟中斷有共享數據的話,異常處理走到此共享數據的臨界區時需要關軟中斷,但不需要關硬中斷。那么當走完臨界區時,需要開軟中斷,此時就是一個激活時機(看preempt_count了,其實可能也是一個搶占時機)。

用“激活”而不是“調用”的原因是外圍處理僅修改本cpu的__softirq_pending位圖,最后由核心機制(比如ksoftirqd、能通過in_interrupt檢查的軟中斷處理)真正處理,而這就是軟中斷的理念:讓硬中斷(或者其它)更快執行,所以不會采用直接調用的方式。

“激活”的原則是誰激活,誰處理,哪個cpu上的硬中斷帶來的軟中斷就由哪個cpu處理(或者說,歸屬cpu是軟中斷跟著硬中斷走)。這樣,充分發揮smp的優勢,均衡到各個cpu上。至于硬中斷和cpu之間的關系,我們以后講到硬中斷時再討論。每個cpu維護自己的軟中斷機制就行了,各個cpu是互不相關的。注意,還是有相關性的:各個cpu并行處理同一類型的軟中斷時,該類型軟中斷處理需要為共享數據做保護,這是軟中斷可重入性需要付出的代價。
軟中斷核心函數處理之do_softirq

do_softirq先檢查軟中斷重入條件:必須不在硬中斷里并且不在軟中斷里,符合條件之后就可以開始做如下的軟中斷處理了:

   

復制代碼
代碼如下:
pending = local_softirq_pending();
if (pending)
__do_softirq();

這個處理是在關中斷的保護下完成的,畢竟軟中斷和硬中斷本質上是一樣的,都是中斷體系的(當然,進入到硬/軟中斷內部再開則另當別論了)。也可以看到,局部變量pending沒有傳入__do_softirq內部,所以此處僅是判斷,不是使用,此處判斷值和內部使用值可能有差異,位圖中置位位數會少一些。

我們再深究一下這個檢查條件。我們的理解是:

這個條件達到了兩個效果:同一個cpu上的軟中斷不嵌套;嵌套硬中斷中不處理軟中斷。就同一個cpu而言,__do_softirq函數的執行是串行的,非重入的(do_softirq函數可以說是可重入的);就多個cpu而言,__do_softirq函數是可重入的,即使是同一個類型的軟中斷。也就是說,軟中斷通過這個檢查條件做到了本cpu上的軟中斷處理串行化,當然,多cpu之間的還是并行的,所以同一類型軟中斷處理還是需要保護自己的相關共享數據結構的。
軟中斷核心函數處理之__do_softirq

__do_softirq函數處理是盡量(雖然可能還是執行不完)執行所有被激活的軟中斷(由本cpu上的__softirq_pending位圖標識)處理。我們分三個階段分析。

準備處理階段:關閉軟中斷(效果是讓上面提到的檢查條件為真,從而達到禁止本cpu上的軟中斷嵌套的目的)。

核心處理階段:關硬中斷,獲得本cpu的__softirq_pending位圖并存儲起來,清空位圖,開硬中斷(僅在讀寫位圖時需要關硬中斷,防止其它硬中斷同時操作)。執行本cpu的所有軟中斷(由存儲起來的位圖獲得)。這個核心處理是個循環,最多10次(MAX_SOFTIRQ_RESTART),畢竟此時用的是用戶進程的棧,不能借用太久。退出循環的條件是:總時間超出或者被搶占(開中斷就會有被搶占)或者達到10次了。

結尾處理階段:關硬中斷,開軟中斷。

另外,如果10次循環都解決不完軟中斷,說明期間發生的硬中斷很多,帶來的額外的軟中斷也很多。那么就不繼續影響借用的用戶進程棧了,直接交給專門的ksoftirqd內核線程處理。這也就說明了循環的含義:處理軟中斷期間時還會進入新的硬中斷,從而帶進新的軟中斷(當然,僅僅是在本cpu的__softirq_pending上置位,不會有實際處理),所以需要反復去處理(處理的目標很明確,就是要清空本cpu上的__softirq_pending位圖)。

再看看那個防止軟中斷嵌套的流程。關軟中斷中肯定有一句原子地加1的關鍵語句,如果當前內核路徑A在該原子操作之前被另一個內核路徑B打斷,則B執行完硬中斷和軟中斷后,返回到A的此處,A接著執行該原子操作,之后的軟中斷處理應該是空轉,因為肯定已經被B處理完了。如果在該原子操作之后被B打斷,則B執行完硬中斷,不會執行自己的軟中斷而是會直接退出(因為軟中斷嵌套了),返回到A的此處,A接著執行,這次A除了處理自己軟中斷,還會額外地處理B的軟中斷。

對于preempt_count中的軟中斷位,由上述可以知道,它的作用有兩個:防止軟中斷在單cpu上嵌套;保證了在執行軟中斷期間不被搶占。

最后,還得重復一句:這里講的__do_softirq函數都是在一個cpu上的處理,多個cpu上的并行是不受任何控制的。
總結

關于中斷的時序貌似很復雜,但其實都逃不過兩個原則:硬中斷會打斷硬中斷(當然是不同類型的);硬中斷會打斷軟中斷(同樣地:軟中斷不會打斷硬中斷,軟中斷也不會打斷軟中斷)。所有貌似復雜的時序其實都只是這兩個的疊加而已。

標簽:忻州 遼陽 來賓 楚雄 淄博 阜陽 荊州 迪慶

巨人網絡通訊聲明:本文標題《淺析linux內核的軟中斷情況》,本文關鍵詞  淺析,linux,內核,的,軟,中斷,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺析linux內核的軟中斷情況》相關的同類信息!
  • 本頁收集關于淺析linux內核的軟中斷情況的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    久久99精品久久久久久动态图 | 欧美一级精品在线| 一区二区在线观看不卡| 成人国产精品免费网站| 天天看天天摸天天操| 国产精品午夜在线观看| 国产精品99久久久久| 999久久久国产| 国产精品视频免费看| 成人午夜激情视频| 一本久久a久久免费精品不卡| 中文字幕一区日韩精品欧美| 成人激情黄色小说| 欧洲猛交xxxx乱大交3| 亚洲欧美在线视频观看| 91啪在线观看| 欧美日韩亚洲另类| 婷婷成人激情在线网| 青青草视频成人| 精品国产露脸精彩对白| 国产乱人伦偷精品视频不卡| www.99re6| 亚洲视频在线观看三级| 亚洲www啪成人一区二区麻豆| 色婷婷狠狠18禁久久| 欧美精品一卡两卡| 日本女人一区二区三区| av电影在线不卡| 国产精品麻豆久久久| 91麻豆国产福利精品| 91精品在线观看入口| 久久国产精品99精品国产| 国产乱子轮xxx农村| 亚洲欧美日韩综合aⅴ视频| 久久精品aⅴ无码中文字字幕重口| 欧美丰满少妇xxxxx高潮对白| 蜜臀久久99精品久久久久宅男| 精品国产aaa| 中文字幕一区二区三区av| 日本中文字幕有码| 精品99一区二区| 成人深夜视频在线观看| 欧美精品一卡二卡| 国产一区二区三区四区五区美女 | 免费观看一区二区三区| 日韩欧美国产电影| 国产成人精品三级| 欧美日韩一区视频| 九九国产精品视频| 色8久久人人97超碰香蕉987| 三级在线观看一区二区| 四虎地址8848| 亚洲国产另类av| 99在线视频免费| 国内毛片毛片毛片毛片毛片| 亚洲一卡二卡三卡四卡| 免费看裸体网站| 亚洲激情自拍视频| 中文字幕第20页| 亚洲人被黑人高潮完整版| 无遮挡aaaaa大片免费看| 国产精品久久久久三级| 国产+高潮+白浆+无码| 欧美激情资源网| 日韩av手机在线播放| 中文成人综合网| 一本色道综合久久欧美日韩精品| 中文字幕中文乱码欧美一区二区| 老司机免费视频| 中文字幕日韩一区| www.久久av| 亚洲免费观看高清完整版在线观看 | 亚洲天堂久久新| 亚洲精品精品亚洲| 大吊一区二区三区| 午夜精品久久久久久久99水蜜桃 | 丰满人妻一区二区三区大胸| 久久久久久久性| www.17c.com喷水少妇| 国产精品美女久久久久高潮| aa片在线观看视频在线播放| 亚洲免费观看视频| 国产大屁股喷水视频在线观看| 亚洲va欧美va人人爽| 国产日韩欧美在线观看视频| 蜜臀av一区二区| 欧美伊人精品成人久久综合97 | 日韩亚洲欧美在线观看| 99re视频精品| 欧美—级在线免费片| 黄色国产在线观看| 亚洲电影激情视频网站| 色综合天天综合网国产成人综合天| 久久精品国产免费| 69堂成人精品免费视频| 97久久精品人人爽人人爽蜜臀| 国产亚洲精品福利| 91精品人妻一区二区| 午夜精品久久久久久久| 欧美亚洲国产一区二区三区| 岛国av在线一区| 国产日本亚洲高清| 国产毛片久久久久久久| 五月婷婷另类国产| www.欧美日韩| 久久久亚洲高清| 亚欧洲乱码视频| 免费在线观看日韩欧美| 91精品国产一区二区三区蜜臀 | 亚洲三级在线视频| 综合久久久久久| 男女性高潮免费网站| 国产成人综合亚洲91猫咪| 久久这里都是精品| japanese中文字幕| 美女看a上一区| 欧美成人伊人久久综合网| 在线精品一区二区三区| 天堂av在线一区| 91麻豆精品国产| 一本加勒比波多野结衣| 石原莉奈在线亚洲二区| 91精品国产综合久久精品app | 成人涩涩小片视频日本| 国产不卡高清在线观看视频| 中文字幕av一区二区三区高 | 欧美喷水一区二区| 日本一区二区免费视频| 午夜伊人狠狠久久| 欧美一区二区三区系列电影| 人妻在线日韩免费视频| 青草av.久久免费一区| 日韩免费一区二区| 国产aⅴ激情无码久久久无码| 久久精品国产亚洲一区二区三区| 精品国产精品一区二区夜夜嗨| 少妇人妻好深好紧精品无码| 国产在线国偷精品产拍免费yy| 国产日韩欧美麻豆| 老熟妇高潮一区二区三区| 成人av在线影院| 亚洲另类一区二区| 欧美精品日韩综合在线| 性久久久久久久久久久| 麻豆国产精品777777在线| 久久久久久亚洲综合影院红桃 | 国内精品久久久久影院薰衣草| 国产欧美日产一区| 一道本成人在线| 日本一级大毛片a一| 奇米影视在线99精品| 久久女同精品一区二区| 东方av正在进入| 激情综合激情五月| 久久99国产精品久久| 国产精品久久久久久福利一牛影视 | 欧洲熟妇的性久久久久久| 免费在线看成人av| 国产日产亚洲精品系列| 91行情网站电视在线观看高清版| 国模无码视频一区| 精品综合久久久久久8888| 国产精品毛片大码女人| 欧美日韩视频一区二区| 亚洲av无码一区二区三区人| 26uuu久久综合| www.xxxx日本| 天天躁日日躁狠狠躁av| 狠狠色伊人亚洲综合成人| 中文字幕日韩一区二区| 制服丝袜中文字幕一区| 国产免费嫩草影院| 老女人性生活视频| 久久99精品国产麻豆婷婷 | 91在线视频网址| 男女男精品视频| 中文字幕日本乱码精品影院| 91精品国产综合久久香蕉麻豆| 免费成人深夜蜜桃视频| 中文字幕一区二区三区人妻在线视频 | 中文字幕制服丝袜一区二区三区 | 国产精品久久久久桃色tv| 555www色欧美视频| 午夜精品一区二区三级视频| 色哟哟视频在线| 国产精品一卡二| 婷婷六月综合网| 中文字幕视频一区| 欧美mv日韩mv国产| 欧美曰成人黄网| 一区二区三区在线播放视频| 91丨porny丨对白| 99在线精品一区二区三区| 久久精品国产免费看久久精品| 一区二区三区四区不卡视频| 久久精品人人做人人爽97 | 97精品国产露脸对白| 国精品**一区二区三区在线蜜桃| 亚洲综合免费观看高清在线观看| 国产日韩精品一区二区三区|