工作佇列 實際上就是 乙個 核心執行緒維護了 乙個 工作包佇列, 這個執行緒叫做工作者執行緒
然後 其他的核心執行緒或者中斷處理程式 只需要建立 工作包, 然後 插入到工作包佇列中, 並喚醒 工作者 執行緒
此時 工作者執行緒就是一股腦的 開始 把工作包 佇列 中 的 工作包 全部給 幹完,幹完就睡覺
例如 你扔進去 乙個 包 : 包名叫做 寫乙個 linux 核心, 然後 工作者醒了之後,就開始 寫 linux 核心, 寫完了之後就開始睡覺.當然寫linux核心期間也是可以小憩的(工作者執行緒被排程出去)
.
//todo
linux中的workqueue機制就是為了簡化核心執行緒的建立。通過呼叫workqueue的介面就能建立核心執行緒。
並且可以根據當前系統cpu的個數建立執行緒的數量,使得執行緒處理的事務能夠並行化。
workqueue是核心中實現簡單而有效的機制,他顯然簡化了核心daemon的建立,方便了使用者的程式設計.
工作佇列(workqueue)是另外一種將工作推後執行的形式.工作佇列可以把工作推後,交由乙個核心執行緒去執行,
也就是說,這個下半部分可以在程序上下文中執行。最重要的就是工作佇列允許被重新排程甚至是睡眠
//todo
工作佇列執行在 核心空間, 不涉及任何使用者空間的事情
核心執行緒
kthread_create
排程 wake_up_process
一般工作佇列機制會被用作 中斷的底半部
工作佇列中的執行緒是 普通執行緒
create_workqueue
alloc_workqueue
__alloc_workqueue_key
rescuer->task =
kthread_create
(rescuer_thread, rescuer,
"%s"
, wq->name)
;中斷執行緒化中的執行緒是 實時執行緒,優先順序是 50
request_threaded_irq
__setup_irq
struct task_struct *t;
static
const
struct sched_param param =
; t =
kthread_create
(irq_thread, new,
"irq/%d-%s"
, irq, new->name)
;sched_setscheduler_nocheck
(t, sched_fifo,
¶m);
工作者執行緒 和 中斷執行緒化的執行緒 都是在 程序上下文中,因為他們都由 task_struct 結構體表示
init_workqueues 中建立的 工作者執行緒
system_wq =
alloc_workqueue
("events",0
,0);
工作佇列分析
一 用法 struct cpu workqueue struct cacheline aligned the externally visible workqueue abstraction is an array of per cpu workqueues struct workqueue str...
工作佇列模型
workqueue,中文稱其為工作佇列,是乙個用於建立核心執行緒的介面,通過它建立的核心執行緒來執行核心其他模組排列到佇列裡的工作,建立的核心執行緒被稱為工作者執行緒。要理解工作佇列的實現,重點在於理解相關的三個資料結構的含義及關係。1 表示工作佇列型別的資料結構 struct workqueue ...
工作佇列分析
一 用法 struct cpu workqueue struct cacheline aligned the externally visible workqueue abstraction is an array of per cpu workqueues struct workqueue str...