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

WorkQueue


Rev.1を表示中。最新版はこちら

Process Contextで処理したい仕事(Work)をWorkQueueに登録しておく。
(タイマ割り込みだと割り込みコンテキストになってしまう)

WorkQueue毎にKernelThreadが存在し、そのKernelThreadが適宜workを処理する。
KernelThreadから起動されるのでworkはプロセスコンテキストで動作することになる。

KernelThreadの本体はworker_thread()

CPU毎にキューを持つ

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するのに使われる?



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


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