プロセス コンテキストと割り込みコンテキストがあることは知っていますが、softirq や tasklet を実行するときに、どのコンテキストで実行されるのかわかりません。
「下半分のコンテキスト」という用語を使用している人を見たことがありますが、そのような用語がある場合、他の用語との違いは何ですか。
softirq と tasklet に対するもう 1 つの質問は、実行中にスリープが許可されないのはなぜですか??
誰でもこれらの質問を特定するのを手伝ってもらえますか、ありがとう!!
プロセス コンテキストと割り込みコンテキストがあることは知っていますが、softirq や tasklet を実行するときに、どのコンテキストで実行されるのかわかりません。
「下半分のコンテキスト」という用語を使用している人を見たことがありますが、そのような用語がある場合、他の用語との違いは何ですか。
softirq と tasklet に対するもう 1 つの質問は、実行中にスリープが許可されないのはなぜですか??
誰でもこれらの質問を特定するのを手伝ってもらえますか、ありがとう!!
softirq と tasklet はどちらも一種の下半分のメカニズムです。プロセス コンテキストではなく割り込みコンテキストで実行されるため、スリープは許可されません。スリープが許可されている場合、Linux はそれらをスケジュールできず、最終的に dequeue_task エラーでカーネル パニックを引き起こします。割り込みコンテキストには、レジスタ情報を記述するデータ構造さえないため、Linux でスケジュールすることはできません。そのような構造に設計されており、スケジュール可能であると、割り込み処理プロセスのパフォーマンスに影響します。
@kai: 下半分が実行されるコンテキストの qs reg は?
技術的には、softirqは割り込みコンテキスト (「softirq」コンテキスト) で実行されます。「hard-irq」コンテキスト (ハードウェア割り込みが発生したときのコンテキスト) ではないというだけです。
したがって、softirq ハンドラーでは、Linux が提供する「ルックアップ」マクロに関しては次のようになります。
in_interrupt: はい | in_irq: いいえ | in_softirq: はい | in_serving_softirq: はい
ただし、注意してください (注意!!! :):「割り込みハンドラーに適用されるすべての制限は、下半分にも適用されます。したがって、下半分はスリープできず、ユーザー空間にアクセスできず、スケジューラーを呼び出すこともできません。」-- LDD3.
ジャーメインが残りの質問に答えます。
[更新] さらに、必要に応じてデバッグ情報を出力するのに役立つシンプルで洗練されたマクロを定義できることを指摘したいと思います。何年にもわたって、私はこれらのマクロと便利なルーチンをヘッダー ファイルに入れてきました。ここで確認してダウンロードできます: "A Header of Convenience" .
次のマクロ/関数があります。
ふぅ:-)
私は受け入れられた答えとカイワンの答えに同意しますが、彼らは言及しませんでしたksoftirqd
. CPU が softirq および/またはタスクレットの負荷が高い場合、ksoftirqd
発生した softirq およびタスクレットをプロセス コンテキストで処理するスレッドをスケジュールします。
したがって、OPの質問に対する答えは次のようになると思います。softirqは、割り込みコンテキストまたはプロセスコンテキストで実行できます。
更新:ローカル irq を無効にして呼び出されたrun_ksoftirqd()
ショーのクイック ルック。__do_softirq()
したがって、技術的にはプロセス コンテキストで実行している間は、同じ制限 (スリープしないなど) が適用されます。