カーネルがスピンロック方式を介してプロセスを同期できることを理解しています。しかし、プロセッサが 1 つになると、どのように処理するのでしょうか? 同期オブジェクトを使用して相互排除を保証する方法は?
セマフォはエグゼクティブのレベルですか?ここでカーネルはどのように機能しますか?
ミューテックスはカーネルのレベルでのみ実装されていますか? リソースが空いているときは、シグナルやメッセージを発しません。
カーネルがスピンロック方式を介してプロセスを同期できることを理解しています。しかし、プロセッサが 1 つになると、どのように処理するのでしょうか? 同期オブジェクトを使用して相互排除を保証する方法は?
セマフォはエグゼクティブのレベルですか?ここでカーネルはどのように機能しますか?
ミューテックスはカーネルのレベルでのみ実装されていますか? リソースが空いているときは、シグナルやメッセージを発しません。
ここにいくつか質問があります:
カーネルがスピンロック方式でプロセスを同期できることを理解しています。しかし、1つのプロセッサになると、どのようにそれを行うのでしょうか。相互排除を確実にするために同期オブジェクトをどのように使用しますか?
ユニプロセッサマシンでは、スピンロックを取得すると、IRQLが> DISPATCH_LEVELに引き上げられます。このような昇格されたIRQLのスレッドはプリエンプトできないため、同期が保証されます。
セマフォはエグゼクティブのレベルですか?ここでカーネルはどのように機能しますか?
セマフォ、ミューテックス(および、さらに言えば、最も待機可能なオブジェクト)は、カーネルディスパッチオブジェクトです。このようなオブジェクトはカーネルによって実装され、KERNEL32.DLL(CreateEvent / Mutex / Semaphoreなど)によってエクスポートされたさまざまな関数を介してユーザーモードアプリケーションで使用できるようになります。さらに、スレッドの待機をスケジュールし、同期オブジェクトを待機しているスレッドを起動することで、「カーネルが機能します」。
ミューテックスはカーネルのレベルでのみ実装されていますか?
Mutexオブジェクトは、実際にはカーネルディスパッチオブジェクト(KMUTEX)です。ミューテックスオブジェクトは、所有されていない場合に通知されます。スレッドがミューテックスを取得すると、その状態はシグナルなしになります。つまり、スレッドを取得しようとする他のスレッドは、ミューテックスが取得されるか、待機がタイムアウトするまで待機状態になります。
カーネルディスパッチャーオブジェクトの詳細な説明、および一般的なWindows同期については、最新バージョンの「Windows Internals」をご覧ください。すべてのWindows開発者は、このコピーを自分のデスクに持っている必要があります。IMHO。
「リソースが空いているときは、シグナルやメッセージを送信しません」 - 確かにそうです - それらはスレッド間シグナル伝達メカニズムです! 保護されたリソースが解放されると、ミューテックスを待機しているスレッドにシグナルが送信され、準備が整います。これにより、ミューテックスが取得されます。
スピンロックは通常、シングルコア プロセッサでは使用されません。意味がありません。TBH、スピンロックの使用が非生産的でない場合は、マルチコアおよびクラスター化されたシステムでも細心の注意が必要です。