3.Categories Of Mechanistic Patterns
細粒化で与えられたように、構造パターンは他を犠牲にした財産のコラボレーション最適化であり、何を最適化したいかという基本にのっとりパターンを分類することができる。 我々は、リアルタイムおよび組み込みシステムの開発について役に立つデザインパターンに注目しているので、ここで論じされたパターンを以下のカテゴリーに落とし込んでみる。
・ 資源管理
・ 平行性
・ 配分
・ 安全性、信頼性
・ 再利用とソフトウェア品質パターン
・ 反応パターン
これらのカテゴリーは互いに排他的ではなく、完全なリストでもない、しかし最適化を試みる基本的なQoSアスペクトの原則にのっとったパターン分類をする便利な方法を提供する。同様にこれらのカテゴリーに落とし込むアーキテクチュラルパターンもあるということはここで述べるべきではない。読者はこれらのパターンがより詳細に言及されることに興味があるのである。
3.1 Resource Management
リアルタイムおよび組み込みシステムおいて要求される最も重要な最適化の種類の一つは、資源利用の正確な管理と最適化である、ここでいう資源はメモリやCPU、ハードウェア、ハブであろうとなかろうと。資源またはより貴重な資源の例はReal-Time UML Profileに以下のように定義されている。
“効果やQoSのものさしを我々が表現するための、一つないしは複数のサービスを提供するランタイムの存在である。”
リアルタイム文献の大きな一部は実際、資源における与えられたサービス品質がクライアントの要求に合っているかを証明されることができるかを保障することに専心することである。
基本的な資源のアスペクトは、資源というものは有限であり、いくつかの方法に強制されているということである。ハードウェアにおいてもっとも平凡な資源といえばもちろんメモリである。メモリ使用を扱うパターンはたくさん存在する。[7]はいくつかの明確なメモリ使用まわりについてのパターンを提供する。それが以下である。Refference Counting Pattern,Fixed Allocation Pattern,Pooled Allocation Pattern, Garbage Compactionなどのさまざまな割り当てスキーマ。[3]はいくつかのメモリ使用まわりの資源管理パターンを提供する(よりアーキテクチャの範囲の方面になってしまうが)、またデッドロックを回避するためのCritical Section,Simultaneous Locking,Orderd Locking Patterns などのような優先権相続および優先権の転換やほかのパターンを含む、同時発生の環境における資源分配のためのパターンも提供する。
図7-5は、smart pointer patternという単純なアクセスパターンを示している。ポインタはたくさんの明確な特質をもっている、しかし低レベルで基本的であり、プログラミングのエラーになりがちな様相である。メモリのトラックの喪失(メモリリーク)、使用済みのメモリに対するアクセス(ダングリングポインタ)および、初期化未処理時におけるポインタの使用(アンイニシャライズドポインタ)はとても起こりやすい。これらの問題は以下の理由で起こる。ポインタは使用における不変の前提条件をもつが、基本的な文字であり不変であることを証明しようとする意味を持っていない。Smart Pointer Pattern[3,7]はポインタをコンストラクタ及びディスタクタを含むオブジェクトやオペレーション内につくり、これらの前提条件が効果的な状態であり続けることを証明するために実行する。ターゲットオブジェクトのメモリの返還要求が安全なとき(リファレンスカウントが0のアクセスポウンタに減少したとき)、ターゲットオブジェクトのリファレンスカウント属性が同一視される。
3.2 Concurrency
平行性はもちろんリアルタイムシステムにおける重大なアスペクトであり、その管理は決してささいなことではない。平行性についての論点には[13,14,15]のような優れた言及があるが、めったにper seのパターンとして表現されない([3]は例外である)。
平行性における初歩の論点は、全体の性能かまたは(及び)予定可能性である。
パフォーマンスにおいては我々は与えられた時間において、できるだけ多くの計算と行動の実行を行うシステムの能力、つまりより優れた性能を意味する。スケジューラビリティにおいては、タスク読み込みを無視したタイムレスな要求を対処するシステムの能力を意味する。このようなタイムレスな要求は標準的にデッドラインという言葉で言い表される、しかしそれが結ういつ考えられる標準ではない[2,15]。平均実行時間は通常、ソフトリアルタイムシステムとよばれる最適化の標準であり、その臨時的な遅延と一定の計算ミスは無視される。ハードリアルタイムシステムにおいて最適化の標準は、すべての計算はデッドラインとよばれる明確で静的な制約のもとで実行されるというものである。
文献における平行性パターンは2つの領域に絞られる傾向にある。一つ目は、Interrupt Pattern,Guarded Call Pattern,Message Queing Pattern[3]、または散発するタスクのスケジューラビリティを能率よく利用するメカニズム[14,15]などのようなスケジューリングポリシーである。二つ目の領域はブロッキングの制限と、優先権の転置の処理をしなければならない。これらのパターンは上で述べたようなリソースパターンと一部重複する。なぜなら基本的なブロッキングの発生原因は平行状態における資源の独占であるからである。
Guarded Call Patternは図7-6に示される。太線で区切られたクラスはアクティブで、
それらはOSのスレッドのルートであることを意味する。図の中の入れ子になっているクラスに見られるような構成経由(道)を含むオブジェクトはそれらの混合するアクティブなオブジェクトのスレッドの中を走っている。このパターンは、異なるスレッドの中を走るクラスの、境界を横切った直接呼出しを許可します。データの確実性を保障するため、保護されなければいけないデータやサービスを含む分配された資源は、1回のアクセスにたかだか1人のクライアントがアクセスするということを保障する相互排他シグナルを関連付ける。境界線のオブジェクトは、あるサーバーのオペレーションが資源を操作するということを訴えるために、クライアントに公開の外見を与える。もし分配された資源がロックされているときにクライアントがサーバーオペレーションに呼びかけようとしたら、OSが資源が利用可能になるまで保留する。
3.3 Distribution
分配は今日における多くの複雑なリアルタイム及び組み込みシステムにおいて重要である。”分配”において我々は、多様なアドレス空間にまたがって存在するコラボレーションオブジェクトの分離を意味する。分配パターンは多様であるが、その到達点は、オブジェクト間のコミュニケーションをできるだけ効率よくする一方で、その分離をできるだけ明白にすることである。この領域における多様なパターンは[1,4,16]のようなアーテキテクチャであるが、同様に、多くのより小さなパターンが適用される。
分配はしばしば2種類のタイプに分けられる。一つはアシンメトリック(非相称)と言い、オブジェクトの場所が設計時間によって決められることを意味する。他方はシンメトリック(相称)といい、ここではランタイムのメカニズムが、ランタイムのコンディションにより潜在的に違った場所にあるオブジェクトを読み込み、実行する。アシンメトリックは確かに全体的に複雑性は低いが、柔軟性の不足が問題である。例えば、もし設計中にそれぞれのオブジェクトが一つのプロセッサに専念していたら、様々なプロセッサ間で均衡の取れた動的ロードを行うこと不可能である。一方アシンメントリックの単純さは魅力的である。アシンメトリック分配における基本的な問題点は相違なるサービス品質(名前を挙げるとしたらスループットや、信頼性のただ二つ)を最大化するためのメッセージの送信に使われる様々なプロトコルと、分配が生み出す設計者やプログラマのため明白さのパターンである。[4.6]のようなオブザーバパターンは分配における一般的な基礎である。なぜならそれはサーバとクライアント間のコミュニケーションを簡易にするからである。
図7-7はプロキシやブローカのような多様な分配パターンから極めて単純なオブザーバパターンを示している
オブザーバパターンはサーバにおける値の交換の際のクライアントのリスポンスタイムの最適化を行う。もしクライアントがとりわけ遅い値交換でサーバに繰り返しアクセスしたら、多大なCPU(状況によってはバス)を費やすであろう、例え処理が完成しなかったとしても。オブザーバパターンはコンクリートクライアント(アプリケーションクライアントクラス)がコンクリートサーバ(アプリケーションサーバクラス)に寄付することを許可する。サーバがクライアントに値交換する際に知らせるために、Notification Handle(論理的アドレスやそのようなもの)になりすます(うまく行う)。
3.4 Safety and Reliability
安全性と信頼性はリアルタイム、組み込みシステムにおいて重要なサービス品質のカテゴリーである。安全性はアクシデントや損害がないことを言及し、信頼性は計算がうまく完了する可能性をs召している[2]。これらは重大に相違であり、別個のものである一方、双方に対し、いくつかの根本的なデザインパターンが扱われている。安全性と信頼性は、アーキテクチャと詳細デザインの二つのレベルに処理される傾向にある。[2,17,18,18]が論点や様々な基本的な解決策について論じている間に、[3]はこの目的に対するいくつかのアーキテクチャパターンを提供する。これらはper seパターンの方式の特色ではないが。
このジャンルにおけるパターンでは主として、普遍とよばれるもの(つまり常に真であるもの)の違反と、このような違反が検出されたときに当てられる動作が焦点とされる。
信頼性パターンでは、これらは完全に内在的である傾向である。つまりそれらは、頽廃(たいはい)や、明らかに不適当な結果を探す。これが図7-8に見られるようなRedundant
Storage Patternの目的である。ヌメリックベーシスクラスは、ECGマシンにおける心拍数や衛星の偏揺れのような数字データのサーバの根本的な構造を与える。根本的な値の属性のタイプは後の明細に延期する。このパラメータクラスは二つの違った種類の冗長のサブクラスに分けられる。この基本的な形式は値を2回記憶する、1回目は正規型で、もう一回は補数である、そしてset()が呼び出されたとき、どちらかが両方セットされ、get()がよびだされたとき、他方をチェックする。もし値が頽廃したら、これは同一視される。コンプリメントまたはCRCクラスがサブクラスだったらbothではなくeitherを記録しなさい。それは二つの関係の間の排他的論理輪演算の制約を意味する。
一方安全性パターンは、システムが実世界で何を処理しているかという観察と、何をするべきかという予測を比較する傾向がある。これは動作コントロールにおいて使われているものと区別されたセンサーを、誤動作の独立を保障するため必要する、これはしばしばアーキテクチャレベルで行われるが、図7-9が示すように、同様に抽象概念の構造的レベルにおいても行われる。
このパターンのコンセプトは、Actuation ControllerはActuation actorに命令を出すことによって、実世界に影響を及ぼすということである。この動作が患者に投与される薬物の量や、工業プレスの圧力等を制御する。計算のつながり中や、動作ハードウェア自身におけるエラーが、安全でない状態を引き起こす可能性がある。Actuation Monitorはアクチュエーションが何をプロセスコントラーラに対しての関連経由にするかを告げられる。
それは、調和が予測されたこと(実験では、モニターあるいはプロセス・コントローラーは計算動作遅れおよび測定不正確をとりいれなければならない)に十分近いことを証明するために、物質的なプロセスを監視するための独立したセンサーを用いる。そのパターンはsingle-point failure safetyを供給する。もしActuation Controllerが失敗したら、Actuation Monitorがそれを見つけ、Process Controllerが適切で安全な動作を呼び出す。
一方、もしActuation Monitorが失敗したら、その動作は正確に続けられる。
3.5
Reuse
and Software Quality Patterns
リアルタイム及び組み込みシステムは、伝統的なITソフトウェアは再利用性、正確性、携帯性、単純性などといった非時間的なサービスの品質をもっている、というまったく同じ論点を持っている。実質的にはそのパターン全てが同様に、リアルタイムシステムのために働くこれらの品質のために定義した。[6]はそのようなパターンの伝統的な言及であるだろう。たとえば[6]のようなAdapter Patternはあるひとつのクラスのインタフェースが要求に合わなかったときインピーダンスマッチング(信号源インピーダンスと負荷インピーダンスが複素共役の関係になるよう調整すること。)を行う。これは高質のテストされたクラスが新しい状態で再利用されることを可能にする。望まれたインタフェースと現実のサーバクラス(またはそのインタフェース)の両方にサブクラス化をするアダプタを提供することによりこれを行う。それからサブクラス化されたrequest()オペレーションはオリジナルのオペレーション(specificRequest())を呼び出すために特殊化される。
3.6
Reactive
(behavioral) patterns
細粒化パターンにおける最後のカテゴリは行動パターンである。行動パターンの[6]は、コラボレーションの作用を制御したり容易にするために、どのように構造的要素(クラス)を付加すればよいかを定義する。コマンドパターンは、相互オブジェクトメッセージ自身がクラスに抽象化されるこのときのように一度きりである。State Pattern(ibid)はオブジェクトステートマシンの実行の制御の方法として、クラスのハイレベルステートをクラスそれ自身に具象化する。
[2]は違った行動パターンの種類を提供する。それは集合的にステートパターンとして言及される、違った行動に関する利益を成し遂げるためのさまざまな方法のステートチャートの組織である。これらのパターンは他のオブジェクト(Rendezvous State Pattern)との振る舞いの同調や、イベントやステートの発生記録(Latch State Pattern)などの違った種類の行動に関する効果を得るためのステートチャートを組織するための一般的な方法を定義する。図7-11はPolling State Patternというオブジェクトが周期的な動作の時刻、データの獲得、データプロセッシング、データフィルタリングまたはマニピュレーション(操作)に対してレスポンシブルであるときに使われるパターンを示している。上側のアンド(論理和?)ステートはデータマニピュレーションを実行する。一方で下側のアンドステータスは周期的投票に対してリスポンシブルである。一度それがデータを得たら、それは新しいイベント(GEN(DataReady))を作成し、それは次に来るデータを処理するためトップアンドステートにより費やされる。