您現在的位置是:首頁 > 手機遊戲首頁手機遊戲

linux的核心執行緒

簡介上邊 這 siftirq 和 tasklet 的執行,實際還是由中斷觸發的,Linux kernel 的 程序排程機制不會觸發他們的執行

電腦的系統碎片是垃圾嗎

在 Linux 系統上程式設計,做一個app 或伺服器等 使用者空間程式,可以 把計算任務 分配到程序,執行緒 , 或goroutines。

在這裡,程序,執行緒,和 goroutines 的區別 就是 佔用計算資源的多少 和 程式設計介面 複雜程度不同。

在 Linux 核心 程式設計時,也有幾種程式設計介面 ,可以實現計算任務的分配。

linux的核心執行緒

機場塔臺負責排程飛機使用跑道

中斷服務程式,是第一種,比如網絡卡上收到網路包,需要及時把包從網絡卡copy 到記憶體裡,否則有可能掉包。

中斷服務程式 反應是最及時的,它執行時,需要將系統的中斷關閉。比如 系統上 安了 兩個網絡卡,一個網絡卡A上來了包,觸發了中斷服務程式,正在執行,另一個網絡卡B上也收到了包,只有等A 的中斷服務程式執行完,才能開啟中斷,執行B 的中斷服務程式。

所以需要將中斷服務程式裡的計算任務減到最可能小,只要不掉包就可以了,收到網路包,進行協議解析,是否要應答等 行為,

放到延遲行為 部分執行。

可延遲行為 deferable action ,又有三種機制。

都是開中斷的。

第一種,softirq 軟中斷,有多少個軟中斷號,是系統先預定的。

第二種,tasklet 這個數目不固定,可以動態分配,也是用軟中斷 實現的,執行完其它軟中斷,就執行這些 tasklet

linux的核心執行緒

車隊排程也是複雜

第三種 workqueue 這些是由 核心執行緒執行。

上邊 這 siftirq 和 tasklet 的執行,實際還是由中斷觸發的,Linux kernel 的 程序排程機制不會觸發他們的執行。

所以 把他們 叫做 在 中斷上下文 context 內執行。

而 workqueue 則與它們兩不同,會被Linux 程序排程機制觸發,所以 叫作 執行在 程序上下文內。

區分 這兩個上下文 context 有什麼實際意義呢,就在於 中斷 上下文 內,不能呼叫有可能引起 阻塞的函式,比如等待獲取一個訊號量。 但可以用 spinlock,spinlock 是忙等待。 不會阻塞,一直在檢查。

而在程序上下文內,可以呼叫引起阻塞的函式。

比如說,一個使用者程序正在 計算,它的時間片 用完了,該切換別的程序了,是誰做這個事情呢? 是如何被觸發的?

Linux 核心 程序排程,也是被中斷觸發的,系統會有一個硬體定時器 作為觸發程序排程的時間節奏源。

這個定時器 一般設定為 一秒 發出1000次到期訊號。當然 編譯核心時,這個引數可以自己修改設定。

每到期一次,系統的 jiffies 就加1

linux的核心執行緒

多工和多核CPU 的複雜交織在一起

一個程式設計環境的複雜程度,可以用 它提供的api 的複雜程度來大致評估。

如果一個程式設計環境,提供了許多 api,這些api 之間配合,又容易被誤用,那這個程式設計環境就複雜。總體來說,。kernel 的程式設計環境,比使用者空間複雜。

Top