スレッドと非同期


82

この本当に良い記事から、プログラミングのスレッドモデルと非同期モデルについて読んでいます。http://krondo.com/blog/?p=1209

ただし、この記事では次の点について言及しています。

  1. 非同期プログラムは、I / Oがあるときはいつでもタスクを切り替えることにより、同期プログラムよりもパフォーマンスが優れています。
  2. スレッドはオペレーティングシステムによって管理されます。

スレッドは、(他のキューの中でも)Ready-QueueとWaiting-Queueの間でTCBを移動することにより、オペレーティングシステムによって管理されていることを読んだことを覚えています。この場合、スレッドは待機に時間を無駄にしませんか?

上記に照らして、スレッドプログラムに対する非同期プログラムの利点は何ですか?


5
いいえ、私はスレッド対非同期を意味しました。ポイント1については、記事から理解できたという理由だけで触れました。

回答:


78
  1. スレッドセーフなコードを書くことは非常に困難です。非同期コードを使用すると、コードが1つのタスクから次のタスクにシフトする場所を正確に把握できるため、競合状態を回避するのがはるかに困難になります。
  2. 各スレッドは独自のスタックを持つ必要があるため、スレッドはかなりの量のデータを消費します。非同期コードでは、すべてのコードが同じスタックを共有し、タスク間でスタックを継続的に巻き戻すため、スタックは小さく保たれます。
  3. スレッドはOS構造であるため、プラットフォームがサポートするためのより多くのメモリです。非同期タスクではそのような問題はありません。

12
少し詳しく説明すると、次のようになります。1。スレッドコードのI / O部分は比較的簡単ですが、競合状態なしでスレッド間の共有状態を管理する(ロック/キューなどを使用)のは難しいことです。非同期モデルを使用すると、同時に進行することが少なくなるため、レースを簡単に回避できます。2/3。各スレッドは、スタックの少なくとも1つのメモリページ(通常は4KBまたは8KB)に加えて、そのスレッドの状態に関連する他のデータ構造用の不明な量のメモリを消費します。
Dobes Vandermeer 2013

12

スレッドを作成するには、次の2つの方法があります。

同期スレッド-親は1つ(または複数)の子スレッドを作成し、各子が終了するのを待つ必要があります。同期スレッドは、フォークジョインモデルと呼ばれることがよくあります。

非同期スレッド-親と子は互いに同時に/独立して実行されます。マルチスレッドサーバーは通常、このモデルに従います。

リソース-http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720


7
  1. (マルチプロセッサマシン上で)IOを含まない2つのタスクがあると仮定します。この場合、スレッドは非同期よりもパフォーマンスが優れています。シングルスレッドプログラムのような非同期は、タスクを順番に実行するためです。ただし、スレッドは両方のタスクを同時に実行できます。

  2. IO(マルチプロセッサマシン上)を含む2つのタスクがあると仮定します。この場合、非同期とスレッドの両方がほぼ同じように実行されます(パフォーマンスは、コアの数、スケジューリング、タスクに集中するプロセスの量などによって異なる場合があります)。また、Asyncは、マルチスレッドプログラムを介したプログラミングに必要なリソースの量、オーバーヘッド、および複雑さを軽減します。

使い方?スレッド1はタスク1を実行し、IOを待機しているため、IO待機キューに移動されます。同様に、スレッド2はタスク2を実行します。これには、IOも含まれるため、IO待機キューに移動されます。IO要求が解決されるとすぐに、スケジューラーがスレッドの実行をスケジュールできるように、準備完了キューに移動されます。

非同期はタスク1を実行し、IOが完了するのを待たずに、タスク2に進み、両方のタスクのIOが完了するのを待ちます。IO完了の順序でタスクを完了します。

非同期は、Webサービス呼び出し、データベースクエリ呼び出しなどを含むタスク、プロセス集約型タスクのスレッドに最適です。

以下のビデオではAsync vs Threaded modelhttps://www.youtube.com/watch?v = kdzL3r-yJZYについて、またいつ使用するかなどについて説明しています。

これがお役に立てば幸いです。


2
考えられる解決策へのリンクはいつでも歓迎しますが、リンクの周りにコンテキスト追加して、他のユーザーがそれが何であるか、なぜそこにあるのかを理解できるようにしてください。ターゲットサイトにアクセスできない場合や完全にオフラインになる場合に備えて、重要なリンクの最も関連性の高い部分を常に引用してください。一部の回答が削除される理由と方法については、外部サイトへのリンクにすぎないことが考えられる理由であることを考慮に入れてください
マカビティ

4

まず、スレッドの実装方法とスケジュール方法の詳細の多くは、OS固有のものであることに注意してください。一般に、OSとハードウェアは、シングルプロセッサシステムで非同期に、またはマルチプロセッサで並列に、スレッドが効率的に実行されるように調整しようとするため、スレッドが互いに待機していることを心配する必要はありません。

スレッドが何か、たとえばI / Oの待機を終了すると、実行可能と見なすことができます。実行可能なスレッドは、近いうちに実行されるようにスケジュールされます。これが単純なキューとして実装されているか、より洗練されたものとして実装されているかは、OSとハードウェアに固有です。ブロックされたスレッドのセットは、厳密に順序付けられたキューではなく、セットと考えることができます。

シングルプロセッサシステムでは、ここで定義されている非同期プログラムはスレッドプログラムと同等であることに注意してください。


0

非同期I / Oは、ジョブを実行するスレッドがドライバーにすでに存在することを意味します。そのため、機能が複製され、オーバーヘッドが発生します。一方、ドライバースレッドの動作が正確に文書化されていないことがよくあります。複雑なシナリオでは、タイムアウト/キャンセル/開始/停止の動作、他のスレッドとの同期を制御する場合は、独自のスレッドを実装するのが理にかなっています。また、同期の観点から推論する方が簡単な場合もあります。


5
これは、非同期I / Oがどのように機能するかではありません。基本的に、I / Oはイベント駆動型です(デバイスへのI / Oを開始すると、後でデバイスがそれを完了し、できれば割り込みでそのように通知します)。いくつかの種類のI / O(ディスクI / Oなど)があり、ドライバーはややあいまいな理由でカーネルスレッドを使用します。しかし、ネットワークの場合、それはずっと非同期操作です。
グリフ

0

http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_schedulingを参照してください

ただし、(カーネルスレッドではなく)ユーザースレッドまたはファイバーでブロッキングシステムコールを使用すると、問題が発生する可能性があります。ユーザースレッドまたはファイバーがブロックするシステムコールを実行する場合、プロセス内の他のユーザースレッドおよびファイバーは、システムコールが戻るまで実行できません。この問題の典型的な例は、I / Oを実行する場合です。ほとんどのプログラムは、I / Oを同期的に実行するように作成されています。I / O操作が開始されると、システムコールが発信され、I / O操作が完了するまで戻りません。その間に、プロセス全体がカーネルによって「ブロック」されて実行できなくなり、同じプロセス内の他のユーザースレッドとファイバーの実行が不足します。

これによると、プロセス全体がブロックされる可能性があり、IOで1つのスレッドがブロックされたときにスレッドがスケジュールされません。これはOS固有のものであり、常に保持されるとは限りません。

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