タスクキュー

BHハンドラは32種類しかなく、また殆ど予約済みあるためタスクキューという機能が拡張されている。無制限に登録できるBHハンドラのようなものである。一つのBHハンドラのエントリに、複数の処理を登録できるように拡張されている。(TQUEUE_BH番目とIMMEDIATE_BH番目のエントリ)

この機能を利用する場合、各キューに登録する遅延処理要求のパケットは、呼び出し側で用意する必要がある。遅延処理要求のパケットの用意ができたら、あとはqueue_task()関数にてその処理を登録するだけである。

queue_task()関数にて目的のキューに処理を登録できる。登録された処理は、適当な時期に呼び出されるrun_task_queue()により実行される。各キューに登録する遅延処理要求のパケットを呼び出し側で用意しなければならないというわずらわしさはあるが、パケット不足で登録処理が失敗する危険を心配しなくてよい点は優れている。

img15.gif

タスクキューには何種類かあり、目的に合わせて登録する先を選ぶことができる。登録された処理は、上記の図に示したモジュールが呼び出すrun_task_queue()関数により実行される。

  • tq_immediateに登録されている処理は、カーネル処理が無くなったら 即実行される。呼び出し処理は実はBHハンドラで実現されている。
  • tq_timerに登録されている処理は、クロック処理のタイミングで 実行される。呼び出し処理は実はBHハンドラで実現されている。
  • tq_schedulerに登録されている処理は、プロセススイッチの タイミングで起動される。
  • tq_diskに登録されている処理は、フィアルシステムが適当な タイミングで起動する。ドライバへのI/O要求を遅延させ、最も 効率的なI/O順に変更することを可能としている。 ファイルシステムモジュール以外では利用できない。
  • tq_contextに登録されている処理は、tq_contextタスクキュー実行 専用のスレッドによって実行される。tq_schedulerの置き換えを 考えているようだ。

 

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1