24

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

違いは、SoftIRQは再エンタラントですが、タスクレットは再エンタラントではありません。同じSoftIRQを異なるCPUで実行できますが、タスクレットの場合はそうではありません。

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

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

これに関するポインタは大いに役立ちます。

4

4 に答える 4

21

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
};

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

割り当て

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

並行性

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

処理

  • Softirqは、によってアクティブ化されraise_softirq()ます。保留中のsoftirqは、またはによって有効化された後do_softirq()ksoftirqdカーネルスレッドによって処理されます。local_bh_enable()spin_unlock_bh()
  • タスクレットは、softirqの上に構築された下半分のメカニズムです。つまり、タスクレットは2つのsoftirqで表されHI_SOFTIRQますTASKLET_SOFTIRQ。タスクレットは実際にはsoftirqから実行されます。これらのタイプの唯一の実際の違いは、HI_SOFTIRQベースのタスクレットがタスクレットの前に実行されることTASKLET_SOFTIRQです。だから、tasklet_schedule()基本的にraise_softirq(TASKLET_SOFTIRQ)
  • softirq(したがって、タスクレットとタイマー)は、ハードウェア割り込みからの復帰時、またはシステムコールからの復帰時に実行されることに注意してください。また、softirqを上げたスレッドが終了するとすぐに、その単一のsoftirq(およびその他)が実行され、を最小化しsoftirq latencyます。
于 2015-07-29T16:44:58.113 に答える
11

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

また、ローカルCPUでlocal_bh_enable()を使用して、延期処理を有効/無効にすることもできます。これにより、実際には__local_bh_countがゼロ以外になります。

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

于 2012-05-31T15:27:07.923 に答える
2

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

于 2014-10-01T05:09:24.290 に答える
1

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

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

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

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

于 2015-06-16T04:56:12.033 に答える