遅延処理
読み:ちえんしょり
外語:deference

 使用したい媒体が使用中または稼動前であるなどの理由で利用できないとき、しばらく後に再実行するために実行を遅らせる処理のこと。
目次

概要
 ユーザー空間カーネル空間でそれぞれ手法は異なるが、何らかの方法が用意されているものである。
 OSの力を借りず直接ハードウェアを制御するような組み込みの世界の場合は、タイマー割り込みなどを使うことになる。

特徴

カーネル
 カーネル内では、様々な制御が行なわれる。
 このような場合、いますぐに実行できない処理も多く発生するため、これを後で実行するという場合もありうる。この場合、基本的にはタイマー割り込み処理を使用し、一定時間後に、再度処理を呼び出すことになる。
 Linuxカーネルでは、タイマーはtimer_listやhrtimerなどがあり、コールバック関数(割り込みハンドラー)を提供している。
 ただしコールバック関数内ではさまざまな制限があり、長時間の処理を行なわないようにすることが求められる。mutex_lock等などを使うことはご法度であり、システム全体に支障が出ることがある。
 そこでLinuxカーネルの場合は、taskletとworkqueueが用意されている。

tasklet
 taskletは、カーネルに余裕があるときに処理を実行してもらうための機能である。
 割り込みハンドラーなど即座に制御を戻さなければならないような場合に使用すると、後で指定したコールバック関数を呼び出してくれる。
 taskletに登録された処理は全て、カーネルタスク(ksoftirqd)として実行される。
 このためどれか一つのタスクでも遅延が生じると、全体に影響が及ぶ。

workqueue
 workqueueはtaskletの問題を改善するもので、専用のカーネルスレッドを作って実行する。また、指定した時間経過後に処理を呼び出すことが可能であり、利便性が高い。
 予め用意されているシステム共有のカーネルスレッドとキューを用いても良いし、create_workqueue()関数で独自のカーネルスレッドとキューを作成し使用することもできる。
 ワークキュー内でsleepした場合などは、その影響はそのワークキューが持つ全てのワークに及ぶ。

再検索