Linux Kernel(2.6)の実装に関するメモ書き

WorkQueue


ある処理を登録しておいて遅延実行する仕組。

用途に応じて自由にWorkQueueを作成することができる。WorkQueue毎にKernelThreadが生成され、そのKernelThreadがworkを処理する。このためworkはプロセスコンテキストで動作することになり、sleepすることができる。sleepしてもWorkQueue毎にKernelThreadが別であるため、他のWorkQueueの処理には影響がない。

WorkQueueにはCPU毎にキューが存在する。

KernelThreadの本体はworker_thread()。

WorkQueueのデータ構造
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を遅延実行する。



最終更新 2006/06/24 13:39:10 - kztomita
(2006/06/23 21:56:15 作成)


リンク
最近更新したページ
検索