ソフトウェア割り込みとハードウェア割り込みの概念を理論的に理解しましたが、ソフトウェア割り込みの例を挙げて説明することはできますか?? それは私にとって大きな助けになるでしょう。
Windows または Linux オペレーティング システム用の C プログラムの例
割り込みは、オペレーティング システムのカーネルによって処理されます。アプリケーションはそれらを認識しません (カーネルがすべての割り込みを処理し、アプリケーションからそれらを隠すため)。Linux では、アプリケーションプロセスがシグナルを認識します。signal(7)を参照し、 Advanced Linux Programmingをお読みください。
C11標準 (C プログラミング言語) は割り込みについて認識していないことに注意してください。
シグナルは割り込みではないことを理解してください (Linux アプリケーションは、 proc(5)を介して測定する場合を除いて、割り込みを直接認識しません。 file を参照してください/proc/interrupts
)。また、シグナル ハンドラーには厳しい制限があります。シグナル ハンドラーから (直接的または間接的に) 呼び出すことができるのは、非同期シグナル セーフ関数のみです。多くの場合、volatile sig_atomic_t
シグナル ハンドラーでフラグを設定することは賢明であり、アプリケーションはそれを別の場所でテストする必要があります。
Linux 固有のsignalfd(2)を使用するイベント ループ(例: poll(2)など)がある場合は、非常に便利です。
したがって、Linux アプリケーション (およびおそらく Windows アプリケーション) をプログラミングする場合、割り込みは気にしません (ただし、いくつかのシグナルを処理する場合があります)。ところで、Linux カーネルは通常、毎秒数百 (またはおそらく数千) の割り込みを確認し、一部のドライバーを起動したり、それらのほとんどのタスクを再スケジュールしたりします。特定の Linux アプリケーション プロセスは、通常、1 秒あたり 1 つのシグナルよりもはるかに少ない数のシグナルを処理します (ただし、YMMV)。