私が理解している限り、同期とブロックは同じ概念です。クライアントはサーバーからの受信を待っています。サーバーが受信を返さない場合、クライアントは先に進みません。非同期/非ブロックとは、次のことを意味します。クライアントはサービスを待機しません。クライアントから受信確認を受け取ったら、そのまま下に進みます。サーバー側の処理が完了したら、非同期コールバック関数を呼び出してクライアントに通知します。
しかし、具体的には、同期とブロッキング、非同期と非ブロッキングの違いがわかりません。この混乱を説明できる人はいますか?
Linux の 5 つの IO モデルについて説明するブログ投稿をお勧めします。非常によく書かれています。これらを簡単にお話しましょう。
2 つの操作に分けることができます。まず第一に、いわゆるブロッキングとノンブロッキングがあるのは同期のみであり、非同期にはありません。よくある誤解は、非同期とはノンブロッキングを意味すると思われているということですが、そうではありません。ここでの同期と非同期の違いは、ネットワーク IO またはディスク IO の「プロセス全体」にブロックがあるかどうかがプロセス全体であるかどうかです。
読み取りシステム コールを例に挙げます。ユーザー スレッドとして読み取りシステム コールを開始すると、
1 つ目は、データ読み取り: ディスクからカーネル空間へのデータの読み取りです。読み取りはシステム コールであり、ユーザーレベルのスレッドはそれを操作できないことを知っています。これはカーネル スレッドにのみ渡されます。処理するには、カーネル スレッドが最初にデータを見つけてカーネル空間に読み込む必要があります。
2 つ目は データコピー: カーネル空間からユーザー空間にデータを読み取ることです。その後、ユーザー スレッドがこのデータを使用できるようになります。
簡単に言えば、
同期とは、上記の 2 つのプロセスがブロックされ、ユーザー スレッドが待機していることを意味します。
ノンブロッキングとは、上記の最初のプロセスではブロックされないことを意味しますが、ユーザースレッドはデータがディスクから内部空間にコピーされたかどうかを常にOSに問い合わせる必要があり、コピーが完了するとブロックされます。データのコピー処理中。したがって、これは非ブロッキング呼び出しですが、第 2 フェーズではすべての同期プロセスがブロックされます。
多重化: ノンブロッキングと同様に、第 2 段階でもブロッキングですが、第 1 段階では、オペレーティング システムに自分で要求することはなくなり、処理のためにカーネル スレッドに一律に渡されます (ポーリングは Linux に実装されています)。 、および epoll の改良版)、データの読み取りが完了すると、このスレッドは最初にシステム コールを開始したユーザー スレッドにシグナルを送信し、ユーザー スレッドはブロッキングに入り、データのコピーを開始します。
非同期: 上記の 2 つのプロセスはノンブロッキングです。
上記は簡単な説明です、お役に立てば幸いです
同期と非同期の概念は、主に IO の側面を説明します。つまり、同期と非同期の主な違いは、呼び出し元のプロセスまたはスレッドに通知する方法が同期であるのに対し、登録されたコールバックによる通知は非同期です。ブロッキングとノンブロッキングは主に関数呼び出しのリターン状況を表します。すぐに戻る関数は非ブロッキングであり、一時停止される関数はブロッキングです。
簡単に例えると、レストランに行って食べ物を注文するとします。
同期ブロッキング
注文の店員に「台湾牛肉麺が欲しい」と伝えると、注文の店員はそれを聞いて厨房に行き、少し時間をかけて持ってきてくれます。この間、あなたは何も応答せず、何もせずにフロントデスクで待っていました(ブロック) 注文した後、何も応答がありませんでした。待機するプロセスは同期通信です。
同期かつノンブロッキング
あなたは注文担当者に蘭州牛肉麺が欲しいと伝えましたが、注文担当者は5分かかりますと答えました。それから、5 分以内に投稿をチェックして、退屈を紛らわすために他のことをしてもいいのではないかと少し考えてみます。でも、すぐにお腹が空いてきて、「大丈夫か?」と毎分尋ねますが、返される答えは「まだ大丈夫ではない」で、5分後まで顔を合わせることはできません。待機中はアイドル状態になることはなく、他のことを行うことができます。これはノンブロッキングです。まだ積極的に結果を要求し、注文者の応答を待っているため、これは依然として同期です。
非同期ブロッキングと非ブロッキング
いわゆる非同期とは、結果を積極的に要求する必要はなく、コールバック関数を登録することを意味します。つまり、注文すると、注文担当者が番号を渡します。あなたの隣に機械があり、あなたの番が来たら、機械があなたの番号を呼び出します。通知のプロセスは非同期と呼ばれます。何もせずに座っていると、ブロックされた状態になります。横で Web ページを閲覧している場合は、ノンブロッキングです。
同期と非同期の違いは主に、メッセージの通知方法にあり、ブロックと非ブロックは、通知を待っている関数呼び出しのステータス、つまり、現在のスレッドまたはプロセスが中断されているかどうかにあります。 、そして他のことを続けられるかどうか。
通常、非同期ノンブロッキングを実現するコルーチン方法があります。つまり、関数呼び出しが IO に遭遇すると、コールバック関数を登録した後、中断して戻ります。これは非ブロッキングであるため、IO が完了すると、コールバック関数は中断された関数にウェイクアップするように通知します。は非同期です。
一般的に、ブロッキングと非ブロッキングは、IO 呼び出しがすぐに返されるか (非ブロッキング)、完了を待ってから返されるか (ブロッキング) を指します。同期と非同期は広範な概念であり、ブロッキングと非ブロッキングを表します。
実際、同期とは、データに不整合がなく、シングルスレッドが順番に実行されることを意味します。非同期とは、データが不均一であることを意味します。たとえば、複数のスレッドが存在する場合、このスレッドで使用されるデータが別のスレッドによって変更され、データの同期が失われる可能性があります。ブロッキングとノンブロッキングは、スレッドの実行中に関数が戻るのを待つかどうかを指します。マルチスレッドの場合は、下向きの実行を待ちません。時間が経つと、非同期が発生しやすくなります。