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
ます。