システムの初期化やモジュール間通信の停止についての情報は、ソフトウェアコンポーネント 間で伝達され、その情報に基づき、各ソフトウェアコンポーネントは生存を続けるか初期化を 行なうかを判断する。
! " # $ % & '
% ( ) * + , - . /0 1 & # $ % & '
2 3
4 54
4 4
4 4
67 8 9 6:;< = 7 ><
?@ A B = < C > 8 7 = D 7 C < C > E E FG 7 A H
67 8 9 6 = 7 A @6< ;< = 7 >< = 7 A @ 6<
I J < 6<>7 C E
K L E
M67 8 9 6N K L E
M;< = 7 >< N
8 7 = D 7 C < C > E
E FG 7 A H 8 7 = D 7 C < C > O
O FG 7 A H
PL E QR E
S TU V WX Y Z [ \ WX X U ] T^Z U Y X U _ Y \ W_T`Y Z [ \ WX X U ] T^Z U Y X U _ ab c >7 7 6
>7 7 6
ad c ad `e c
ad `f c
図9: オブジェクト間通信
3.4. 要求条件実現のための機構 29
3.4.1 シングルモジュールとマルチモジュールでのオブジェクト間通信
モジュール内とモジュール間のソフトウェアコンポーネント間通信を効率的に扱うことのできる モジュール間通信機構が必要である。
ソースファイルは、図9 (a)と(b)に示されるように、実行ファイルにマッピングされる。
シングルモジュール環境では、コンポーネント間は、コンポーネントのヘッダファイルから自動 的に生成されたインタフェースルーチンとジャンプテーブルの組合せにより結合される。
CORBAを使う場合は、IDL定義を元にスタブとスケルトンが生成される。スタブとスケルトン
はORBを経由して結合される。その結果、ことなるモジュールにインストールされたコンポーネ ントは互いに通信可能となる。宛先オブジェクトが同じモジュールにある時、スタブとスケルトン によりアクセスされる。しかし、ORB通信機構はスキップされる。
3.4.2 シングルモジュールでのオブジェクトの配置
シングルモジュール環境において、ORB経由の通信は不要である。
ソフトウェアコンポーネントは、ORB機構を使わずにインストールされるべきである。理想的な 形態は、元の一つのソースコードから、シングルモジュール用とマルチモジュール用のオブジェク トインプリメンテーションが、ツールによって自動的に選択生成できることである図 9 (b-2)。
このバインド機構は、システムの高性能化をもたらす。
3.4.3 モジュール間でのオブジェクトリファレンスの変換
宛先のオブジェクトリファレンスは、ORBによってオブジェクト識別子に変換される。オブジェ クト識別子は3つのサブフィールドを持つ。
1つ目は、宛先コンポーネントが呼出元モジュールの中にあるか、外側にあるかを示し、内部の場
合は0、外部の場合は宛先モジュール番号を表す。
2つ目は、ORBの識別子であり、モジュール内に複数のORBが存在する場合の識別用である。
3つ目は、宛先コンポーネントの番号を示す。この番号により、宛先ORBにより、スケルトンが 決定される。
この変換機構は、第3.4.4章において示されたシステム拡張機能に対して効果的である。
3.4.4 システム拡張
新しいコンポーネントのインストール、および、既存コンポーネントの移動は、いずれも重要で ある。
上述の宛先情報を修正することによって、オブジェクトインプリメンテーション(ソフトウェアコ ンポーネント)は移動させることができる。
同じく、新しく作られたコンポーネントのロケーション情報を追加することにより、新たなコン ポーネントをインストールすることができる。
!"
#$
%&
'
(
&
(
$) " #
#$($
!"
# $ &
(* + *
(# & $"
(* + *
(# & $"
(* + *
(# & $"
図10: モジュール間通信機構
ロケーションの修正のために、CORBAのダイナミックインボケーションインタフェースを使う ことができる。新しいコンポーネントをインストール祭に、ダイナミックインボケーションインタ フェースが呼ばれる。メモリエリアが割り当てられ、プログラムコードとデータがロードされる。そ して、オブジェクトリファレンス情報は修正される。
他のコンポーネントとリンクされる前に、新しいコンポーネントの初期化を行なう。初期化処理 の中では、データの初期化、ハードウェア関する状態の設定、新たなプロセスやスレッドの生成が 行なわれる。
他のコンポーネントへの、新コンポーネントの追加の通知も必要である。
3.4.5 呼救済
第3.3.2章(4)で述べたように、呼救済は、各オブジェクトインプリメンテーション(ソフトウェ
アコンポーネント)によって主に実行される。
図11に示すように、各コンポーネントは、それぞれにC++クラス、インスタンス、タスク(プ ロセスやスレッド)およびコールデータを持っている。
本ソフトウェア構造において、1つの呼処理イベントは1タスクにより実行される。タスクは、
C++クラスのコードを実行し、その中でコールデータへの読み書きが行なわれる。
モジュールが再起動される時、コールデータ以外のテンポラリなデータは全て消去される。
再起動の後、呼救済クラスはコールデータに残された情報によって、どの呼を救済すべきかを判 断する。
そして、クリアメッセージによって、安定状態にない呼は切断される。