私はここで例外についていくつかの質問を見てきました、そしてそれらのいくつかは例外として割り込みをほのめかします、しかしどれも接続を明確にしません。
割り込みとは何ですか?
例外とは何ですか?(いくつかの違いがあるので、あなたが知っている各言語の例外を説明してください)
例外はいつ割り込みであり、その逆はいつですか?
私はここで例外についていくつかの質問を見てきました、そしてそれらのいくつかは例外として割り込みをほのめかします、しかしどれも接続を明確にしません。
割り込みとは何ですか?
例外とは何ですか?(いくつかの違いがあるので、あなたが知っている各言語の例外を説明してください)
例外はいつ割り込みであり、その逆はいつですか?
プロセッサには、多数の外部割り込みピンがあります。通常、これらのピンはハードウェアに接続され、何らかの外部イベントが発生したことを示すために使用されます。たとえば、シリアル ポートを使用している場合、UART はプロセッサの割り込みピンの 1 つに接続されているピンを発生させ、バイトが受信されたことを示します。
タイマー、USB コントローラーなどの他の周辺機器も、何らかの外部イベントに基づいて割り込みを生成します。
プロセッサが外部割り込みピンの 1 つで信号を受信すると、すぐにメモリ内の指定された場所にジャンプして実行を開始します。実行されるコードは通常、ISR または割り込みサービス ルーチンと呼ばれます。ドライバーを実装したり、ある種の組み込みソフトウェアを実行したりしない限り、ISR に遭遇することはまずありません。
残念ながら、例外に関する質問への回答は少し明確ではありません。このページの他の回答には、3 つの異なる意味が記載されています。
Ron Savage の回答は、ソフトウェアの構造に関するものです。これは純粋にアプリケーション レベルの例外であり、コードの一部が他のコードによって検出できるエラーを示すことができます。ここにはハードウェアの関与はまったくありません。
次に、タスクによって見られる例外があります。これはオペレーティング システム レベルの構成要素であり、0 による除算、不正なメモリ アクセスなどの不正な処理を実行したときにタスクを強制終了するために使用されます。
そして第三に、ハードウェアの例外があります。動作に関しては、プロセッサが指定されたメモリ位置にすぐにジャンプして実行を開始するという点で、割り込みと同じです。例外が割り込みと異なる点は、プロセッサが検出した不正なアクティビティによって例外が発生することです。たとえば、プロセッサの MMU は不正なメモリ アクセスを検出し、例外を発生させます。これらのハードウェア例外は、オペレーティング システムがクリーンアップ タスクを実行するための最初のトリガーです (上記の段落で説明したように)。
割り込みは、CPU の外部デバイス (タイマー ティック、ディスク操作の完了、ネットワーク パケットの到着など) によって生成され、プログラムの実行とは非同期です。例外は、プログラムの実行と同期します (ゼロ除算、無効なアドレスへのアクセスなど)。
プログラムがオペレーティング システムなしで実行されている場合 (または OS を開発している場合) を除き、生の例外/割り込みが発生することはありません。これらは、OS によって捕捉されて処理される (割り込み) か、ユーザー プログラムに反映される前に他の形式に変換されます (例: UNIX のシグナル、Windows の構造化例外処理 (SEH))。それ。
割り込みは、ハードウェアまたは特定のCPU命令によって生成されたCPU信号です。これらにより、割り込みハンドラーが実行されます。I/OハードウェアからのI/O信号などは、割り込みを生成します。
例外は、プロセスにのみ影響する、ソフトウェアバージョンの割り込みと考えることができます。
正確な詳細はわかりませんが、割り込みによって例外が実装される可能性があります。
割り込みは、プロセッサ コアの外部にある何かに注意が必要であることを示します。プログラムの通常の流れを中断し、割り込みサービス ルーチン (ISR) を実行し、通常は割り込みが発生する前の場所に戻ります。
この基本的なテーマにはさまざまなバリエーションがあります。ソフトウェアによって割り込みが生成されたり、ISR の後に別のタスクが CPU を取得したりする可能性があります。を制御します。
例外は、3 つのレベルの意味を持つ可能性があるため、定義するのが少し難しいです。
ハードウェアの例外
特定のプロセッサ (PowerPC など) は、ある種の異常な状態が発生したことを示す例外を定義します: システム リセット、無効なアドレス、仮想アドレス変換キャッシュ ミスなど...
これらの例外は、ブレークポイントとシステム コールの実装にも使用されます。この場合、それらはほとんど割り込みのように機能します。
OS 例外
一部のハードウェア例外は、OS によって処理されます。たとえば、プログラムが無効なメモリにアクセスします。これにより、ハードウェア例外が発生します。OS にはその例外のハンドラーがあり、問題があることを示す信号 (SIGSEGV など) を OS がアプリケーションに送信する可能性があります。
プログラムにシグナル ハンドラーがインストールされている場合、シグナル ハンドラーが実行され、うまくいけば状況に対処します。シグナル ハンドラーがない場合は、プログラムを終了または中断できます。
ウィンドウの構造化例外ハンドラー (SEH) は、このタイプの例外であると考えています。
ソフトウェアの例外
Java、C++、C# などの一部の言語には、ソフトウェア例外の概念があり、プログラムの動作に関連する予期しないまたは異常な状態の処理が言語によって提供されます。この場合、コードのある時点で例外が発生し、プログラム実行スタックの上位にあるコードが例外を「キャッチ」して実行します。これは、try/catch ブロックが行うことです。
割り込みとは何かについて詳しく説明します。これは、まだ誰も扱っていない重要な種類の割り込みがあるからです。それはタイマーです。
しかし、最初に、バックアップさせてください。割り込みが発生すると、割り込みハンドラー (カーネル空間に存在する) が実行され、通常は割り込みが無効になり、保留中のビジネス (ネットワークに到着したばかりのパケットの処理、キーストロークの処理など) が監視されます。この時点ではまだカーネル内にいます) 次に実行する予定のプロセスを特定し (同じプロセスである可能性も、別のプロセスである可能性もあり、スケジューラによって異なります)、それを実行します。
プロセッサ上で一度に実行されるプロセスは 1 つだけです。また、マルチタスク OS を使用している場合、それらを切り替える方法はコンテキスト スイッチと呼ばれます。基本的には、プロセッサのレジスタがメモリにダンプされ、フローが新しいプロセスに渡され、プロセスが完了したら、コンテキスト スイッチを何かに切り替えます。そうしないと。
では、すべての数値やフィボナッチ数列などを停止せずにカウントする単純な C プログラムを作成するとします。またはさらに良い: while(1) ループ内でスピンするだけです。システム上の他のプロセスはどのようにして実行する機会を得ますか? 割り込みを発生させるようなことが何も起こらない場合はどうなりますか?
答えは、常に中断しているタイマー デバイスがあることです。そして、それは、回転プロセスがシステム全体をダウンさせないようにするものです. 割り込みハンドラーは割り込みを無効にすることに注意しますが、無期限にブロックするようなことをすると、システム全体をダウンさせることができます.
An exception is when the processor executes code that is not on its normal path. This is an 'exception' to normal operation, which is essentially linear movement through code and control structures. Different languages have support for various types of exceptions, typically used to handle errors during program operation.
An interrupt is an exception at the hardware level (generally). The interrupt is a physical signal in the processor that tells the CPU to store its current state and jump to interrupt (or exception) handler code. Once the handler is done the original state is restored and processing can continue.
An interrupt is always an exception, even when it's intended. Interrupts might indicate:
These always force the processor to pause its current activity to deal with the raised exception, only resuming once the interrupt handler is complete.
In terms of interrupts, common pitfalls are race conditions. For instance you might have an interrupt that periodically increments a global realtime clock. The clock might be 64 bits on a 32 bit machine.
If a program is reading the clock, and gets the first 32 bit word, then the interrupt occurs, once the interrupt handler exits the process gets the second 32 bit word, and the data will be incoherent - the two words may be out of sync. If you attempt to use a mutex or semaphore to lock the variable in the process, then the interrupt will hang waiting for the lock and halt the system (deadlock), unless both the handler and the processes that use the data are written very carefully. It's easy to get in trouble when writing for interrupts.
Re-entrant functions are also another problem. If you are executing funcA in program code, take an interrupt which also executes funcA you may end up with unintended consequences due to shared variables (static, or heap variables, classes, etc). You typically want to execute as little code as possible in the interrupt handler, and frequently have it set a flag so the process can do the real work later, without worrying about conflicts.
In some ways this is similar to developing for a multiprocessor, and is one of the reasons why kernel programming is still considered black magic by many.
-Adam
割り込みは定期的に発生することが予想されます (ただし、定期的ではない場合もあります)。何か重要なことが発生したばかりで、すぐに対処する必要があるため、CPUに割り込みます。
例外は、ルールの例外であると想定されています。これらは、予期しないことが起こったためにソフトウェアによってスローされます。これは、それについて何かを試みるチャンスです。または、少なくとも正常にクラッシュします。
割り込みと例外について話しているときは、通常、ハードウェアレベルのコードの近くで話しているので、割り込みと例外は、一部はハードウェアによって、一部はソフトウェアによって実装されることがよくあります。
割り込みは、IO完了、IOエラー(ディスクメモリ障害)、IOイベント(マウス移動)など、割り込みのイベントを処理するために使用できるハンドラーのベクトルに関連付けられたハードウェア内の(またはアセンブリで手動で発生する)イベントです。例えば)。予期しない割り込みが発生すると、割り込みによって例外が発生することがよくあります。
例外は予期しない動作です。ほとんどの場合、ハードウェアを使用する場合、これらは割り込みから発生し、割り込みハンドラーを使用してソフトウェアで個別に処理されます。私たちが見ているプログラミング言語は、ほとんどの場合、これをある種の制御構造として偽装しています。
一般に、割り込みは、ハードウェアで実装されたある種のトラップです。特定の割り込み(0による除算、周辺機器で利用可能なデータ、タイマーの期限切れ)のハンドラーを登録し、そのイベントが発生すると、システム全体のすべての処理が停止し、割り込みをすばやく処理して、処理を続行します。これらは通常、デバイスドライバーまたはカーネルに含まれています。
例外は、コードのエラーを処理するソフトウェア実装の方法です。特定の(または一般的な)例外のハンドラーを設定します。例外が発生すると、言語ランタイムは、特定のハンドラーのハンドラーに到達するまで、スタックの巻き戻しを開始します。その時点で、例外を処理して続行するか、プログラムを終了できます。
Iterruptsは基本的にハードウェア駆動型であり、プリンタが「用紙切れ」であることを示したり、ネットワークカードが接続を失ったことを示したりします。
例外は、try / catchブロックによって検出された、プログラムの単なるエラー状態です。好き:
Try
{
... various code steps that "throw exceptions" on error ...
}
catch (exception e)
{
print 'Crap! Something bad happened.' + e.toString()
}
これは、コードのブロックで発生する「エラー」をキャッチするための便利な方法であるため、同様の方法でそれらを処理できます。
物事をシンプルに保つ...
割り込みの処理が完了すると、(通常) 割り込みを受ける前に行っていたことに戻ります。
例外を処理するには、例外を処理 (キャッチ) できるポイントまでバブルアップするまで、現在作業中の一連のレイヤーを破棄する必要があります。
割り込みの処理中に例外をスローすることを決定する場合がありますが、それは割り込み自体を例外と見なす必要があるという意味ではありません。例外は「中断」しません (中断される直前に行っていたことに戻る可能性があるため)。むしろ、現在のアクティビティ (の一部のサブセット) を「中止」します。
そして、すでに何度か述べたように、割り込みは通常、ハードウェアやユーザー (マウス クリックや CTRL-C などのキーストロークなど) などの外部エンティティによってトリガーされますが、例外は、「問題」または「問題」を検出したソフトウェアによって同期的に生成 (スロー) されます。例外的な状態」。