2018年1月17日水曜日

MultiProcess or MultiThread

メモメモ、、、、

僕は、自律制御の仕組を開発している。
もう、3年程度たつので、現在のモノをスマートにブラッシュアップしたくていろいろ検討中
内部では、様々な処理をマルチタスクで行っているが、いよいよスパゲティー状態。それと、いろいろなノウハウもたまり、、、

再実装を考えた場合、マルチタスクのシステムなので、
それをどう実現する様に、改めて考えている。
技術的には、マルチスレッドやマルチプロセスなどのテクニックの利用となる。
ネットには、一般論や解りやすい事例は書いてあるけど
自分の技術選択に必要な情報はほとんどない
で、自分で決めるわけだけど、、、
以下は、まとまっていないけど、、、

技術選択基準は、
・堅牢なシステムの実現
・開発効率、特に検証・デバッグのやりやすさ
・システムの拡張のしやすさ

・堅牢性
ロボットのコントローラなので、堅牢な作りにする必要がある。
堅牢とは、、、、
・目的の機能を誤りなく実行し続ける事。
・想定内の異常が発生した場合、所定の手続きで、必要な処置を行い決められた状態に移行する事

人それぞれによって異なる訳で、、、
実際は、システムデザイン、プログラムデザインに係わる事なんだけど、、、
一つのタスクだけで動くわけではないので、
マルチに動くタスクをどのように管理するのか?
それが、重要で、、、
となると、
マルチスレッド、マルチプロセスどちらを上の基準から選択するのか?

自分の堅牢の定義が世間一般的なのかはさておき、、、
マルチタスクの視点から言えば、徹底的なモジュール化をベースに、モジュール結果の評価を正しく行い、次の処理へとつなぐこと。
では、スレッドとプロセスどちらが適しているのだろうか、、

その前に、
マルチスレッドと、マルチプロセスの復習
・マルチプロセスは、複数の独立したプロセスで並列処理する事
・マルチスレッドは、一つのプロセス内で並列処理する事

ブラウザーや、ウェブサーバーはマルチスレッドになっている。
ブラウザーのファイルダウンローなどはスレッド、また画面に現れるダイアログボックスもスレッド。そうしないと、ファイルのダウンロード終了までブラウザーが固まってしまうから、、、時間のかかる処理を別に動かす。また、タグもそれぞれ別スレッド。そうしないとブラウザープログラムで一つのサイトしか表示できない。
Webブラウザーも、アクセスしてくる要求毎にスレッド対応。以前は、fork()だったけど、アクセスが多くなると起動時のオーバヘッドの高いfork()では、感じる遅延が発生する。
この二つの例は、同一機能を並列的に複数行う事と考えても良い。
つまり、機能のクローン化。ダイアログをスレッドかするのは、クローン化というよりは時間差により遅延解消
そうみると、
・機能のクローン化
・時間差処理の外だし
と考えてもよい。
マルチプロセスも、機能のクローン化
両方ともに、良い点や考慮しなければならない事があり、決定的な優劣はつけにくい。

ところで、僕は何の為にマルチタスクにするのか?
それを再度考えると、、、
このような機能構成のロボットコントローラーを開発するのが目的であり、
よくよく構成をみると、マルチプロセスか、マルチスレッドなのか
どちかの技術で決められない事がよく解る。
あさはかな自分、反省


これを、先ほどの求める事などを組合わせて考えると、、、
青いBoxはマルチスレッドで機能クローン化を図った方がよい所、
赤い線の部分は、プロセスとして運用した方が良い所、、、

マルチプロセスと、マルチスレッドの組合せで構成するというのが
先の技術選択基準を満たすと今は考えている。

という事は、今度は、プロセス間通信をどうするかという事だけど、、、
それは、Share Memoryをベースにして同期処理などを取る仕組みを創る事にした。

という事、細かい部分に入りながら、地道な改良を始める

とりとめもない、自分のメモ、、、

Peace!!

0 件のコメント:

コメントを投稿