24

私は割り込みを読んでいました。特別な割り込みマスクを介して、重要ではない割り込みを一時停止することができます。これは、割り込みマスキングと呼ばれます。私が知らないのは、いつ/なぜ一時的に割り込みを一時停止したい、または一時停止する必要があるのか​​ということです。おそらくセマフォ、またはマルチプロセッサ環境でのプログラミング?

4

4 に答える 4

40

OSは、独自の「世界をオーケストレーションしよう」コードを実行する準備をするときにそれを行います。

たとえば、ある時点でOSスレッドスケジューラが制御します。プロセッサレジスタと、スレッドを実行する前に実行する必要のあるその他すべてのことを準備して、そのプロセスとスレッドの環境を設定します。次に、そのスレッドを実行させる前に、スレッドがCPUに保持する予定の時間が経過した後に発生するタイマー割り込みを設定します。

その期間(クォンタム)が経過すると、割り込みが発生し、OSスケジューラが再び制御を取ります。次に何をする必要があるかを理解する必要があります。そのためには、実行するコードの副作用を元に戻す方法がわかるように、CPUレジスタの状態を保存する必要があります。状態の保存中に何らかの理由で別の割り込みが発生した場合(たとえば、非同期I / Oの完了など)、OSは、ワールドが有効な状態にない状態になります(実際には、状態を保存する必要があります)。アトミック操作)。

したがって、そのような状況に巻き込まれるのを避けるために、OSカーネルは、アトミックである必要があるそのような操作が実行されている間、割り込みを無効にします。必要な処理をすべて実行し、システムが再び既知の状態になった後、割り込みを再度有効にします。

于 2011-02-07T00:37:13.740 に答える
16

以前は、発生する可能性のある約10個の割り込みがあるARMボードでプログラムしていました。私が書いたそれぞれの特定のプログラムは、それらのうちの4つ以上に興味を持ったことはありませんでした。たとえば、ボードには2つのタイマーがありましたが、私のプログラムでは1つしか使用していませんでした。2番目のタイマーの割り込みをマスクします。そのタイマーをマスクしなかった場合は、タイマーが有効になっていて、割り込みを続けてコードの速度を低下させた可能性があります。

もう1つの例は、UART受信REGISTER完全割り込みを使用するため、UART受信BUFFER完全割り込みが発生する必要がないことです。

これにより、割り込みを無効にする理由についての洞察が得られることを願っています。

于 2011-02-07T00:38:10.127 に答える
16

すでに与えられた答えに加えて、それに優先する要素があります。必要な、またはできるだけ早く応答できるようにしたい割り込みと、あまり忙しくないときにだけ知りたい割り込みがあります。最も明白な例は、ネットワークからの新しいパケットを処理するのではなく、DVDライターの書き込みバッファーを補充することです(時間内にそうしないと、一部のハードウェアがDVDを誤って書き込むだけです)。前者の割り込みを受信したら後者の割り込みを無効にし、バッファがいっぱいになるまで無効のままにします。

実際には、かなりの数のCPUがハードウェアに直接組み込まれた割り込み優先度を持っています。割り込みが発生すると、無効化されたフラグがより少ない割り込みに設定され、多くの場合、その割り込みは、割り込みベクトルの読み取りと関連するアドレスへのジャンプと同時に行われます。割り込みの受信を指示すると、割り込みハンドラーが終了するまでその割り込みが暗黙的にマスクされ、ハードウェアの割り込みに対する制限が緩和されるという優れた副作用があります。たとえば、シグナルハイが割り込みをトリガーし、外部ハードウェアを離れて、誤って複数の割り込みをトリガーすることを心配せずに、ラインをハイに保持する期間を決定すると簡単に言うことができます。

多くの時代遅れのシステム(z80と6502を含む)では、割り込みのレベルはマスク可能とマスク不可能の2つしかない傾向があります。これは、割り込みを有効または無効にする言語の由来だと思います。ただし、元の68000までさかのぼると、8つのレベルの割り込みと、実際に有効にすることができる着信割り込みのレベルを決定するCPUの現在の優先度レベルがあります。

于 2011-02-07T00:52:08.237 に答える
2

CPUが現在「int3」ハンドラーにあり、そのときに「int2」が発生し、新しく発生した「int2」の優先度が「int3」に比べて低いと想像してください。この状況にどのように対処しますか?

方法は、「int3」を処理するときに、他の優先度の低いインタラプタをマスクすることです。つまり、「int2」はCPUに信号を送っていますが、CPUはそれによって中断されません。「int3」の処理が終了したら、「int3」から戻り、優先度の低いインタラプタのマスクを解除します。

私たちが戻った場所は次のとおりです。

  1. 別のプロセス(プリエンプティブシステム)
  2. 「int3」によって中断されたプロセス(非プリエンプティブシステムまたはプリエンプティブシステムの場合)
  3. 「int3」によって中断されるintハンドラー、たとえばint1のハンドラー。

ケース1と2の場合、優先度の低いインタラプタのマスクを解除し、「int2」がまだCPUに信号を送っているため、「こんにちは、すぐに処理できるものがあります」と、CPUが命令を実行しているときに再び割り込みが発生します。プロセスから、「int2」を処理する

ケース3で、「int2」の優先度が「int1」よりも高い場合、CPUは、「int1」のハンドラーからの命令を実行しているときに、「int2」を処理するために再度中断されます。

それ以外の場合、「int1」のハンドラーは割り込みなしで実行され(「int1」よりも低い優先度で割り込みをマスクしているため)、CPUは「int1」を処理してマスクを解除した後にプロセスに戻ります。その時、「int2」が処理されます。

于 2014-12-19T18:52:54.920 に答える