「Javaを使用したオペレーティングシステムの概念」を読んでいます。ブロッキングと同期の概念にかなり混乱していますが、それらの違いは何ですか?
コンテキストに応じて、ブロッキングは同期と同じ場合と同じでない場合があります。メソッド呼び出しについて話すとき、メソッドを呼び出すスレッドはメソッドが戻るまで先に進むことができないため、同期呼び出しはブロックしていると言うこともできます(これについては後で説明します)。この場合の反意語は非同期になります。
ロックの用語では、ロックの取得を待機しているスレッドが、ロックが使用可能になるまで(またはタイムアウトが経過するまで)一時停止モードになっている場合、ロックはブロックされていると言われます。この場合の反意語は非ブロッキングロックです。つまり、スレッドはロックを取得できなくてもすぐに戻ります。これは、スレッドをアクティブに保ちながらロックの状態をポーリングし続ける、いわゆるスピニングロックを実装するために使用できます。
そうは言っても、概念間の違いを推定することができます。同期とは、通常、スレッドが先に進む前に応答を待たなければならないアクティビティを意味します。ブロッキングとは、スレッドが待機状態になることを指します(通常、何らかのイベントが発生するまで実行がスケジュールされないことを意味します)。ここから、基になる実装に応じて、同期呼び出しにブロッキング動作が含まれる場合と含まれない場合があると結論付けることができます(つまり、非同期呼び出しで同期動作をシミュレートしていることを意味する回転している場合もあります)。
ブロッキング-何らかのイベントが完了するのを待つ場合、操作にはブロッキング動作があると言われます。例:ロックが利用できない場合、スレッドはロックが利用可能になるまでイベントで待機状態に入る可能性があります。このような操作はブロッキングと呼ばれます。
同期-同期呼び出しは、クライアントがサーバーからの応答を待ってから続行するhttpプロトコルの例で簡単に理解できます。同期呼び出しは、ブロッキングまたは非ブロッキングにすることができます。
非同期-メソッドは他のメソッドを非同期で呼び出すことができます。呼び出し後、次の命令を実行し続けることができます。呼び出されたメソッドが実行を完了すると、呼び出し元のメソッドに成功または失敗の応答/コールバックが送信されます。
ノンブロッキング-ノンブロッキング動作は、そのインスタンスで状態をチェックするようなものです。たとえば、ロックが利用できない場合、ブロック操作のように利用可能になるまで待機しません。また、非同期呼び出しのようなコールバックがないため、ロックの可用性を繰り返しチェックする必要があります。
概要:ブロッキングは常に同期しています。
同期呼び出しには、イベントが完了するのを待機する場合にブロッキング操作があり、呼び出し元のメソッドが待機状態になる場合があります。
同期呼び出しは、次の命令に進む前に発生するイベントを繰り返しチェックする場合、ノンブロッキングです。呼び出し元メソッドは、一部のイベントが完了するまで待機状態になりません。
非同期呼び出しはブロックできず、処理する必要のある呼び出されたメソッドからのコールバックが含まれます。
私はそれらを次のように分類します:
ブロッキング-スレッドは成功または失敗するまでアクションを待機します(「待機」を強調表示します。失敗は通常タイムアウトです)
同期-スレッドは、成功または失敗のいずれかによって、アクションを完了してから、その後の行に到達します(アクションの完了を強調表示します)
ノンブロッキング-スレッドはアクションの完了を待たず、すぐにアクションを実行します
非同期-別のスレッド(論理または物理)がアクションを完了するか、コールバックを使用して準備ができたことを通知し、次のコマンドを実行する前に待機しません。注:コマンドが実行される順序がわからないため、ここから非同期という名前が付けられています
同期とは、関数を呼び出すスレッドで作業が行われ、メソッドが終了するまでメソッドが戻らないことを意味します。
別のスレッドが作業を行い、作業が完了するとフラグを立てるかイベントを発生させるため、非同期メソッドはすぐに戻ります。
ブロッキングとは、ブロッキングイベントを実行しているスレッドが、イベントが発生するまで待機することを意味します。たとえば、ソケットから読み取ろうとしても、メッセージを送信するものはありません。メッセージがソケットから復活するまで、ブロッキング呼び出しは返されません。
よく、ノンブロッキングとは、ブロッキングとは逆のことを意味し、ノンブロッキング呼び出しが非同期であることを意味します。