SCHED_SOFTIRQ 在 Linux 中的功能是什麼?
誰提出了這個軟中斷?每次滴答都會引發(基於定時器中斷?)
這是否會使核心調度一個可執行的程序?如果是,那麼低優先級軟中斷(HR_TIMER,RCU_SOFTIRQ)的處理程序如何執行,因為現在執行是程序上下文(在調度()之後)?
根據核心文件:
軟體中斷上下文:Softirqs 和 Tasklet
每當系統呼叫即將返回到使用者空間或硬體中斷處理程序退出時,任何標記為待處理(通常由硬體中斷)的“軟體中斷”都會執行(kernel/softirq.c)。
許多真正的中斷處理工作都在這裡完成。在過渡到 SMP 的早期,只有“下半部分”(BH),它沒有利用多個 CPU。在我們從由火柴棍和鼻涕製成的發條電腦切換後不久,我們放棄了這個限制並切換到“softirqs”。
include/linux/interrupt.h 列出了不同的軟中斷。一個非常重要的軟中斷是定時器軟中斷(include/linux/timer.h):您可以註冊讓它在給定的時間長度內為您呼叫函式。
處理軟中斷通常很痛苦,因為同一個軟中斷將同時在多個 CPU 上執行。出於這個原因,tasklet (include/linux/interrupt.h) 更常用:它們是可動態註冊的(這意味著您可以擁有任意數量的),並且它們還保證任何 tasklet 只能在一個 CPU 上執行任何時候,儘管不同的小任務可以同時執行。
警告“tasklet”這個名稱具有誤導性:它們與“任務”無關,可能更多地與 Alexey Kuznetsov 當時喝的一些劣質伏特加有關。
您可以使用 in_softirq() 宏 (include/linux/interrupt.h) 告訴您您在 softirq(或 tasklet)中。
警告請注意,如果持有 bh 鎖(見下文),這將返回誤報。