WorkQueue
Rev.6を表示中。最新版はこちら。
ある処理を登録しておいて遅延実行する仕組。用途に応じて自由にWorkQueueを作成することができる。WorkQueue毎にKernelThreadが生成され、そのKernelThreadがworkを処理する。このためworkはプロセスコンテキストで動作することになり、sleepすることができる。sleepしてもWorkQueue毎にKernelThreadが別であるため、他のWorkQueueの処理には影響がない。
WorkQueueにはCPU毎にキューが存在する。
KernelThreadの本体はworker_thread()。
struct workqueue_struct
+------------+
| |
| |struct cpu_workqueue_struct
+------------+ ------ +---------+
| cpu_wq[0] | | |
+------------+ | | struct work_struct
| cpu_wq[1] | \ |worklist | ---> +-------+ --->
+------------+ \ |more_work| | func |
: \ |work_done| | |
+------------+ \ | | +-------+
| cpu_wq[N] | \ | |
+------------+ \ +---------+
| |
| |
+------------+
カーネルスレッドの処理
worker_thread()
workがなくなったらscheduleをコールしてSleep
(WaitQueueはmore_workを使用)
run_workqueue()
worklistに連なっているworkについて
(1) work->func()を実行
(2) wake_up(&work_done)
<-- work_doneには何が積まれている?
flush処理がsleepするのに使われる?
[関連関数]
create_workqueue()
WorkQueueを作成し、WorkQueueを処理するためのカーネルスレッドを生成する。
INIT_WORK()
work_structを初期化する。
queue_work()
WorkQueueにwork_structを入れてカーネルスレッドをWakeupする。
queue_delayed_work()
時間(jiffies)を指定してworkを遅延実行する。