[再録]なぜ中断が眠れないのか

  1. 割り込みコンテキストでは、現在の割り込みハンドラーに割り込むことができるのは、より優先度の高い割り込みであり、プロセスによって割り込まれないため、割り込み処理中はプロセスの切り替えは発生しません(これは、softirq、タスクレットでも同じです)。したがって、これらの下半分はスリープできません。)割り込みコンテキストでスリープする場合、すべてのwake_up_xxxは特定のプロセス用であり、割り込みコンテキストではプロセスの概念がなく、task_structがないため、スリープを解除する方法はありません。 (これは、softirqとタスクレットの場合も同じです)、ブロックを引き起こすルーチンを呼び出すなど、実際にスリープ状態になり、カーネルはほぼ確実に停止します。

2.スケジュール()は、プロセスを切り替えるときに現在のプロセスコンテキスト(CPUレジスタ値、プロセスステータス、およびスタックの内容)を保存するため、後でこのプロセスを再開できます。割り込みが発生した後、カーネルはまず現在中断されているプロセスコンテキストを保存します(割り込みハンドラーを呼び出した後に回復されます)。ただし、割り込みハンドラーでは、CPUレジスターの値が変更されている必要があります(最も重要なプログラムカウンターPC、スタックSPなど)スリープまたはブロッキング操作のためにこの時点でschedule()が呼び出された場合、保存されたプロセスコンテキストは現在のプロセスコンテキストではないため、割り込みハンドラーでschedule()を呼び出すことはできません。

3.割り込みハンドラーは、中断されたプロセスカーネルスタックを使用しますが、ハンドラーが使用されると、使用されるスタックの一部を完全にクリアし、中断される前の元の外観を復元するため、影響はありません。

4.コンテキストが中断された場合、カーネルはプリエンプティブではないため、スリープ状態になると、カーネルはハングする必要があります。

割り込みがスリープできる場合、それは多くの問題を引き起こします。たとえば、クロック割り込みでスリープすると、オペレーティングシステムのクロックは無秩序になり、スケジューラはその基礎を失います。たとえば、IPI(インタープロセッサ)、他のCPUはエンドレスループで応答を待っています。スリープしますが、他のプロセッサは機能していません。たとえば、DMA割り込みでスリープしますが、上記のプロセスは同期してI / Oを待機しています。完了すると、パフォーマンスが大幅に低下します...多くの例があります。したがって、中断はオペレーティングシステムがすぐに処理する必要がある緊急の問題であり、スリープできないためではなく、スリープする理由がないためです。

転送元:割り込みがスリープできない理由

公開された91件の元の記事 賞賛された17件 50,000回以上の閲覧

おすすめ

転載: blog.csdn.net/qq_23327993/article/details/105387782