1 基本概念

非同期通信は、送信と受信の動作が厳密に同時である必要のない通信方式である。送信側は相手の即時応答を待たずに処理を進められ、受信側も自分の都合のよい時点でデータを取り出せる。こうした性質により、待ち時間を別の仕事に振り向けやすく、装置やソフトウェアの資源を有効に使いやすい。

1.1 定義

この方式では、情報のやり取りが一回の連続した会話のように進むとは限らない。送信要求、受領通知、後続の取得といった複数の段階に分かれ、各段階のあいだに時間差が生じても成立する。実際の実装では、通信の成立そのものよりも、完了をどのように把握するかが重要になる。

1.2 同期通信との違い

同期通信では、送信側と受信側が同じ拍子で進み、相手の応答を前提に動作することが多い。これに対して非同期通信は、片方が先行してもよく、相手の準備完了を必須条件としない。結果として、同期型は手順が分かりやすい一方、非同期型は柔軟だが管理項目が増えやすい。

1.3 非同期処理との関係

非同期通信は非同期処理と密接に関わるが、同義ではない。前者は情報の受け渡しの仕組みを指し、後者は処理の実行順序や待ち方に関する考え方を含む。プログラムでは、通信が非同期であっても処理全体は同期的に書かれることがあり、逆に内部処理が非同期でも通信自体は単純な形を取ることがある。

2 仕組み

非同期通信の内部では、送る、受け取る、確認するという動作が一続きの流れとしてではなく、区切られた段階として扱われる。これにより、利用者や制御装置は次の作業へ移りやすくなるが、状態の記録や通知の管理が必要になる。

2.1 通信の流れ

一般には、送信側がデータを出した時点で処理が完了したように見えても、実際の受信や処理は後で行われる。受信側は蓄えられた情報を取り出し、必要に応じて応答を返す。途中で遅延があっても通信全体は継続できるよう、途中状態を保持する仕組みが組み込まれることが多い。

2.2 応答の扱い

応答の扱いは非同期通信の中心である。送信後すぐに結果が分からなくても、完了通知、受領確認、失敗通知などを後から受け取ることで、処理の成否を把握できる。応答の欠落や遅延に備え、再確認のための手順が設けられることもある。

2.2.1 待機しない制御

待機しない制御では、送信後に相手の返答を見張り続けず、別の作業を続行する。これにより、入力待ちや通信待ちで全体が止まりにくくなる。もっとも、後から返ってくる結果をどこで受け取るかを明確にしておかないと、処理の抜け落ちが起こりやすい。

2.2.2 結果通知の方法

結果通知には、割り込み、メッセージ、イベント、完了フラグなどさまざまな形式がある。設計によっては、通知を受けた時点で自動的に次の処理へ進む場合もあれば、明示的な取得操作を必要とする場合もある。通知手段の選び方は、応答速度だけでなく、実装の分かりやすさにも影響する。

2.3 送受信の分離

非同期通信では、送信と受信の役割を分けて考えることが多い。送る側はデータを渡すことに集中し、受け取る側は到着した情報を順番に処理する。この分離により、各部分を独立に拡張しやすくなる一方、整合性を保つための調整が重要になる。

3 実装方式

実装方式は、通信相手からの反応をどのように察知し、どの手順で後続処理につなげるかによって異なる。計算機の構成やソフトウェアの設計思想によって、適した方法は変わる。

3.1 割り込みによる方式

割り込みによる方式では、処理の途中で特定の事象が発生すると、現在の作業をいったん保留して通知を受ける。受信完了や到着の合図を機械が直接知らせるため、反応は速い。反面、割り込みの発生頻度が高いと、制御が細かく分断されることがある。

3.2 キューを用いる方式

キュー方式では、到着したデータや通知を順序付きの待ち行列に入れ、受け手が後から取り出す。これにより、送信の速さと受信の速さが一致しなくても吸収しやすくなる。大量の情報を扱う場面で特に有効だが、滞留が長引くと遅延が増える。

3.3 イベント駆動方式

イベント駆動方式は、状態変化や通知を合図として処理を進める構成である。利用者の操作、通信の完了、タイマーの満了など、さまざまな出来事を契機に動作を切り替える。小さな反応を積み重ねる形に向いており、対話的なシステムで広く使われる。

3.3.1 イベントループ

イベントループは、発生した出来事を順に取り出して処理する仕組みである。待機中も監視を続け、通知が来るたびに適切な処理へ振り分ける。単純な構造に見えるが、多数の要求をさばく際には公平性の調整が必要になる。

3.3.2 コールバック

コールバックは、ある処理が終わった後に呼び出される関数や手続きである。結果が得られた時点で自動的に後続処理へつなげられるため、流れを分割しやすい。もっとも、呼び出しが連鎖すると、全体の見通しが難しくなることがある。

3.3.3 未来値

未来値は、まだ確定していない結果を表す入れ物である。処理開始時に先に受け取り、完了後に中身を参照する。非同期操作の戻り値を扱いやすくする一方、取得のタイミングを誤ると、待ちや例外処理が必要になる。

4 応用分野

非同期通信は、単一の機器内部から広域ネットワークまで幅広く利用される。待機時間を抑えつつ複数の作業を並べて進めたい場面で、とくに有用である。

4.1 コンピュータ内通信

装置内部では、周辺機器とのやり取りや記憶装置へのアクセスに使われる。CPUが入出力の完了を逐一見張らなくてよいため、計算を継続しながら別経路の処理を進めやすい。高速化だけでなく、資源の遊休を減らす目的でも採用される。

4.2 ネットワーク通信

ネットワークでは、相手の応答が遅れる可能性が高いため、非同期の考え方が特に重要になる。要求を送ったあとに別の処理を続け、返答が届いた時点で結果を反映することで、利用体験を損ねにくい。通信断や遅延への備えも組み込みやすい。

4.3 利用者向け画面

画面表示では、操作のたびに待ち時間が発生すると使いにくくなる。非同期通信を用いれば、送信中でも画面を固めず、進行状況の表示や部分更新が可能になる。これにより、対話的な印象を保ちやすい。

4.4 分散システム

複数の計算機が連携する環境では、各部分の速度差や障害の可能性を前提にしなければならない。非同期通信は、全体を一斉に止めずに局所的な遅延を吸収しやすい。大規模な処理を段階的に進める設計とも相性がよい。

5 利点と課題

非同期通信は、性能面での利点が大きい一方、扱い方を誤ると複雑さが増す。効率と管理の難しさが表裏一体になっている。

5.1 利点

待ち時間の有効活用が主な強みである。処理を止めずに別の作業へ移れるため、全体の流れを滑らかにしやすい。

5.1.1 処理効率の向上

応答待ちのあいだに他の計算や入出力を進められるため、資源の利用率が高まりやすい。特に遅延の大きい環境では、同期型よりも実効的なスループットを改善しやすい。

5.1.2 応答性の改善

利用者の操作にすぐ反応し、裏で通信を続けられる点は大きな利点である。画面が止まりにくく、体感的な速さを保ちやすい。

5.2 課題

便利な反面、状態管理や失敗処理の負担が増える。単純な手順で済まなくなるため、設計段階での配慮が欠かせない。

5.2.1 設計の複雑化

処理が分割され、通知の経路も増えるため、全体像を把握しにくくなる。どの時点で何が完了しているかを追跡する仕組みが必要である。

5.2.2 順序管理の難しさ

複数の要求が同時進行すると、到着順と処理順が一致しないことがある。順番が前後しても正しく扱えるよう、識別番号や状態表を用いる場合が多い。

5.2.3 障害時の確認作業

通信が途中で失敗した場合、どこまで成功したかを見極めるのが難しい。再送の要否、重複実行の有無、受信確認の欠落などを丁寧に点検する必要がある。

6 関連技術

非同期通信は単独で存在するのではなく、他の制御技術と組み合わされて使われる。関連分野を理解すると、動作原理がより明確になる。

6.1 同期機構

同期機構は、処理の進み具合をそろえるための仕組みである。非同期通信では、必要に応じてこの機構を部分的に取り入れ、順序や整合性を保つ。両者は対立するだけでなく、補完関係にもある。

6.2 入出力制御

入出力制御は、装置とのやり取りを管理する技術である。データの受け渡し、バッファの調整、完了通知の発行などが含まれる。非同期通信の多くは、この制御層の設計に大きく依存する。

6.3 並行処理

並行処理は、複数の仕事を同時進行のように扱う考え方である。非同期通信は、その実現手段として利用されることが多い。互いに独立した作業を並べることで、全体の滞りを減らせる。

6.4 非同期通信の評価指標

評価では、応答時間、処理量、遅延のばらつき、失敗率などが重視される。単に速いだけでなく、負荷が高い状況でも安定して動くかが重要になる。用途によって、重視する指標は異なる。