web-dev-qa-db-ja.com

SoftIRQとタスクレットの違い

Linuxの割り込み処理を調べていると、タスクレットとSoftIRQが「下半分」(優先度の低い作業)を実行する2つの異なる方法であることがわかりました。私はこれを理解しています(本当に必要です)。

違いは、SoftIRQは再入可能ですが、タスクレットは再入可能ではありません。これと同じSoftIRQを異なるCPUで実行できますが、これはタスクレットには当てはまりません。

私はこれを表面から理解していますが、2つの機能の要件を理解できていません。どのような場合にこれらの機能を使用できますか?今すぐTaskletsを使用し、次にSoftIRQを使用する必要があることを認識する方法。

また、タスクレットがSoftIRQで作成されるとはどういう意味ですか?私がLKMLで読んだ本の1つで、タスクレットを削除することについての議論がありました。なぜこのような機能を導入するのか、完全に混乱しました。近視眼(犯罪を意味しない)?

これに関する任意のポインタは非常に役立ちます。

21
ultimate cause

include/linux/interrupt.h

_/* PLEASE, avoid to allocate new softirqs, if you need not _really_ high
   frequency threaded job scheduling. For almost all the purposes
   tasklets are more than enough. F.e. all serial device BHs et
   al. should be converted to tasklets, not to softirqs.
 */

enum
{
        HI_SOFTIRQ=0,    /* High Priority */
        TIMER_SOFTIRQ,
        NET_TX_SOFTIRQ,
        NET_RX_SOFTIRQ,
        BLOCK_SOFTIRQ,
        BLOCK_IOPOLL_SOFTIRQ,
        TASKLET_SOFTIRQ,
        SCHED_SOFTIRQ,
        HRTIMER_SOFTIRQ,
        RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */

        NR_SOFTIRQS
};
_

softirqtaskletの主な違いは次のとおりです。

割り当て

  • Softirqはコンパイル時に静的に割り当てられます。タスクレットとは異なり、softirqを動的に登録および破棄することはできません。
  • タスクレットは、DECLARE_TASKLET(name, func, data)を使用して静的に割り当てることも、tasklet_init(name, func, data)を使用して動的に割り当て、実行時に初期化することもできます。

並行性

  • Softirqはreentrant関数であり、スピンロックを使用してデータ構造を明示的に保護する必要があるため、同じタイプであっても複数のCPUで同時に実行できます。
  • タスクレットは_non-reentrant_であり、同じタイプのタスクレットは常にシリアル化されます。つまり、同じタイプのタスクレットを同時に2つのCPUで実行することはできません。ただし、異なるタイプのタスクレットは、複数のCPUで同時に実行できます。

処理

  • Softirqはraise_softirq()によってアクティブ化されます。保留中のsoftirqは、do_softirq()またはlocal_bh_enable()によって有効にされた後、spin_unlock_bh()およびksoftirqdカーネルスレッドによって処理されます
  • タスクレットは、softirqの上に構築された下半分のメカニズムです。つまり、タスクレットは、2つのsoftirq:_HI_SOFTIRQ_および_TASKLET_SOFTIRQ_で表されます。タスクレットは実際にはsoftirqから実行されます。これらのタイプの唯一の真の違いは、_HI_SOFTIRQ_タスクレットの前に_TASKLET_SOFTIRQ_ベースのタスクレットが実行されることです。したがって、tasklet_schedule()は基本的にraise_softirq(TASKLET_SOFTIRQ)を呼び出します
  • Softirqs(およびタスクレットとタイマー)は、ハードウェア割り込みからの戻り時、またはシステムコールからの戻り時に実行されることに注意してください。また、softirqを発生させたスレッドが終了するとすぐに、その単一のsoftirq(およびその他のスレッド)が実行され、_softirq latency_が最小化されます。
18
manav m-n

Sofirqは再入可能です。つまり、異なるCPUが同じsoftirqを取得して実行できますが、タスクレットが実行されている同じCPUであるタスクレットがシリアル化されている間、タスクレットはそれを完了する権利を持ち、他のCPUはそれを取得できません(スケジューリングの)。これを参照 excellent 記事。

また、実際に_ _local_bh_countをゼロ以外にするローカルCPUでlocal_bh_enable()を使用して、遅延処理を有効/無効にすることもできます。

また この本を読む (無料でダウンロード可能)ページ番号131-違いを説明するとともに、偽/ダミーデバイスを使用したコード例を使用した説明-ローラー。

11
Raulp

Softirqはコンパイル時に静的に割り当てられます。タスクレットとは異なり、softirqsを動的に登録および破棄することはできません。タスクレットはsoftirqs(動作中)に似ていますが、インターフェースが単純です。 Softirqは、非常に高い頻度で高度にスレッド化された用途でのみ必要ですが、タスクレットは他の場合でも問題なく機能します。

2
Tejas

タスクレットはsoftirqの上に実装されるため、softirqです。それらは2つのsoftirqで表され、「HI_SOFTIRQ&TASKLET_SOFTIRQ」の違いが優先されます。それらはsoftirqの上に実装されていますが、以下の点で異なります。

  • タスクレットは静的または動的に作成/破棄できますが、softirqは静的な方法でのみ作成できます。

  • 2つの異なるタスクレットを同じCPUで同時に実行できます。ただし、同じタイプの2つのタスクレットを同じCPUで実行することはできません。一方、softirqは逆です。

Softirqは、システム上で最もタイムクリティカルで重要な下半分処理のために予約されています。

1
Nagi