@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Concurrency vs. Parallelism

Ruby, Concurrency, and You | Engine Yard Blog というブログポストの URL が今日になってメールで送られてきたので読んだ。各種 Ruby 実装において concurrency と parallelism への対応がどのようになっているかをまとめた記事で、それについてはリンク先の表を見るとして、そもそも Concurrency と Parallelism の定義が気になった。

大雑把に要約すると「マルチコア CPU でそれぞれ別のコードが同時に走るのが pallalel でそれ以外はぜんぶ concurrent だ」ということらしいのだが、悲しいかな英語ネイティブではないため concurrent と parallel の感覚的な違いがわからない。ただ焦点がスレッドの動作に絞られていることは理解できた。マルチプロセスなんてものははなから相手にしてないようだ。

でも十年来 CGI と CGI のお化けばかり扱ってきたウェブ生まれウェブ育ちのプログラマには、正直いって「え、スレッドですか?」みたいな感覚がある。まぁロートルの古い感性はおいておくとしても、マルチコア CPU で *別のコードを* 同時に走らせて使い切るというユースケースもピンとこない。 CPU を使い切るほどハードな処理を行うコードがいくつもあるなら、それぞれを専門に走らせるサーバを別個にあてがったほうがいいんじゃないかな、と思う*1。そして単にコアを使い切りたいなら必要十分なだけ fork(2) すればいいのでは?とも。

いままでぼんやりと、 parallel == fork(2) のこと、 concurrent == スレッド, コルーチンなどのこと、という風にとらえていたけど、そもそもの用語の定義からしてあやふやにしたままだった、ということがわかったのでそういうところも地道に勉強したいところだけどやっぱり http://d.hatena.ne.jp/JavaBlack/20091224/p1 こういう感じの本を読むしかないのかな・・・。誰かこのあたりの話題に詳しい方、おすすめ書籍を教えてください。

*1:そのほうが CPU 以外のリソースも効率よく使いきれる気がする。もちろん他の役割のマシンとの間でうまく仕事を割り振りする必要があるけど、そういうのは単純なパズルなので考えやすい