• 締切済み

非同期処理とマルチスレッドの違い

非同期処理とマルチスレッドの違いについて学んでいて少々こんがらがっております。 とても大まかに私の理解を説明します。 同期処理:前の処理終わるまで次の処理待たされる。 非同期処理:処理のタイミング自由。 マルチスレッド:疑似的並列処理。 ぼんやりした理解で、もやもやしております。理解したい・・・ 例えなどで分かりやすく違いを教えていただけませんか。専門用語に出来るだけ頼らないような直感的な説明だと大変嬉しゅうございます。 宜しくお願いいたします。

みんなの回答

  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.5

nda23様が非常に良いまとめ方をしてくださっていると思います。 >同期/非同期は「待つ/待たない」という方式の差異です。 >スレッドのシングル/マルチは同時に実行する「処理の流れ」を >「単数/複数」作るかどうかということです。 私もまさにその通りと思います。 >「非同期入出力の実現には、マルチスレッド(複数車線、路線)が必須。複数の(‥略) 入力、出力はOSレベルで勝手に非同期(必要に応じて同期して)に動いていますよ。 アプリケーションレベルで意識することはまずありません。 スレッドというのはプロセス(ソフト)の構成単位です。 プロセスは必ず1つ以上のスレッドから構成されています。 1つのスレッドのみで動くプロセスがシングルスレッドのプロセス、2つ以上のスレッドで動くプロセスがマルチスレッドのプロセスです。 nda23さんもおっしゃっていますが >非同期式(待たない)のスレッド(シングルスレッド)←厄介 >同期式(待つ)のスレッド(シングルスレッド)←一番普通 非同期式、同期式のスレッドというのはありません。 スレッドというのは(同じプロセス内であろうと)個々に独立して動作しており、 その結果として非同期になるというだけの話です。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

>非同期式(待たない)のスレッド(シングルスレッド)←厄介 ちょっと違う。「非同期式のスレッド」というのはありません。 「非同期式の入出力」はあります。非同期式入出力を単独で扱うなら シングルスレッドでも大したことはありません。非同期式入出力を 使うと言うことは、入力完了までに何かしたいからなのであって、 その何か(これも別の非同期処理である可能性が高い)を含めて、 複数の動作を管理・制御するのが厄介なんです。 >同期式(待つ)のスレッド(シングルスレッド)←一番普通 上と同じ。「同期式のスレッド」というのはありません。 >非同期式(待たない)のスレッドを複数(マルチスレッド)←厄介 上と同じ。個別のスレッドは何のために非同期入出力を使うのかを 考える必要があります。 >同期式(待つ)のスレッドを複数(マルチスレッド)~ スレッド同士は常に非同期です。別のスレッドに気兼ねする理由は ありませんから。ただ、スレッド間で足並みを揃えなければならない 瞬間もあるので、セマフォやミューテックスと呼ばれるものを使って 同期を取ったり、資源の競合を避けるようにしています。 私がよく使う手は「同期式入出力を使うスレッドを複数建てる」です。 また、通信系では相手がダウンしている場合もあるので、非同期式の 送受信を使います。(同期式受信だと、相手が送信してくるまで、 サスペンド状態になり、制御不能に陥る)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

マルチスレッドの理解 まあ、だいたい合っています。難しく考える必要はないでしょう。 別例として、5ヶ所のサーバからFTPで大容量のファイルを転送すると しましょう。シングルスレッドなら当然、順番に実行するしか ありませんね。でも、5個のスレッドで処理すれば同時に実行でき ます。理論上、シングルスレッドに比べ1/5の時間で処理可能です。 実際にも同様の効果が得られます。 非同期の理解 非同期とは違うんですが、ハードウェアの制御はLSIへの指令で実行 します。「読み込み」、「シリンダ位置」などを次々とLSIポートに 出力(実際にOUT命令と言う機械語)します。ソフトウェア側では 指令を出した後はどうしますか?何もすることはありませんね。 ハードウェアから「動作の完了」を待つ以外ないのです。でもCPUは 止まりませんから、何か別の命令を実行し続けます。この時点で ハードとソフトの動きは「非同期」状態と言えます。 >非同期入出力の実現には、マルチスレッド(複数車線、路線)が必須 必ずしも必須ではありません。完了まで待たなければ非同期です。 しかし、実際にやると分かりますが、シングルスレッドで、複数の 非同期入出力を制御するのはとても厄介です。 >同期出入力は、シングルスレッド(単一の路線)で十分~ 同期式入出力のスレッドを複数建てる(マルチスレッド)という方法も あります。 同期/非同期は「待つ/待たない」という方式の差異です。 スレッドのシングル/マルチは同時に実行する「処理の流れ」を 「単数/複数」作るかどうかということです。

e271828
質問者

補足

回答ありがとうございます! マルチスレッドのFTPの例で理解できました! 非同期の例は、ソフトは待つけどハードは待たないということですよね。両者の方式の差異が同期/非同期なのですね。 以下の明快な説明で80%まで理解できた気がします。もやもやが晴れてきました! 『同期/非同期は「待つ/待たない」という方式の差異です。 スレッドのシングル/マルチは同時に実行する「処理の流れ」を 「単数/複数」作るかどうかということです。』 残り20%の確認としてもう一度、私の理解の確認をお願いします。物わかりが悪くて申し訳ありません・・・。 以下のようなマルチ・シングルスレッドがある 非同期式(待たない)のスレッド(シングルスレッド)←厄介 同期式(待つ)のスレッド(シングルスレッド)←一番普通 非同期式(待たない)のスレッドを複数(マルチスレッド)←厄介 同期式(待つ)のスレッドを複数(マルチスレッド)←全体として、その個々のスレッドの関係は「非同期」といえますか?

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

非同期の例 ディスク入出力はCPU実行速度に比べて遅い。 ディスク入出力はハードウェアに対するコマンド指令である。 故にコマンドの動作が完了するまで、CPUを待たせる義理は無い。 実際に、ドライバは待ったりしません。これは即ち、入出力とは 非同期の関係になっています。 動作の完了はハードウェアからの割り込み信号によって検出します。 同期式の入出力はこの割り込みまでSleepしているだけです。 マルチスレッドの例 ファイルのコピーを考えます。 シングルスレッドだと、以下のようになります。 入力:→  →  →  → 出力:  →  →  →  → マルチスレッドだと、以下のようになります。 入力:→ → → → 出力: → → → → 文章にすると 1.スレッドAで入力 2.スレッドAが完了したら、スレッドBで出力。 3.スレッドBで出力中に、スレッドCで入力。 4.スレッドCが完了したら、スレッドDで出力。 5.スレッドDの出力中に、次の入力スレッドを起動 以下、続く。 つまり、スレッドBとスレッドCが同時に実行されています。 同様に、スレッドDと次の入力も同時に実行されています。 このように、入力のスレッドと出力のスレッドを分けることで、入力と 出力を同時に実施することが可能になるのです。 ※非同期入出力を使っても、シングルスレッドだと意味が無い。 従って、理論上はシングルスレッドの時の半分の処理時間で済む のです。しかし、経験から言うと、実際は理論値よりも更に短縮され ます。勿論、あまりスレッドを建て過ぎると、効果が落ちますが・・・ どれくらいが適正かはCPU、メモリ搭載量などで異なるので、何とも 言えません。ただ、マルチスレッド、マルチプロセスの技術は処理の 効率化という点では飛躍的な効果をもたらします。 SEとしては是非に身に付けておくべき技術だと思います。

e271828
質問者

補足

回答ありがとうございます。 ★マルチスレッドの例について 「入力のスレッドと出力のスレッドを分けることで、入力と出力を同時に実施することが可能になるのです。」という解説から、 入力している最中、ほぼ同時に出力・表示される「ソフトウェアやWebの入力フォーム」が頭に浮かびました。シングルスレッドなら入力が終わるまで出力されず、入力終了の合図(Enterで確定など)でやっと出力・表示される感じでしょうか。この想像はマルチスレッドの例として正しいと言えますか?判定をお願いします ★非同期の例について ハードウェアについて私の勉強不足でnda23さんの例えが理解できませんでした。分かるところは調べたりしてみたので、改めてその理解について確かめるため質問をさせてください >ディスク入出力はCPU実行速度に比べて遅い。 ハードディスクへの読み書き(例えばファイルの保存、削除とか)の一連の命令を実行する速度はCPU動作クロック(一秒間に実行可能な命令数など)に比べて遅い。ということですか? >ディスク入出力はハードウェアに対するコマンド指令である。 この文脈のハードウェアとは、CPUやメモリ(ROM,RAM)などのことでしょうか?また、コマンド指令とは何でしょうか?Windowsの「ファイル名を指定して実行」みたいなものでしょうか >故にコマンドの動作が完了するまで、CPUを待たせる義理は無い。 入力終わるまで、処理(CPU)待たせる義理は無い。ということでしょうか >実際に、ドライバは待ったりしません。これは即ち、入出力とは 非同期の関係になっています。 >動作の完了はハードウェアからの割り込み信号によって検出します。 >同期式の入出力はこの割り込みまでSleepしているだけです。 まとめると、以下のような理解でよろしいでしょうか? 非同期の入出力:入出力1処理中。入出力1の動作完了を意味するハードウェアからの割り込み信号まで別の入出力2にCPUを使う。割り込みきたら入出力1にCPU渡す。 同期式の入出力:入出力1処理中。入出力1の動作完了を意味するハードウェアからの割り込み信号までCPUを使わず待つ 最後の確認になります。非同期とマルチスレッドの関係を述べた以下の説明は正しいと言えますか?現在の私の理解の集大成です。 「非同期入出力の実現には、マルチスレッド(複数車線、路線)が必須。複数のスレッドを用意して出力用・入力用それぞれ分けることで非同期入出力が実現される。同期出入力は、シングルスレッド(単一の路線)で十分。マルチスレッドを用いても使う機会がないから意味がない!」

  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.1

非同期処理の方が広義な意味を持つと思います。 マルチスレッドも非同期で動きますからね。 マルチスレッドはひとつのプロセスの中で複数のスレッドが動くことを指しますから こっちの方が意味的には狭義です。 複数のソフト(プロセス)を同時に動かすことのできるWindowsはマルチプロセス、あるいはマルチタスクなんて言いますね。 そのプロセスの中でさらに非同期処理を行うのがマルチスレッドといった感じです。 非同期処理と言われるとマルチスレッドの他に、サーバとの非同期通信による処理なんかも 思い浮かべてしまいます。

e271828
質問者

補足

回答ありがとうございます。 「非同期処理の方が広義な意味」なるほど!と思いました。 OKbokuzyoさんとnda23さんの回答を参考に考えてみました。以下のような理解で正しいといえますか?OKbokuzyoさんの見解を教えてください。 「非同期入出力の実現には、マルチスレッド(複数車線、路線)が必須。複数のスレッドを用意して出力用・入力用それぞれ分けることで非同期入出力が実現される。同期出入力は、シングルスレッド(単一の路線)で十分。マルチスレッドを用いても使う機会がないから意味がない!」

関連するQ&A