並行処理の必要性

良く言うように、

  • 並列処理 = 速度向上が目的。逐次で書いたプログラムが複数CPUを使って高速に動けばそれが理想
  • 並行処理 = 「並行に動作する」ことをプログラム上で記述したい

という差があるわけですが、並行処理を記述したいのはどういう場合でしょう、という話。

色々考えてみたところ、やはりI/Oがからむ部分が本質かなぁと考えている。要は、

  • socketやらファイルからの読み込み、UIにおけるユーザからの入力待ちなどをブロッキングで読むAPIを使いたい。しかし、読み込み待ちの間に他の入力が可能になったら、そちらの処理をしたい。
  • 重い処理をしている間にユーザからの入力あったら、そちらに迅速に対処したい。

など。
もちろん、シングルスレッドでも書けるんだけど、例えば後者の場合は、処理中に入力があるかどうかのチェックをして、入力があれば、その処理を行う、なんてプログラムを書かないといけない。並行処理を使えれば、ユーザからの入力を待っているスレッドがを作り、それが入力があった時点で迅速に反応するようにすれば良い。

要は、入出力が無ければ内部でどんな順で実行しても外からは見えないわけで。それこそ「逐次で」「順番に」実行しても何の問題も無い。

それから、良く「プログラムしたい対象にそもそも並行性があるから」という理由があげられることもあるんだけど、これは理由としてはやや弱いと思う。無くは無いと思うけれども、本当に並行に動作するプロセス/スレッド間で通信・同期するように書きたいのかしら?(通信・同期が無いのであれば、逐次に書いても同じだし。)

PARDSで並行処理をサポートする理由は、PARDSはpthreadと混在できず、したがって、並行処理を記述するにはPARDSの枠内でやるしかないから。とりあえず今の仕様でもI/Oまわりで並行処理を記述したい場合には、対応できると思っているけど、これでOKかしらん?