Linuxの割り込み処理を調べていると、タスクレットとSoftIRQが「下半分」(優先度の低い作業)を実行する2つの異なる方法であることがわかりました。私はこれを理解しています(本当に必要です)。
違いは、SoftIRQは再入可能ですが、タスクレットは再入可能ではありません。これと同じSoftIRQを異なるCPUで実行できますが、これはタスクレットには当てはまりません。
私はこれを表面から理解していますが、2つの機能の要件を理解できていません。どのような場合にこれらの機能を使用できますか?今すぐTaskletsを使用し、次にSoftIRQを使用する必要があることを認識する方法。
また、タスクレットがSoftIRQで作成されるとはどういう意味ですか?私がLKMLで読んだ本の1つで、タスクレットを削除することについての議論がありました。なぜこのような機能を導入するのか、完全に混乱しました。近視眼(犯罪を意味しない)?
これに関する任意のポインタは非常に役立ちます。
_/* 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
の主な違いは次のとおりです。
割り当て
DECLARE_TASKLET(name, func, data)
を使用して静的に割り当てることも、tasklet_init(name, func, data)
を使用して動的に割り当て、実行時に初期化することもできます。並行性
reentrant
関数であり、スピンロックを使用してデータ構造を明示的に保護する必要があるため、同じタイプであっても複数のCPUで同時に実行できます。non-reentrant
_であり、同じタイプのタスクレットは常にシリアル化されます。つまり、同じタイプのタスクレットを同時に2つのCPUで実行することはできません。ただし、異なるタイプのタスクレットは、複数のCPUで同時に実行できます。処理
raise_softirq()
によってアクティブ化されます。保留中のsoftirqは、do_softirq()
またはlocal_bh_enable()
によって有効にされた後、spin_unlock_bh()
およびksoftirqd
カーネルスレッドによって処理されますHI_SOFTIRQ
_および_TASKLET_SOFTIRQ
_で表されます。タスクレットは実際にはsoftirqから実行されます。これらのタイプの唯一の真の違いは、_HI_SOFTIRQ
_タスクレットの前に_TASKLET_SOFTIRQ
_ベースのタスクレットが実行されることです。したがって、tasklet_schedule()
は基本的にraise_softirq(TASKLET_SOFTIRQ)
を呼び出しますsoftirq latency
_が最小化されます。Sofirqは再入可能です。つまり、異なるCPUが同じsoftirqを取得して実行できますが、タスクレットが実行されている同じCPUであるタスクレットがシリアル化されている間、タスクレットはそれを完了する権利を持ち、他のCPUはそれを取得できません(スケジューリングの)。これを参照 excellent 記事。
また、実際に_ _local_bh_countをゼロ以外にするローカルCPUでlocal_bh_enable()を使用して、遅延処理を有効/無効にすることもできます。
また この本を読む (無料でダウンロード可能)ページ番号131-違いを説明するとともに、偽/ダミーデバイスを使用したコード例を使用した説明-ローラー。
Softirqはコンパイル時に静的に割り当てられます。タスクレットとは異なり、softirqsを動的に登録および破棄することはできません。タスクレットはsoftirqs(動作中)に似ていますが、インターフェースが単純です。 Softirqは、非常に高い頻度で高度にスレッド化された用途でのみ必要ですが、タスクレットは他の場合でも問題なく機能します。
タスクレットはsoftirqの上に実装されるため、softirqです。それらは2つのsoftirqで表され、「HI_SOFTIRQ&TASKLET_SOFTIRQ」の違いが優先されます。それらはsoftirqの上に実装されていますが、以下の点で異なります。
タスクレットは静的または動的に作成/破棄できますが、softirqは静的な方法でのみ作成できます。
2つの異なるタスクレットを同じCPUで同時に実行できます。ただし、同じタイプの2つのタスクレットを同じCPUで実行することはできません。一方、softirqは逆です。
Softirqは、システム上で最もタイムクリティカルで重要な下半分処理のために予約されています。