1

クリティカル領域に入ろうとしているプロセスがあるが、他のプロセスによって占有されているため、現在のプロセスはそれを待機する必要があるとします。したがって、プロセスがセマフォの待機キューに追加されているときに、割り込みが発生した(バッテリーが終了した)とすると、そのプロセスと待機キューはどうなりますか?

バッテリーが終了したので、この割り込みが最優先され、プロセスを待機キューに置いていたプロセスのコンテキストが保存され、このルーティングの割り込みサービスルーチンが実行されると思います。

そして、プロセスをキューに入れていたプロセスに戻ります。

この質問に対するヒント/提案をいくつか教えてください。

4

2 に答える 2

1

これはハードウェア/OS に大きく依存しますが、いくつかの考えがあります。

コメントで述べたように、「バッテリー終了」割り込みは特別なケースと見なすことができます。これは、マシンが何のアクションも実行せずにオフになる可能性があるためです。その場合、プロセスとキューが消えます。ただし、一般的に、致命的ではない割り込みと、OS が正しくサスペンド/レジュームすることを前提とすると、どちらのプロセスの実行にも顕著な影響が及ぶ可能性は低いと思います。

マルチコア セットアップでは、プロセスがすぐに中断されない場合があります。割り込みは別のコアによって処理される可能性があり、言及したプロセスはどれも賢明ではありません。

プリエンプティブ マルチタスク OS では、キューに追加されたプロセスが割り込みの直後に再開されるという保証もありません。スケジューラは、現在クリティカル セクションにあるプロセスまたは別のプロセスを完全にアクティブ化することを決定できます。セマフォ待機キューに自分自身を追加するプロセスが再開されたときに何が起こるかは、追加がどれだけ進んだか、キューがどのように実装されたか、およびセマフォがどのような状態にあったかによって異なります。他のプロセスがすでにウェイクアップしてクリティカル セクションを離れたことを検出したため、またはキューへの追加が完了し、何も起こらなかったかのように一時停止した可能性があります…</p>

協調的なマルチタスク OS を備えた単一のコア/プロセッサ マシンでは、質問で説明したシナリオは、実行中のプロセスが割り込みを処理するために中断され、その後、キューへの追加が完了するまで再開される可能性が高いと思いますそして降伏した。

于 2012-05-25T08:47:21.887 に答える
0

実装にもよりますが、概念的には同じ操作プロセスが待機キューへのプロセスの追加と割り込みの管理の両方を実行する必要があるため、待機に移動されたプロセスは代わりに待機キューから中断されたものとして扱われます。

Java については、API を参照してください。Thread.interrupt()

このスレッドを中断します。

現在のスレッドがそれ自体を中断していない限り (これは常に許可されています)、このスレッドの checkAccess メソッドが呼び出され、SecurityException がスローされる可能性があります。

Object クラスの wait() 、 wait(long) 、または wait(long, int) メソッド、または join() 、 join(long) 、 join(long, int)の呼び出しでこのスレッドがブロックされている場合、sleep(long)、または sleep(long, int)、このクラスのメソッドを使用すると、その割り込みステータスがクリアされ、 InterruptedException を受け取ります

このスレッドが割り込み可能なチャネルでの I/O 操作でブロックされた場合、チャネルは閉じられ、スレッドの割り込みステータスが設定され、スレッドは ClosedByInterruptException を受け取ります。

このスレッドがセレクターでブロックされている場合、スレッドの割り込みステータスが設定され、セレクターのウェイクアップ メソッドが呼び出されたかのように、スレッドは選択操作からすぐに戻ります。おそらくゼロ以外の値になります。

前の条件のいずれも保持されない場合、このスレッドの割り込みステータスが設定されます。

生きていないスレッドを中断しても、何の効果もありません。

于 2012-05-24T21:40:32.653 に答える