2.6.11版本的核心軟中斷執行緒ksoftirqd**如下,下面框架可以看出對於,吞吐量與處理延遲兩者之間的權衡。
軟中斷執行緒處理概括:
1、如果沒有活幹(沒有軟中斷等待處理)就 schedule()切出,並從執行佇列裡面刪除(由於任務狀態已經變成task_interruptible)
2、如果有活兒幹,就把當前pending的軟中斷處理完,處理過程中檢查如果本執行緒執行時間過長,則 schedule()切出(cond_resched()完成這一切),避免其他執行緒餓死。但切出時任務狀態是task_running,不會移出執行佇列(執行緒還有活兒沒幹完,得趕緊回來),由於移出前,關閉了核心搶占,很快就會重新排程到本執行緒的。
3、系統排程讓其他程序執行一段時間後,本程序重新切換回來執行,重複第2步,一直到該處理得軟中斷處理完
4、一批軟中斷處理完後,設定任務狀態是task_interruptible,為無軟新的軟中斷過來時切出去並移出執行佇列準備。
假如:一次來了8個軟中斷要處理,需要連續處理完8個軟中斷,期間可以會切出;如果處理完這組最後乙個軟中斷後正好切出(呼叫 cond_resched()時裡面檢查時間片到),然後一段時間後切換回來,發現切出的這段時間有新的軟中斷等待處理,則有繼續處理。
static intksoftirqd(void * __bind_cpu)
set_current_state(task_interruptible); <---設定任務狀態為task_interruptible,為重新迴圈開始時,發現如果沒活兒幹任務切出,並移出執行佇列準備
}__set_current_state(task_running);
return 0;
wait_to_die: <---出錯的時候才會走入這個處理
preempt_enable();
set_current_state(task_interruptible);
while (!kthread_should_stop())
__set_current_state(task_running);
return 0;
}int __schedcond_resched(void)
return 0;
}static inline void__cond_resched(void)
while (need_resched());
}static inline intneed_resched(void)
上述軟中斷執行緒處理得經典框架可以作為有類似處理核心執行緒的通用框架。
static intkmythread(...)
set_current_state(task_interruptible);
}__set_current_state(task_running);
return 0;
linux的核心程序 執行緒
linux啟動後,核心自動執行如下執行緒 程序 核心其實是不區分程序和執行緒的。idle程序 pid 0。系統的啟動程序。啟動後負責程序的排程。init程序 pid 1。由idle程序建立,首先負責系統的啟動。負責啟動所有其他程序。啟動後變成守護程序,用於監視其他所有程序和使用者程序的啟動。所有使用...
如何獲取linux核心執行緒的pid
如果是pthread,則使用,include pthread t pthread self void 如果不是pthread,即是由核心建立的執行緒,則使用,include pid t gettid void 獲取執行緒所在的程序的id,方法如下 include include pid t getp...
Linux核心執行緒記錄 激情燃燒的歲月
在 linux 中,使用者態程序的 祖先 都是 pid 號為 1 的 init 程序。現在主流的 linux 發行版中,init 都是 systemd 程序 而其他的使用者態程序,會通過 systemd 來進行管理。linux 中的各種程序,除了使用者態程序外,還有大量的核心態執行緒。那麼,核心態執...