Linuxカーネルで作業をスケジュールするには、タイマー、タスクレット、ワークキュー、カーネルスレッドなど、多くの方法があります。どちらを使用するかについてのガイドラインは何ですか?
明らかな要素があります。タイマー関数とタスクレットはスリープできないため、ミューテックスや条件変数などを待機できません。
ドライバーでどのメカニズムを選択するかについて、他の要因は何ですか?
推奨されるメカニズムはどれですか?
あなたが言ったように、それは手元のタスクに依存します:
ワークキューは、作業をカーネルスレッドに延期します。作業は常にプロセスコンテキストで実行されます。それらはスケジュール可能であり、したがって眠ることができます。
通常、ワークキューまたはsotftirqs/taskletsの間に議論はありません。延期された作業がスリープする必要がある場合は、作業キューが使用されます。それ以外の場合は、softirqまたはタスクレットが使用されます。タスクレットは割り込み処理にも適しています(タスクレットは次のティック以降に実行されることはなく、タスクレットは常にそれ自体に関してシリアル化されるなど)。
カーネルタイマーは、何かを実行したいときが正確にわかっていて、その間にプロセスを中断またはブロックしたくない場合に適しています。これらはプロセスコンテキストの外で実行され、他のコードに関しても非同期であるため、注意しないと競合状態の原因になります。
お役に立てれば。
softirqs:割り込みコンテキストでの遅延作業の実行 タスクレット:割り込みコンテキストでの遅延作業の実行 作業キュー:プロセスコンテキストでの遅延作業の実行 softirqs:異なるCPUで同時に実行できません タスクレット:異なるCPUで同時に実行できません ワークキュー:異なるCPUで同時に実行できます softirqs:に移動できませんスリープ タスクレット:スリープ状態に移行できません ワークキュー:スリープ状態に移行できます softirqs:プリエンプトできません/スケジュールできません タスクレット:スリープ状態にできませんプリエンプト/スケジュール ワークキュー:プリエンプション/スケジュール softirqs:使いにくい タスクレット:使いやすい ワークキュー:使いやすい
カーネルスレッドは、ワークキューの基礎を形成します。これらは、プロセスコンテキスト内で実行される唯一のタイプのカーネルヘルパールーチンです。