2016-05-27 13 views
1

Windowsで割り込みを無効にすることで、クリティカルセクションのロックが可能になりましたか?そうであれば、スレッドはクリティカルセクションの途中にある間に先取りすることはできません。クリティカルセクションの途中でスレッドを先取りすることはできますか?

しかし、重要なセクションを実行している間にスレッドを先取りすることができない場合は、パルス全体をのパルスにすることは、クリティカルセクションの途中であってもCPUを退避させるよう求めました。

だから、私の本当の問題(s)は、次のとおりです。

  1. どのモニターでは、Windowsに実装されていますか?

  2. クリティカルセクションの途中でスレッドを先取りすることはできますか?

答えて

6

Windowsは、カーネルモードで実行しているときでも、スレッドがare always preemptible and always interruptibleであるように設計されています。したがって、重要なセクションは、割り込みを無効にすることによって実現されるわけではなく、プリエンプションを防ぎません。

実際、ユーザーモードのスレッドが割り込みやプリエンプションをブロックする可能性がある場合、ユーザーモードプロセスがシステム全体を誤ってクラッシュさせることは些細なことです。したがって、あなたが提案している方法で現代のオペレーティングシステムは動作しません。

スレッドスケジューラによってプリミティブとして提供されるWindowsでは、monitors are usually implemented using condition variables,です。これはPOSIXにも当てはまります。

+0

本当にありがとう。確かに、あなたが言っていることはたくさんの意味があります。私が間違って仮定していたのは、*ロックの取得と解放中に、ユーザーコードがどのOS APIでも 'CreateThread'や' ThreadFork'を実行したときと同じように、プロシージャはカーネルモードに入ります。スレッドはユーザーモードで実行されますが、*スレッドルート*にアクセスして、スタックからスタックにコピーしなければなりません。 –

+0

しかし、ロックを取得して解放するためにカーネルに入ったとしても、ロックを解除することを忘れたり、クリティカルセクションの実行中に発生する例外を忘れる可能性が排除されない可能性があります。あなたが指摘しているように、システム全体の安全を危うくする。 –

+0

あなたがリンクしているドキュメントを読んでいますが、次の質問について私の好奇心をすばやく満たしてくれますか? Windowsでのロックの取得はユーザーモードで実行されていますか? –

2

thisによると、クリティカルセクションブロックは割り込みをディスエーブルしません。クリティカルセクションとミューテックスの唯一の違いは、クリティカルセクションが同じプロセスのコンテキスト内でのみ有効であることです。したがって、それらを使用して異なるプロセスを同期させることはできません。他のスレッドは実行を継続することができ、割り込みは無効にされません。他のスレッドは、最初のスレッドがまだそれを使用しているときに同じクリティカルセクションに入る場合にのみブロックされます。

また、ほとんどのCPUが現在複数のコアであるため、割り込みが無効になっていても、他のスレッドは最新のハードウェア上で実行できます。最近、シングルコアCPUを見つけるのは本当に難しいです。複数のコアを使用すると、複数のスレッドを互いに先取りすることなく並列に実行できます。

+0

本当にありがとうございます。あなたは、マルチコアCPUの面で割り込みが無効になっているという興味深い観察をしています。 –

関連する問題