非同期と同期の意味[非公開]


46

コンピューターサイエンスの非同期同期という言葉の意味は何ですか?

単語の意味をグーグルで検索すると、次のものが得られます。

しかし、プログラミングやコンピューターサイエンスで反対の意味を伝えるために使用されているようです。

HTML非同期属性は、HTMLがまだ解析中またはダウンロード中であっても、ダウンロードされるとすぐにスクリプトが実行されることを意味します。つまり、スクリプトとHTMLの両方のプロセスが存在し、同時に発生します。

これらの用語は、コンピューターサイエンスで反対の意味を伝えるために使用されていますか、それとも私がポイントを逃していますか?


47
わかりやすいと思います。コードがどのように機能するか理解できず、バグを探しているときにバグが突然消えた場合、コードはおそらく非同期です。:)
エリックドゥミニル

4
悲しい真実は、プログラミングの分野では、時間の経過とともに、これらの言葉が本来の意味の逆を意味するようになったことです。現在の意味には歴史的な理由があるかもしれませんが、正当な理由はありません。
ソロモノフの秘密

3
と同時に、キーです:)
モニカとの軽さのレース

5
実際の操作、関数が呼び出されると同時に(必然的に)発生するのではなく、関数が呼び出されると同時に動作発生するのです...私には逆に思えませんか?関数を非同期と記述した場合、それが何であれ、それを呼び出すと同時に発生することが保証されていないと言います。
Affe

2
「シーケンシャル」と「ノンシーケンシャル」は意味的にはより良い選択であったかもしれませんが、その船にはすでに方法があります。
ジャレッドスミス

回答:


47

見つけた定義に直接関係する答えをお伝えしたいと思います。1つのタスクT1が2番目のタスクT2を開始すると、次のようになります。

同期:既存または同時に発生します。

したがって、T2はT1のタイムスライス内で開始および実行されることが保証されています。T1はT2の終了を「待機」し、その後処理を続行できます。この意味で、T1とT2は「同時に」発生します(「並列」ではなく、連続した時間間隔で)。

非同期:存在しないか、同時に発生していません。

したがって、T2の実行時間はT1とは無関係です。並行して実行される場合があり、1秒、1分、または数時間後に発生する場合があり、T1が終了した後もT2が実行される場合があります(T2の結果を処理するには、新しいタスクT3が必要になる場合があります)。この意味で、T1とT2は「同時に発生しません(間隔)」。

もちろん、最近の非同期操作がパラレル実行の作成によく使用されることを見ると、リテラル定義があいまいに見えるように思えます。


4
間違っていると思うので、これには非常に多くの賛成票があります。同期メソッドは、2番目のメソッドが最初の(ブロック)メソッドの完了を待機する必要があるため、次々に実行されます。これらの2つのメソッドは明らかに同時に実行されていません
ロバートハーベイ

6
いいえ、そうしなかったと思います。同期と同時性は同じものではありません。
ロバートハーベイ

1
辞書の定義はソフトウェア開発者にはあまり役に立たないと断言できます。辞書の定義を、使用する技術用語にマッピングしようとすることは、おそらく役に立たないでしょう。
ロバートハーベイ

1
いずれにせよ、あなたの編集は物事を改善しますが、「既存のまたは同時に発生する」という言葉はあなたの説明を混乱させます。同期メソッドは「同時に」実行されません。それらは順序付けられたシーケンスで実行され、それが同期をとるものです。
ロバートハーベイ

1
@RobertHarvey適切なパースペクティブを使用すれば、辞書の定義は完璧に機能します。あなたはすべて、実行の時間に夢中です。命令には、実行時以外の有効期間があります。順次命令は、リボルバーの弾丸が同期して移動するのと同じ方法で同期的に移動します。同様に、命令は命令パイプラインを介して同期的に移動できます。実行パースペクティブでの取り過ぎを止めます。命令が実行される前に、多くのがらくたが発生します。
candied_orange

20

私はそれを理解する最良の方法が次のようであると思います:

  • 同期:いつ発生するかがわかります(この他のコードが終了すると発生します)。
  • 非同期:いつ発生するかわかりません。

注:特定の時刻にコードを実行するようにスケジュールすることはできますが、実際には、システムが何か他のことをしているためにシステムクロックの混乱を無視しても遅延するため、いつ発生するかわかりません。また、特定の時刻に正確に発生するという保証があったとしても、その時点でプログラムの実行がどこにあるかはわかりません。そのため、時刻にスケジュールされたコードは同期していません。


ソフトウェア開発では、たとえば、タスクは分離されたタスクに関する何かとして非同期であると言うことに注意してください。ただし、同時に発生するという点で定義する場合、またはタスクを比較するために少なくとも何か他のものが必要です。

多くのプラットフォームは、並列処理とタスク切り替えの両方を実行できます。一部の並列処理は制限され、一部のプラットフォームは並列処理をまったく実行できず、タスク切り替えのみに依存しています。 ...非同期タスクはこれらすべての抽象化であり、開発者が(あまりにも)心配することなく、システムが特定のプラットフォームのタスクを実行する方法を決定できるようにします。

また、外部入力を非同期タスクとして取得することを概念化でき、通常は抽象化できることも注目に値します。たとえば、ユーザー入力からテキストを取得します。ユーザーがいつ入力するかはわかりません。これは、永続ストレージからの読み取り、ネットワークまたは他の外部システムを介したデータの取得にも適用されます。


ところで、基本的に非同期であるものもありますが、通常はそうではないふりをすることができます。それを行うには、ソフトウェアが現在の実行をブロックし、それが完了するまで何もしません。つまり、非同期のものを取り、同期APIでラップすることができます。

非同期APIを使用すると、要求された操作が完了していないにもかかわらず実行を継続できますが、同期操作は完了していません。そしてそこから、ソフトウェアで非同期のアイデアが得られます-同時に発生することを意味します(同時)。

非同期は同時実行を意味しないことに注意してください。場合によっては、プラットフォームは現在のタスクが完了した後にのみ非同期タスクを実行できます。それはシーケンシャル(非同期タスクの実行順序が必ずしも保証されるわけではありませんが)、同時ではなく(実行期間に重複がない)、非同期になります。

ところで、一部のプラットフォームでは、システムは非同期タスクをインライン化することを決定できるため、同期操作としてそこですぐに実行できます(すべてのタスクで実行可能でない場合)。

繰り返しますが、非同期とは、いつ発生するかわからないことを意味します。


また、「同時」実行と「並列」実行の違いに興味があるかもしれません。


まさに。OPで見つかった説明は、同期性よりも並列性の方がはるかに聞こえます(それが単語の場合は...)。asynch vs synchはアクションの開始時(私が呼び出したとき、またはスケジューラが決定した後)であり、パラレルは「はい、同時に発生している」対シーケンシャルを意味します。
ジャコモアルゼッタ

1
@GiacomoAlzetta言葉は同期だと思う。また、これらの類似の単語を見つけました:同期、同期、同期。おそらく独自の質問に値する。
Theraot

12

非同期:存在しないか、同時に発生していません。

同期:既存または同時に発生します。

async属性は、htmlがまだ解析中であっても、ダウンロードされるとすぐにスクリプトが実行されることを意味します。つまり、私には両方のプロセスが同時に存在します。

これは確かに混乱しています!

代わりにsynchronizedunsynchronizedの意味を考慮してください。一方のタイミングが他方に依存する場合、2つのことは同期され、タイミングが関連していない場合は非同期になります。

非同期ワークフローの例では、スクリプトの実行とHTML解析の2つのことが発生します。これら2つのことは同期されていません。実行操作のタイミングと解析操作のタイミングは互いに依存しません。ワークフローを同期化すると、操作は同期化されます。解析が確実に終了するまで、実行は開始されません。

ただし、実際には3つの可能性があることを理解することが重要です。

  • 実行と解析は完全に非同期です。最も効率的なものであれば、いつでも、どの順序でも発生します。
  • 実行と解析は同期されます。たとえば、I / Oが完了するのを待っている間、CPUは何もしませ
  • 実行と解析は同期されますが、I / Oが完了するのを待っている間、CPUは他の作業を実行でき、ダウンロードが完了した後に戻って解析を実行できます

それを理解すると、一般的なプログラミング言語での非同期ワークフローの目的がより明確になります。

  • 非同期ワークフローは、関連性のないものを時間内に順序付けすることに制約されないため、高遅延操作を効率的に実装するのに役立ちます。解析が高遅延でI / Oに制限され、スクリプトの実行が高遅延でCPUに制限されている場合、これらの操作を完全または部分的に非同期化することで成功することができます。

  • awaitC#などの言語の演算子は、非同期ワークフローの順序付け操作です。awaitは非同期の待機です。それは我々が非同期ワークフローの2つの部分の間の順序関係を表現し、そこにいると言う点であるのawait前のコードとのawait後のコードとの関係「の前に起こります」。 これは、3番目のオプションを実装する方法です。

それがあまりにも抽象的である場合、いくつかの実世界の例を考えてください。レターを送信する場合-待ち時間の長いI / Oバウンド操作-手紙への返信を待っている間に、CPUを集中的に使用する作業、たとえば数学の宿題を行うことができます。数学の宿題をする操作とメールを読む操作は同期されていません。

しかし、今あなたが手紙を送り、返事にあなたの税金をするのに必要な番号が含まれていると仮定します。I / O操作が完了するまで、CPUの作業(税金の計算)を実行できません。でも、待っている間は芝生を刈ることができます。それは、その部分間のタイミング関係を表現した非同期ワークフローです。


6

私は電気技師で、論理回路(論理ゲート)で同期対非同期を扱いました。

2つの入力と1つの出力を持つANDゲート(または任意のゲート)があるとします。

非同期の場合、入力が変更されると出力が変更されるように、出力が更新されます。これがあなたの例の仕組みです-あなたが言及したプログラムです。

ただし、そのゲートにもクロック(たとえば、1秒周期の方形波)が接続されており、1秒ごとに更新され、方形波がLowからHighになると同期します。クロックの周波数にバインドされています。したがって、同期的です。そのクロックを多くの回路に配線することができ、それらは互いに同期して動作します。プログラムが毎秒実行するために読み取られたかどうかのみをチェックした場合、プログラムも同期されます。


1
非同期/同期シリアルポートと同様。
ジウォペン

2

地球を周回する2つの衛星を想像してください。

  • 衛星Aには地球の周りの回転周期があるため、惑星が1回転するたびに、衛星は1回よりも多くまたは少なく地球を回っています。
  • 衛星Bには地球の周りを回転する周期があるため、惑星が1回転するたびに、衛星は地球を1回だけ周回します。

上記の例の衛星Bは、

地球の自転の周期と同期した自転周期を持っています。

衛星Aが地球と「存在するか、または同時に発生する」という理由だけで、衛星Aが静止していると主張することはありません。実際、衛星B自体も関連するものではありません。関連するのは、地球の回転周期に同期した回転周期です。オブジェクトが同時に存在するということではありません。オブジェクト間の関係についてです。この考えを保持します。

システム上の2つのスレッドが同時に実行されていると仮定します。スレッドA(TA)はプロセスAのデータをフェッチしており、スレッドB(TB)はプロセスBのデータをフェッチしています。「TAとTBは非同期ですか?」あなたの応答は、「どのように知ることができますか?それぞれのプロセスでそれらを呼び出したコードを見なければなりません。」「しかし、TAとTBは確実に同時に実行されていると言っています」

そして、あなたは、非常に賢い個人的に、ここでも「、応答する-彼らが実行している場合があり、同時に彼らが実行されている場合、私は見当もつかない非同期。それらを呼び出し、それぞれのプロセスに関してTAとTBと非同期に実行されている互いに本当に作ります彼らは同じプロセスから生まれたわけではないので意味がありません。」

そのため、ここまでで、これらの2つのスレッド自体の存在だけでなく、関係の存在がここで関連するものであるという直感を得る必要があります。メソッドが非同期に実行されると、私たちが言っていることは、そのメソッドの実行が「ないことですしないで、それを呼び出したメソッドの実行と同時に存在または発生する必要があります」。次の例をご覧ください。

func Invoker() {
    DoThis();
    DoThatAsync();

    var foo = CheckThis();
    ... do some work ...
    CheckThat(foo);

    await DoThatAsync();

    CheckThat();
}

以前の衛星の議論から、「それはオブジェクトの同時存在に関するものではなく、オブジェクト間の関係に関するものです。」呼び出しメソッドと呼び出されたメソッドの存在に関するものではありません。呼び出し側の実行と呼び出された側の実行との関係の存在についてです。システムスレッドを調べて、DoThatAsync()呼び出されたが実行されていないことがわかった場合、スケジューラまたは他のI / Oで待機してInvoker()いる可能性があります。これは、必ずしも呼び出しメソッドが実行されていないことを意味しません。やっている。確かに、それはawaiting の時点にあるかもしれDoThatAsync()ませんが、それは保証されていません。他の関数が呼び出されると、これは当てはまりません-停止した場合、Invoker()停止-何があっても。これは保証されています。Invoker()と呼び出された同期メソッド間の実行は、「同時に存在するか、同時に発生します」。


私は実際にこれが好きです。一般に、「非同期」としての任意の実行のワイルドウェストと「同期」として定義された明確な実行パス
ランチャー

また、これが最良の答えだと思います。
バーマー

2

具体例

実世界の例をいくつか追加し、それらをソフトウェアエンジニアリングの世界に結び付けたいと思います。最初に、「同期」の直感的な定義と一致することを願っています:状況によっては、ホタル点滅。次に、4x100の女子オリンピックリレーレースを検討します。第三に、軍事映画からの古い縄張りを考えてみましょう。

では、何が起こっているのか考えてみましょう。これらすべてがプロセスまたは時間的に拡張されたエンティティであることを観察することから始めましょう。ボウルが「同期」であり、ロックが「非同期」であると言うのは意味がありません。第二に、タンゴには2つかかります。「ランナーは同期している」とは言えません。何と同期しますか?最後に、2つのプロセスが同時に何かを行うためには、それらがすでにまったく同じ周波数と位相を持っている場合を除き、一方または両方が待機する必要があります。

分析

辞書の定義で、同期する2つのエンティティが「同時に発生または存在する」と書かれている場合、ホタルの光の概念と非常にうまく調和しています。残念ながら、ライトが「同期している」と言うことは、ホタルの照明プロセスが同期していることを言うのがずさんな方法です。

では、Apple SmartWatchとNTPを備えていないホタルの群れが、どうやって後端を同時にフラッシュできるのでしょうか。一貫性のあるテンポを設定する手段があり、それを少し調整することができれば、非常に簡単です。彼らはただ点滅し、彼らのすぐ後にもっと多くの人々が点滅すると、彼らは遅くなります(遅延を増加させます)。そのため、単純なフィードバックプロセスを使用して、本質的に同じテンポとフェーズに到達できます。ここで重要な所見は、それらが適切な瞬間が点滅するのを待つことによって同期を達成することに注意することです。

4x100レースは、両方の形式のプロセスタイミングが動作しているので興味深いものです。チームのランナーは同期され、異なるチームのランナーは「非同期」です。リレーの2人目のランナーは、最初のランナーが転送ゾーンに入るまで待たなければなりません。ハンドオフは、これら2人のランナー間の同期イベントです。ただし、異なるレーンのランナーは、別のレーン何が起こっているかを気にしません。そして、確実にスローダウンしてハンドオフを同期しないでください。ランナーの各レーンは、互いに非同期です。繰り返しますが、同期には待機が必要ですが、非同期には必要ありません。

最後に、会社の兵士(小隊、消防隊など)は、敵を同時に攻撃できるように時計を同期する必要があります。一部の兵士は他の兵士より先に自分の位置に到着するか、敵により早く攻撃する機会があるかもしれません。しかし、驚きの要素があるため、同時攻撃は一般的に無計画な攻撃よりも効果的です。そのため、同期を達成するために、兵士の多くは行動するために指定された時間を待たなければなりません。

機能の定義

なぜこれを待つことに重点を置いているのですか?それは、待機が同期プロセスと非同期プロセスを区別する定義機能であるためです。知らない2つのプロセスがある場合、デフォルトでは、それらが非同期であると想定する必要があります。たとえば、荷物の配達と救急車の運転はほとんど同期されていません。2つのプロセスが実際に同期されていることを実証するには、非常に特別な瞬間、つまり同期ポイントを見つける必要があります。

荷物を降ろす配達ドライバーと病院に急行する救急車は、通常、「同期ポイント」として特定した時点を共有しません。一方、一斉に点滅するホタルは、点滅するたびに同期点を持ち、リレーランナーはバトンを渡すたびに同期点を持ち、兵士は攻撃を開始するときに同期点を持ちます。1つ以上の同期点を識別できる場合、プロセスは同期化されています。「syn-」は「with」または「together」を意味するギリシャ語のプレフィックスであり、「chrono」は「time」のギリシャ語のルートであるため、これは理解しやすいはずです。「同期」とは、文字通り「同時に」を意味します。

境界線

「同期」は、いずれかまたは両方のプロセスのライフタイム全体に必ずしも適用されるわけではないことに注意してください。私は「同期ポイントまでの待ち時間」にのみ適用されると主張します。したがって、2つのプロセスは、通信が必要な状態に達するまで非同期に動作し、同期され、情報を交換し、その後非同期で続行します。簡単な例は、コーヒーのために誰かに会うことです。明らかに、会議は同期ポイント(またはむしろ多く)であり、2人がそのポイントに到着するという事実は同期を示しています。しかし、私たちは二人がコーヒーのために会ったので、それらの二人の生涯とは言いません「同期」されています。それは彼らが出会った彼らの人生で唯一の瞬間だったかもしれません、そして彼らがする他のすべてはそれ以外は独立しています。

また、偶発的な会合が同期を示すということでもありません。2人の見知らぬ人が通りを通り過ぎた場合、ある時点で特定の場所にいるという事実は同期性を証明しません。また、バスを待っているベンチに一人が座っていて、別の人がたまたま通りかかっているという事実もありません。プロセスは、目的に合った場合にのみ同期します。

ソフトウェア接続

次に、ソフトウェアの非常に基本的なタスク、つまりファイルからの読み取りについて考えてみましょう。おそらくご存知のように、大容量記憶装置は通常、キャッシュまたはメインメモリよりも数千から数百倍遅いです。このため、オペレーティングシステムとプログラミング言語ライブラリは通常、同期および非同期の両方のI / O操作を提供します。ここで、プログラムに単一のスレッドしかない場合でも、この議論の目的上、OSは「別個のプロセス」であると考える必要があります。

同期する

「同期I / O読み取り」を行う場合、スレッドはデータが利用可能になるまで待機する必要があり、その時点でスレッドは継続します。これは、リレーランナーがバトンを次のランナーに渡すのとよく似ていますが、代わりに2人のランナーだけがトラックを一周し、2番目のランナーも最初に戻るリレーを想像してください。

この場合、プログラムスレッドとOS I / Oプロセスは「同時に発生(動作)」していないため、これらのプロセスが「同期」していると言うのは奇妙に思えます。しかし、それはそれを見る間違った方法です!「リレーチームのランナーは同時に走っていないので、同期されていません」と言っているようなものです。実際、両方のステートメントが間違っています!リレーチームのランナーが行うしなければならないだけに非常に特定の瞬間に、同時に実行:手をオフバトンを。実際、リレーチームが最初から同期されていることを確信させるのは、レース中のこの特別な瞬間だけです!I / O要求と応答を「バトン」と見なすと、

一方、スーパーコンピューターでの有限要素解析などを考えると、大規模なグローバル状態を更新するには数千のプロセスがロックステップで動作する必要があることがわかります。一部のノードが他のノードより先に特定のタイムステップで作業を完了した場合でも、結果は空間を介して近隣に伝播するため、すべてのノードがタイムステップの完了を待つ必要があります。この種の同期はホタルのようなものです。すべてのアクターは同じ種類のタスクを実行しています。

プロセスの多様性

このため、「同種の同期」、「異種の同期」、および「順次の同期」という3種類のことが起こっていることを確認するのに役立つ用語をいくつか作成できます。したがって、アクターが同じタスク(FEA、ホタル)を同時に実行している場合、アクターは「均質」です。異なるタスクを同時に実行している場合(実行中の兵士対目的地へのクロール対水泳、ゲーム内の物理対音声、AIスレッド)、それらは「異種」です。一度に1つずつタスクを実行している場合、それらは「シーケンシャル」(リレーランナー、I / Oのブロック)です。外見は非常に異なりますが、1つの重要な特性を共有しています。すべてのタイプのアクターは、全員が同時に同期ポイントに到着することを保証するためにいくつかの待機を実行します。 同期ポイント間、または「同じアクションを実行する」ことは、同期性の特性とは無関係です。

GPUのレンダーパイプラインは、すべてがフレームを一緒に終了し、一緒に新しいフレームを開始する必要があるため、同期的です。彼らは同じ種類の仕事をしていて、すべて一緒に活動しているので、彼らは同質です。しかし、サーバーのメインゲームループと、リモート入力を処理するブロッキングI / Oスレッドは、非常に異なる種類の作業を行うため異種です。接続が使用されます。それでも、アトミックに状態を共有する必要があるため、それらは同期されます(プレーヤーは部分的なゲームワールドの更新を見たり、サーバーがプレーヤー入力の断片だけを見たりしてはなりません)。

非同期

ここで、「非同期I / O読み取り」を考えてみましょう。プログラムがストレージにデータのビットを読み込む要求をOSに送信すると、呼び出しはすぐに戻ります。コールバックを無視して、ポーリングに集中しましょう。一般に、プログラムがデータを利用できる瞬間は、プログラムのスレッドに関する限り、特別な時点には対応していません。プログラムがデータを明示的に待機していない場合、スレッドはその瞬間がいつ発生したかを正確に知りません。次回のチェック時にデータが待機していることを検出するだけです。

OSとプログラムスレッドがデータの引き渡しに同意する特別な会議時間はありません。彼らは夜に通過する2隻の船のようです。非同期性は、この待機の欠如によって特徴付けられます。もちろん、プログラムスレッドは結局、I / O操作を待つことになることがよくありますが、そうする必要はありません。I / Oフェッチの実行中に他の計算を喜んで実行し、後で余裕があるときにのみチェックできます。もちろん、OSがデータのフェッチを完了すると、待機することもありません。データをどこか便利な場所に置き、そのビジネスについて続けます。この場合、プログラムはバトンをOSに渡し、OSは後で出てきて、データと共にバトンを地面に落とし、トラックから歩き去ります。プログラムは、ハンドオフの受信を待機している場合と待機していない場合があります。

平行度

ソフトウェアで関数を「非同期」としてマークすると、多くの場合、並列処理が必要になります。ただし、並列処理は同期を意味するものではないことに注意してください。ホタルは、同期と非同期の両方の動作を示したため、良い例です。ハエの大部分は一斉に点滅しましたが、多くのハエは明らかにグループの残りの部分と同調しておらず、よりランダムに点滅していました。ハエは同時に行動していたかもしれませんが、それらはすべて同期していませんでした

あるコードを「非同期」としてマークすると、おかしなように見えます。これは、そのようにマークされていない残りのコードが「同期」であることを意味するためです。それは一体何の意味ですか?「同期」にはタンゴに2つ必要だと主張しませんでしたか?しかし、単一のスレッドで実行されるコードについて話している場合はどうでしょうか?この場合、一歩下がって、プログラムを状態のシーケンスおよびそれらの状態間の遷移として考える必要があります。プログラム内のステートメントは、状態遷移を引き起こします。ステートメントで開始および停止する「マイクロプロセス」と考えることができます。言語によって定義されたシーケンスポイントは、実際、これらの「マイクロプロセス」の同期ポイントです。したがって、シングルスレッドを表示できます。

プログラミング言語の整合性により、ステートの更新がステートメント間で干渉しないことが保証され、シーケンスポイントは、コンパイラが観察可能な最適化を行うことを許可されない境界を定義します。たとえば、ステートメント内の式の評価の順序は未定義または指定不足である場合があり、コンパイラーはさまざまな方法でステートメントを最適化できます。しかし、次のステートメントが始まるまでに、PL自体が正常であれば、プログラムは明確に定義された状態になっているはずです。

今では、「非同期」の意味が明確になっているはずです。これは、コードブロック内の暗黙の同期コントラクトが非同期ブロックに対して免除されることを正確に意味します。通常、順次(一貫性のある、同期の)計算モデルによって暗示される安全性の保証なしに、プログラムの状態を個別に更新することができます。もちろん、これは、一貫性のない状態でプログラムの状態を破壊しないように特別な注意を払う必要があることを意味します。これは通常、非同期ブロックと調整するために、限定された明示的な同期を導入することを意味します。これは、非同期ブロックが異なる時点で非同期同期の両方になり得ることを意味することに注意してください!しかし、同期は単に同期点の存在を示しているにすぎないことを思い出してください。この概念を受け入れるのに問題はないはずです。


リレーレース(同期と非同期のソフトウェア概念を明確に示し、他の概念はそうではない)を除くすべての例をここから削除でき、答えは大幅に改善されます。
ロバートハーベイ

他の例は同時アクションと異種アクションを示していると思うので、OPの混乱の多くを引き起こしたと思います。
芝刈り機マン

1

それについて考える1つの方法は、AVXのようなSIMD命令です。以下に、それらの使用方法のを示します。

同期SIMD命令を使用すると、複数のデータで単一の命令を操作することにより、同じスレッドで複数の計算を正確に同時に実行できます。

非同期マルチスレッドを使用すると、「おそらく」「ある程度」「類似した」時間に複数の計算を実行できます。

これを次の定義と組み合わせます。

同期形容詞のシンクロノス| \ ˈsiŋ-krə-nəs、ˈsin-

1:まったく同時に起こる、存在する、または生じる[強調鉱山]

非同期形容詞asyn··chro··nous | \(ˌ)ā-ˈsiŋ-krə-nəs、-ˈsin- \

1:[...]:同期ではありません


1

SyncとAsyncとMulti-threadedの違いを理解させたアナロジーは、キッチンの料理人のそれです。

パスタを作っていると想像してください。次の3つのステップがあります。

  1. パスタをoilでて水気を切る
  2. ソースを準備する
  3. パスタとソースを組み合わせる

同期メソッド。同期シナリオでは、すべての作業を順番に実行する人(スレッド)は1人だけです。最初にパスタをoilで、そこに立つと沸騰します。それからそれを排出し、脇に置きます。次にソースを準備します。ソースの準備ができたら、パスタを取り、ソースと混ぜて料理を準備します。ここでの問題は、効率が悪いことです。あなたは同期的に連続して作業していたため、パスタが沸騰している間はソースに取り組むことができませんでした。だから、時間を無駄にし、ソースが準備されている間にパスタが冷たくなった。

非同期メソッド。このシナリオでは、料理人(スレッド)は1人だけですが、パスタが沸騰している間に、ソースを作ります。パスタがoilでられたらcalled-back、ソースを作って水気を切ってから、called-backもう一度ソースを仕上げます。時間を節約でき、パスタはソースをそれほど長く待つ必要がなかったため、これは今ではより効率的です。

マルチスレッド方式。今、あなたが新しい料理人を雇ったと想像してください。これで2つのクック(スレッド)ができました。1人の料理人がパスタをやっている間、2人目の料理人はソースを作っています。このシナリオでは必要ですか?いいえ、パスタの作成は非同期メソッドで効率的であるために十分に単純であるためです。そして、複数の料理人を管理することは追加のオーバーヘッドです。しかし、より複雑な料理や一度に複数の料理を作る場合は、複数の料理人が役立ちます。


これは実際にはかなり良い例えです。
ロバートハーベイ

0

良い質問と、混乱を招くさまざまな方法でよく使用される用語。

私の答えは、これらの用語は相対的であるということです。そして、それらが関係しているのは、実行中の(またはスレッドに対して)メインプログラムです。

これらの用語は、メッセージがブロック方式(同期)または非ブロック方式(非同期)で送信または受信されるかどうかについて、プログラムの内部操作とタイミングに関する何かを指定します。(メイン)スレッドが送信または受信によってブロックされている場合、それは「同期」であり、何らかの理由で割り込みが可能な場合は「非同期」です。繰り返しますが、これらの用語は、イベントを処理するだけでなく(通常の)動作も行う実装に関するものです。

(もちろん、IMHO)メッセージが送信されると、同期と非同期のようなものはありません。メッセージングでは、送信者と受信者が存在し、それぞれが互いに独立した同期または非同期の実装を行うことができますが、いったんメッセージが送信されると、それは単なるメッセージになり、もはや同期または非同期ではなくなります。メッセージをリクエストまたはリプライまたは一方向メッセージとして分類することもできますが、それは同期と非同期に直交します(実装が待機をブロックしているか、何らかの方法で中断できるかどうかを示します)。


ノンブロッキングは非同期とは異なります
user207421

1
@ user207421を詳しく説明してください。この文脈では同義語と呼ばれるためです
Jacob Raihle

0

「同期」とは、2つのイベントが同時に発生することを意味しますが、どのイベントですか?

「同期実行」とは、呼び出し元と呼び出し先が同時に実行されている(スタック上で)ことを意味します。それはおそらくあなたが望んでいる意味です。

「同期論理ゲート」と言うとき、論理ゲートがCPUクロックと同期していることを意味します。

分散システムのコンテキストで「同期モデル」と言う場合、すべてのノードがロックステップでプログラムを実行し、ステップnで送信されたメッセージはステップn + 1の開始時に到着することが保証されます。

Java言語仕様で、スレッドが別のスレッドと「同期する」と書かれている場合、異なるスレッドのアクションが「同時に」発生することを意味します(関係の前に発生することに関して)。そして、2つのスレッドが「オブジェクトへのアクセスを同期する」と言うとき、実際には、スレッドが互いに同期して、同時にオブジェクトで動作しないことを保証することを意味します。

...そして、「同時に起こること」は非常に一般的なアイデアであるため、さらに多くのコンテキストで単語を適用できると確信しています:-)


0

あなたの混乱の鍵は次のように要約できると思います:

async属性は、htmlがまだ解析中であっても、スクリプトがダウンロードされるとすぐに実行されることを意味します

理解すべきことは、この文は不可能な状況を説明しているため、この文は意味をなさないということです。HTMLがまだ解析中の場合、スクリプトダウンロードプロセスは非同期の場合でも開始されません

プログラミングでは、同期とは以下を意味します。

関心のあるすべてのデータは、ロジックを実行している時点で既にメモリに存在します

非同期の意味:

興味のあるデータの一部はまだ存在せず、将来のある時点でのみ存在します

実際、非同期プログラミングのこの存在しない側面が、通常、人々を混乱させます。

スクリプトの通常のロード方法は、HTML解析が一時停止され、スクリプトがダウンロードされ、スクリプトのダウンロードが完了すると実行され、HTML解析が続行されることです。HTMLの解析とスクリプトの実行は「同時」に行われます(同時は同時ではなく、同時に意味します)。

asyncスクリプトのロード方法は、htmlがscriptタグを認識し、将来スクリプトをダウンロードすることを覚えていますが、解析を続けます。HTML解析は、スクリプトのダウンロードのために一時停止されません。後で、HTML解析が完了すると、すべての非同期スクリプトがダウンロードされて実行されます。htmlの解析とスクリプトの実行は同時には発生しません(この場合も同じ時間を意味しますが、この場合は別々に実行されます)。

要約すると:

  • 同期スクリプトは、htmlと一緒に解析されます。

  • 非同期スクリプトは、将来個別に解析されます。

そのため、asyncプロパティの定義は、スクリプトがダウンロードされるとすぐに実行されるということではありません。これは、同期スクリプトと非同期スクリプトの両方に当てはまります。非同期の定義は、html解析がスクリプトのダウンロードを待機しないことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.