現段階でのプログラミングでは、シングルスレッドプログラミングが主流です。ステート・チャート図に代表されるように、状態遷移を考慮してプログラムを組む事に慣れていても、協調作業には慣れていないという側面があると思います。
スレッドを生成するという事は、同時に並行して作業を行うという事です。家を建築するにあたり、土台が完成しない事には、柱を立てる事ができません。プレハブであれば、1階・2階に関係なくパーツを組み立てる事ができるでしょうが、1階部分を先に設置しない事には2階部分を設置する事ができません。
作業の進み具合によっては、待ち時間が発生してしまうのです。
自分の作業を進めながら、相手が作業を完了したか確認するタイミングと度合いなどを考え(=設計し)なければなりません。これが地味に難しい。
通信系のAPIには、IO Completion port と呼ばれるものがあります。これが使いにくいAPI で、通信を指示(データを送信しろ・データを受信しろ)した後に、通信が完了した時のコールバック関数を登録するか、シグナルと呼ばれる信号機のようなハンドルを利用します。指示してから、完了するまでの間を有効に使えるでしょ?というAPIです。ところがもの凄い短時間に通信が完了してしまって、コンセプトをもって設計しないと、何もしようがありません…。
単純な作業を任せるだけなら良いのですが、この作業が終わったら今度は、あいつ(スレッド)に違う作業をやらせて…などと、コラボレーションの規模を大きくすれば、それだけモデルも複雑になっていきます。場合によっては、協調作業を行うための指揮者(スレッド)を雇わなければならないでしょう。
マルチスレッド・プログラミングにおいては、設計の段階で構想力が要求されます。
マルチスレッド化する目的も考えてみましょう。
- レスポンスを確保するためのマルチスレッド化
- CPUの性能をフルに引き出すためのマルチスレッド化
- セキュリィティを確保するためのマルチスレッド化(マルチプロセス、マルチマシン)
・・・続く
0 件のコメント:
コメントを投稿