以下のコードがどのように機能するかを理解しようとしています。これは、私の教授の講義スライドからそのまま引用したものです。この P() および V() 関数は、クラス (OS161) で使用する OS のセマフォ実装の一部です。OS161 は広く使用されているため、私の質問に答えるには OS161 を理解する必要があると思います。
講義ノートによるこのコードの理解:
X: P() 関数のフロー
1. スレッドが P() を呼び出すとき、割り込みを無効にします
2. sem->count で利用可能なリソースがあるかどうかを確認します
3.a) if count が 0 の場合、スリープに移行し
ます 3.b) count != 0 の場合、count をデクリメントし、呼び出しスレッドがクリティカル セクションに進むことを許可します
4. V() 関数の割り込み
Y:フローを有効にします
1. スレッドが V() を呼び出すとき、割り込みを無効にします
2. カウンターをインクリメントします。これは、取得できるリソースがもう 1 つあることを意味します
3. 次に、P( でスリープに送信したすべてのスレッドをウェイクアップします)、スレッドがクリティカル セクションへのロックを取得しようとした時点で十分なリソースが利用できなかったためです
。 4. 割り込みを有効にする
私の問題:
1. 「割り込みを無効にする」セクションは、特定のスレッドの割り込みを無効にしますか、それともすべての割り込みを無効にしますか?
2. V() 関数ですべてのスレッドをウェイクアップすると、スレッドは P() 関数の while ループ内でスリープし、while ループの実行を開始します。講義では、1 つのスレッドがロックを取得し、残りはスリープ状態に戻ると書かれています。私の質問は、「sem->count == 0」条件が他のスレッドに対して false と評価されず、1 つだけと評価される理由です。
割り込み無効部分がどのように機能するかを本当に知りたいです。これが私の最初の質問です。スレッドスケジューラを停止しますか?、システムのコンテキストスイッチを停止しますか?
スレッドが割り込みを無効にしてスリープ状態になるのはなぜですか? I/O 完了信号などを見逃す可能性があるので、危険ではないでしょうか。
P(sem) {
Disable interrupts;
while (sem->count == 0) {
thread_sleep(sem); /* current thread
will sleep on this sem */
}
sem->count--;
Enable interrupts;
}
V(sem) {
Disable interrupts;
sem->count++;
thread_wakeup (sem); /* this will wake
up all the threads waiting on this
sem. Why wake up all threads? */
Enable interrupts;
}
ありがとうございました。