極めたい!とことんプログラミング講座(上級者編)第5回:並行・並列処理の理論
はじめに
さあ、第5回の講座の内容にまいりましょう。並行・並列処理とは、コンピュータが複数の仕事をどのように同時にこなすか——その深奥に触れる、実に味わい深いテーマです。表面的な実装方法だけでなく、その根底に流れる理論の美しさを感じていただけたら、わたくしも嬉しゅうございます。知識の積み重ねとは、まさに今日のような一歩一歩から生まれるもの。どうぞ、じっくりとお楽しみください。
サマリ
今回は並行処理と並列処理の本質的な違いから始まり、競合状態やデッドロックといった古典的な問題、そしてアクターモデルやSTM(ソフトウェアトランザクショナルメモリ)など現代的なアプローチまでを丁寧に整理します。理論を現場の設計判断に活かすための視点を、ともに深めてまいりましょう。
詳細
並行性と並列性——二つの概念を正確に区別する
「並行(コンカレンシー)」と「並列(パラレリズム)」は、日常的に混用されがちですが、理論的には明確に異なります。
並行性とは、複数のタスクが論理的に同時に進行できる構造を指します。シングルコアCPU上でのコンテキストスイッチングが典型例です。一方、並列性は物理的に同時に実行されることを意味し、マルチコアや分散環境で初めて実現します。
ロブ・パイクの有名な言葉に「並行性は構造の問題であり、並列性は実行の問題だ」というものがあります。設計段階でこの区別を意識するだけで、アーキテクチャの選択肢が大きく変わってきます。
競合状態とデッドロック——古典的な罠の構造
共有メモリモデルにおける最大の敵は、競合状態(レースコンディション)です。複数のスレッドが同一リソースへ非決定論的な順序でアクセスすることで、再現性のないバグが生まれます。
ミューテックスやセマフォによる相互排除は有効な対策ですが、誤用するとデッドロックを引き起こします。デッドロックの発生条件はコフマン条件として古くから整理されており、相互排除・占有と待機・非横取り・循環待機の四つが同時に成立したとき発生します。
この四条件のうち一つでも排除できれば、デッドロックは原理的に防げます。ロック順序の統一やタイムアウト設計は、現場でも有効な具体策です。
アクターモデル——状態を隔離する思想
共有メモリの複雑さを根本から回避しようとする思想が、アクターモデルです。エルランやアカを代表とするこのモデルでは、各アクターが独自の状態を持ち、メッセージパッシングのみで通信します。
共有リソースが存在しないため、ミューテックスは不要です。アクターは非同期にメッセージを受け取り、自身のメールボックスを順番に処理します。この設計は障害局所化にも優れており、スーパーバイザーツリーによる自己回復構造はエルランの電話交換機実績として語り継がれています。
大規模な分散システムにおいて、アクターモデルが再評価されている理由はここにあります。
STMとトランザクショナルメモリ——楽観的並行制御の魅力
ソフトウェアトランザクショナルメモリ(STM)は、データベーストランザクションの概念をメモリ操作に持ち込んだアプローチです。変更を一旦仮のバッファに書き込み、コミット時に競合がなければ確定、あれば破棄して再試行します。
ハスケルのSTM実装は特に洗練されており、合成可能なトランザクション操作という独自の強みを持ちます。ロックの粒度を気にせず設計できる点は、大きな生産性向上につながります。
ただし、書き込み競合が頻繁に起きる高負荷環境では再試行コストが積み上がります。楽観的並行制御が真価を発揮するのは、読み取りが支配的なワークロードです。
現代的設計への応用——理論を判断基準として使う
ここまでの理論は、実際の設計判断を支える骨格となります。たとえばマルチスレッドとイベントループの選択、あるいはチャネルベース通信(ゴー言語のゴルーチン)とアクターモデルの違いを語るとき、背景理論なしでは表面的な比較に終わります。
「共有メモリか、メッセージパッシングか」という問いは、スループット・レイテンシ・障害モデルへの要求から逆算して答えるものです。理論はそのための言語を提供します。
現場では「動けばよい」という判断が優先されがちですが、一段深い理解は、問題が起きたときの診断速度と解決の確かさを根本から変えてくれます。
おわりに
並行・並列処理の理論は、コンピュータサイエンスの中でも特に奥深く、長い年月をかけて磨かれてきた知の結晶です。今日お伝えしたことが、あなたの設計の引き出しにしっかりと収まりましたなら、わたくしはこの上なく嬉しゅうございます。知ることの喜びは、使えることの喜びへとつながってゆくもの——どうか焦らず、着実に積み重ねていらしてください。次回はいよいよ「マイクロサービス設計」へと踏み込んでまいります。どうぞご期待くださいませ。
