並行処理 へいこうしょり
簡単に言うとこんな感じ!
料理人が「お湯を沸かしながら野菜を切る」みたいに、複数の作業をうまく切り替えながら”同時っぽく”進めることだよ! コンピューターが複数のタスクをさばく仕組みのことなんだ!
並行処理とは
並行処理(Concurrent Processing)とは、複数の処理を「同時に、あるいは交互に切り替えながら」進める仕組みのことです。厳密に同じ瞬間に動かす「並列処理」とは微妙に異なり、並行処理は「論理的に複数の処理が進んでいるように見せる」ことを指します。たとえばCPUが1つしかなくても、処理を細かく切り替えることで複数の仕事が同時進行しているように振る舞えます。
現代のアプリケーション開発では、並行処理はほぼ必須の概念です。Webサーバーが何百ものリクエストを同時にさばいたり、スマホアプリが画面を表示しながらバックグラウンドでデータを取得したりする仕組みは、すべて並行処理の考え方が基盤になっています。システムの応答性・スループット(単位時間あたりの処理量)を高めるうえで欠かせない技術です。
発注・選定の立場では、「このシステムは何件の同時リクエストを処理できるか」「高負荷時にどう振る舞うか」といった性能要件の議論で必ず登場する概念です。並行処理の設計が甘いシステムは、アクセスが集中した瞬間に応答が止まったり、データが壊れたりするリスクがあります。
並行処理の主な仕組み
並行処理を実現する方法はいくつかあり、用途や言語によって使い分けられます。
| 方式 | 概要 | 主な用途 |
|---|---|---|
| マルチプロセス | OS上で独立したプロセス(仕事の単位)を複数起動する | Webサーバー、バッチ処理 |
| マルチスレッド | 1つのプロセス内で複数のスレッド(軽量な実行単位)を動かす | GUIアプリ、ゲーム |
| 非同期処理(async/await) | 処理の完了を待たず次の処理へ進み、完了時に通知を受ける | WebAPI呼び出し、I/O処理 |
| コルーチン | 処理を途中で一時停止・再開できる軽量な仕組み | Pythonのasyncio、Kotlinなど |
| イベントループ | 1スレッドで非同期イベントを順番に処理する | Node.js、ブラウザJS |
覚え方:「並行」vs「並列」の違い
混同しやすい並列処理(Parallel Processing)との違いを整理しておきましょう。
並行処理(Concurrent):1人のコックが料理を"掛け持ち"しながら進める
→ 時間を分割して交互に実行(CPUが1つでもOK)
並列処理(Parallel):複数のコックがそれぞれ別の料理を"同時に"作る
→ 物理的に同時実行(複数CPUコアが必要)
語呂合わせ:「並行=交互にGO(交互に進む)」「並列=列を並べて一斉に」
並行処理の落とし穴
並行処理には便利さの裏にリスクもあります。
| 問題 | 内容 | 例 |
|---|---|---|
| 競合状態(Race Condition) | 複数の処理が同じデータを同時に書き換えて壊れる | 在庫数を2つの処理が同時に更新 |
| デッドロック | 互いに相手の処理待ちになって両方止まる | AがBを待ち、BがAを待つ |
| スターベーション | ある処理が永遠に実行順番をもらえない | 優先度の低い処理が後回しにされ続ける |
歴史と背景
- 1960年代 — IBMのメインフレームが「マルチプログラミング」を実現。CPUの待ち時間を有効活用するためにタスクを切り替える発想が生まれる
- 1970年代 — UNIXがプロセスとパイプラインの概念を導入。並行処理の実装が一般化し始める
- 1980年代 — マルチタスクOSの登場(Macintosh OS、Windows)。一般ユーザーも並行処理の恩恵を受けるようになる
- 1990年代 — Javaが言語レベルでスレッドをサポート(1995年)。開発者が簡単に並行処理を書けるようになる
- 2000年代 — CPUのクロック向上が限界に達し、マルチコアCPUが普及。並行・並列処理の重要性が一気に高まる
- 2010年代 — 非同期処理(async/await)がJavaScript(ES2017)、C#、Pythonなどに相次いで導入。Webアプリ開発での並行処理が大幅に書きやすくなる
- 2020年代 — Go言語のgoroutine、Rustの非同期ランタイムなど、安全で高効率な並行処理を言語設計レベルで支援する潮流が加速
並行処理の実現モデル比較
代表的なプログラミング言語・環境での並行処理の実現方法を比較します。
実務での選び方のポイント:
- 大量のWeb APIリクエストをさばく → 非同期処理(async/await)が向いている
- 重い計算を複数コアで分散 → マルチプロセスやGo/Rustが向いている
- GUIアプリで画面とバックグラウンド処理を分離 → マルチスレッドが定番
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 793 | TCP(並行接続を前提とした通信プロトコルの基盤) |
関連用語
- ./031-multithread.md — スレッドを複数起動して並行処理を実現する仕組み
- ./032-async-processing.md — 処理完了を待たずに次の処理へ進む非同期処理の概念
- ./033-parallel-processing.md — 複数CPUコアで物理的に同時実行する並列処理
- ./034-process-thread.md — OSにおけるプロセスとスレッドの違いと関係
- ./036-deadlock.md — 並行処理の代表的な障害:デッドロックの仕組みと対策
- ./037-race-condition.md — 複数処理が同じデータを同時更新して矛盾が生じる競合状態
- ./038-mutex-lock.md — 並行処理の排他制御を実現するミューテックス・ロックの仕組み
- ./039-event-loop.md — JavaScriptやNode.jsが採用する非同期イベント処理の仕組み