55-並列処理に有効なメッセージパッシング

プログラマが知るべき97のこと」の55個目のエピソードは、並列処理に関する話です。並列処理に関する関心は日々に高まっています。プロセッサのクロック速度の向上はやや頭打ちになってきており、高速に処理を行う為にはコアを増やす傾向なのです。家庭用のPCでもデュアルコアは最低限のスペックですから、家庭で使うようなちょとしたフリーソフトであっても、並列処理を考慮する価値は十分にある時代です。しかし、並列処理は非常に難しい技術です。タイミングやデッドロックの問題、メモリのアトミック性に伴う問題などたくさんのことを学ぶ必要があります。Javaであれば、「Java並行処理プログラミング」は必読書と言えるでしょう。一時期は絶版状態でしたが、復刊運動の結果、入手もできるようになりました。
このエピソードでは、そんな並列処理の1つの技法であるメッセージパッシングについて書かれています。メッセージパッシングについては深く勉強をしているわけではないので大まかなことしか知りませんが、簡単に言えば共有メモリを使わずに独立したプロセス間でメッセージを送受信しながら処理を行う方法です。並列処理の難しい点は共有したメモリへのアクセスです。これは同じ素材に対して、複数人で作業しているような状態です。それぞれがタイミングを間違えて作業を行ってしまったり、お互いにお互いが始めるのを待っている状態になるなど、様々な複雑な状況を想定しなくてはなりません。しかし、素材を2つに分けてしまい、お互いに独立して作業ができるのであれば、少なくとも前述のような問題は起きないのです。必要に応じて両者は会話(メッセージ)をします。作業状況を確認しつつ、お互いの作業に集中できるのです。メッセージパッシングを使った仕組みはまさにそんなイメージです。お互いが独立しているので、リモートマシン間での並列処理も簡単になります。ただし、うまくタスクを分割できなければなりません。お互いの作業を後からマージできるような処理であれば、安全で分散がしやすいメッセージパッシングは有効な選択肢でしょう。
ただ、まずは基本的な並列処理をもっと学ぶべきだと思います。メッセージパッシングのような1つ上位のレイヤーにある仕組みを使いこなすには、並列処理の難しさを知った上でどうしてそのような仕組みなっているかを理解して使うべきでしょう。メモリの揮発性や不変オブジェクトの価値などは並列処理プログラミングを学ばなければあまりピンとくるものではありません。共有メモリをどう扱うと安全な並列処理が実装できるのかを学ぶべきです。その上でメッセージパッシングを選択する方がずっと有用です。
ちょっとしたソフトウェアでも並列処理に関するニーズは高まっています。自分のホーム言語ならば、並列処理を自然に書く事ができるようにしましょう。

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

プログラマが知るべき97のこと

プログラマが知るべき97のこと