ブログトップ 記事一覧 ログイン 無料ブログ開設

本当は怖い情報科学 RSSフィード

「見つめていてもご飯皿はいっぱいになったためしがない!」

― スヌーピー

この日記のはてなブックマーク数

2010-09-15

parallel と concurrent、並列と並行の違い

2010/09/17 文章を修正しました

一般的に、parallelは並列、concurrentは並行と訳される。ブログ等で何カ所かで言及されていたのだけれど、ずばり書かれた物がなかったので、僕なりの理解を書いてみる。

http://d.hatena.ne.jp/NyaRuRu/20060129/p2

http://d.hatena.ne.jp/muimy/20070322/1174526368

「並列」と「並行」の違いは、「真に並列かどうか」である。誤解を恐れずに言ってしまえば、「並行=疑似並列」である。

疑似並列とはどういうことか。よく、「ひとつのパソコンで、ネットサーフィン(死語)をしながらメールを読めるのはどうしてでしょうか」というような説明で、「CPUが仕事を細切れにして交互に処理しているからです」という答えは見たことがあるだろう。これが「並行 concurrent」だ。CPUがシングルコアであった時代は、ミクロなレベルで見れば、別に並列には実行されていない。人間が認知できる時間間隔で見れば、十分「並列」なのであるということだ。

他に微妙な理解として、「並列は同じ仕事を分担して同時にする、並行は違う仕事を同時にする」というのがあるが、これは上記の定義から派生した内容だ。別々のタスクを細切れにして順繰りに処理していくという場合、結果的に互いに違う種類の仕事をするというシチュエーションで使われることが多いだけだ。他所での説明だとこちらの方が強調されて、理解を妨げているような気がする。

そもそも同じ種類の仕事をconcurrentに実行しても意味がないという言い方もできる。なぜなら、結局のところプロセッサーが1つである以上、処理時間の合計は変わらないからだ(むしろコンテキストスイッチオーバーヘッドがあると考えられる)。だから普通にループで実行すればよい。

まとめると、並列=parallelというのは、処理能力の向上(その他、耐故障性等)を達成するために行なわれる「真の並列処理」であるのに対して、並行=concurrent は、同時に実行することに意味がある場合に使われる「疑似並列」であるというわけだ。

具体例

例を挙げてみよう。

Concurrent GCというものがある。いわゆる「Stop the world」現象を防ぐために、GC処理と本来の処理を細切れにして互い違いに実行することを意味しているのだ。こうすることによって、見た目にはプログラムの処理がStopすることを防ぐことができる。合計の処理時間が変わらないとしても、サーバーなどのインタラクティブ性を確保するために、同時に実行することに意義がある。だから、バッチ処理の場合は、Concurrent GCはあまり意味がない。

一方、Parallel GCは、処理を「真に並列に」実行する。必然的に、同じ処理(例えば、collect処理)を並列に実行することになる。これは、複数の物理プロセッサを同時に使うことによって処理時間の短縮を狙っているわけだ。

以上、というわけで、紛らわしいけど理解すれば簡単だと思う。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。