プログラミング基礎概念

並行処理 へいこうしょり

マルチスレッド並列処理非同期処理プロセススレッド競合状態
並行処理について教えて

簡単に言うとこんな感じ!

料理人が「お湯を沸かしながら野菜を切る」みたいに、複数の作業をうまく切り替えながら”同時っぽく”進めることだよ! コンピューターが複数のタスクをさばく仕組みのことなんだ!


並行処理とは

並行処理(Concurrent Processing)とは、複数の処理を「同時に、あるいは交互に切り替えながら」進める仕組みのことです。厳密に同じ瞬間に動かす「並列処理」とは微妙に異なり、並行処理は「論理的に複数の処理が進んでいるように見せる」ことを指します。たとえばCPUが1つしかなくても、処理を細かく切り替えることで複数の仕事が同時進行しているように振る舞えます。

現代のアプリケーション開発では、並行処理はほぼ必須の概念です。Webサーバーが何百ものリクエストを同時にさばいたり、スマホアプリが画面を表示しながらバックグラウンドでデータを取得したりする仕組みは、すべて並行処理の考え方が基盤になっています。システムの応答性・スループット(単位時間あたりの処理量)を高めるうえで欠かせない技術です。

発注・選定の立場では、「このシステムは何件の同時リクエストを処理できるか」「高負荷時にどう振る舞うか」といった性能要件の議論で必ず登場する概念です。並行処理の設計が甘いシステムは、アクセスが集中した瞬間に応答が止まったり、データが壊れたりするリスクがあります。


並行処理の主な仕組み

並行処理を実現する方法はいくつかあり、用途や言語によって使い分けられます。

方式概要主な用途
マルチプロセスOS上で独立したプロセス(仕事の単位)を複数起動するWebサーバー、バッチ処理
マルチスレッド1つのプロセス内で複数のスレッド(軽量な実行単位)を動かすGUIアプリ、ゲーム
非同期処理(async/await)処理の完了を待たず次の処理へ進み、完了時に通知を受けるWebAPI呼び出し、I/O処理
コルーチン処理を途中で一時停止・再開できる軽量な仕組みPythonasyncioKotlinなど
イベントループ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の非同期ランタイムなど、安全で高効率な並行処理を言語設計レベルで支援する潮流が加速

並行処理の実現モデル比較

代表的なプログラミング言語・環境での並行処理の実現方法を比較します。

並行処理モデルの比較 Java / C# マルチスレッド JavaScript イベントループ Go言語 goroutine Python asyncio / GIL制限あり 方式 CPU並列 メモリ共有 主な注意点 マルチスレッド ✅ 可能 ✅ あり 競合・デッドロック イベントループ ❌ 1スレッド ❌ なし 重い処理でブロック goroutine ✅ 可能 チャネル経由 軽量・安全設計 asyncio △ GIL制限 ✅ あり CPU処理は不向き ※ GIL = Global Interpreter Lock(Pythonの制約。CPU並列実行を制限する仕組み)

実務での選び方のポイント:

  • 大量のWeb APIリクエストをさばく → 非同期処理(async/await)が向いている
  • 重い計算を複数コアで分散 → マルチプロセスやGo/Rustが向いている
  • GUIアプリで画面とバックグラウンド処理を分離 → マルチスレッドが定番

関連する規格・RFC

規格・RFC番号内容
RFC 793TCP(並行接続を前提とした通信プロトコルの基盤)

関連用語