プロセス構造、スレッド構造、モジュール構造、これらの設計をしっかりできるITエンジニアは多くありません。
設計にも実装にも広範な知識と深い思考力が必要だからです。その勘所を伝えるための記事です。
プロセス、スレッド、モジュール
プロセス構造、スレッド構造、モジュール(プロジェクトによっては「機能」「制御」など)構造をどうやって決めるか?
この3つは関係が深くて出来上がるときは3つ同時に出来上がるものであり、しかも外部仕様を決めていく過程で、じんわりと決まっていくものなので、どうやって決定していくかを伝えるのは至難の業と言っていいでしょう。
本記事では、例を挙げてなるべく分かりやすく説明します。
例
今回の例は、センサーがいくつかあって、センサーを管理するサーバを考えます。
登場人物は、「センサー」「管理サーバ(今回の製品の例)」「ユーザ」とします。
プロセス構造
センサー類のインタフェースは沢山ありますが、今回はhttpだとします。センサーはクライアントであることが多いですが、今回はサーバとします。つまり管理サーバ側はhttpクライアントとします。
※実際にhttpをインタフェースに持つセンサーは少数派だと思いますが、MQTTとかはIoTの人しか知らないので例としては不適当と思いました。
また、ユーザに対してはhttpを通じてセンサーの状態を見せることにします。
ウェブサーバ自作は今回はやめといてApacheとします。
今回のApacheモジュールはインテリジェンスは持たず、DBの値を見て値を返すだけのものとします。
ということで、以下のようなプロセス構造になります。
スレッド構造
apacheの方のプロセス構造、スレッド構造は、workerでプール方式のマルチスレッドにします。(ここはあまり考えても得はないように思います。ちなみにpreforkがマルチプロセス、wokerがプール方式のマルチスレッド、eventがアクセスごとにスレッド作成するマルチスレッドです)
センサー側のhttpクライアントは多重にするのが自然です。センサー数百~数千などの単位でデータを収集するのであれば、httpクライアントをマルチスレッドにします。
ということで、スレッド構造は以下のようになります。
モジュール構造
プロセス構造、スレッド構造と密接につながりながらも微妙に異なります。
モジュール(機能、処理)は、機能ごとに割り当てるためです。1スレッドの中に複数スレッドがいることも普通にあります。
httpクライアントは、何かの計算をやってデータベースに格納することとします。
と、こういう感じであれば、以下のモジュールがあります。
- ユーザインタフェース(apacheのモジュール)
- 管理プロセスのメインスレッド
- センサー情報取得(httpクライアント)
- 計算モジュール
- データベース格納
ということで、モジュール構造は以下のようになります。
プロセス構造、スレッド構造、モジュール構造が微妙に異なるということは分かっていただけましたか?
プロセス構造、スレッド構造、モジュール構造は仕様を考えていく中で微調整しながら変えていきます。普通は外部仕様(基本仕様)が完全に決まったときに、プロセス構造、スレッド構造、モジュール構造が完全に決まります。設計者の腕の見せ所です。
まとめ
プロセス構造、スレッド構造、モジュール構造について説明しました。
コメント