【実施例】
【0021】
以下、この発明の一実施例に係る通信機器を説明する。
図2に示す通信機器1は、エンドユーザ宅に設置されるホームゲートウェイ(Home-Gateway:HGW)として構成されている。通信機器1には、LAN(Local Area Network)とWAN(Wide Area Network)とを相互接続するルータとしての機能の他に、例えば、IP(Internet Protocol)電話サービスの加入者側対応装置として各種呼制御に関する諸機能、VPN(Virtual Private Network)機能、Java(登録商標)機能などが搭載される。
【0022】
通信機器1は、1つ以上のスタティックリンクライブラリ11を含むプラットフォーム10と、プラットフォーム10上に構築された仮想マシン20と、仮想マシン20上で動作する1つ以上のソフトウェア21とを備える。
【0023】
プラットフォーム10は、仮想マシン20が動作するための基盤として機能し、中央演算処理装置(CPU)、揮発性メモリ装置、不揮発性メモリ装置、LANポート、WANポートといったハードウェア資源と、ハードウェア資源を直接に制御するファームウェア、OS(Operating System)といったソフトウェア資源によって構成されている。
【0024】
スタティックリンクライブラリ11は、静的リンクによって利用するよう想定・設計されたライブラリファイルからなる(以下、「SLL11」と呼ぶ。)。SLL11は、例えば、C言語の汎用的な関数ライブラリである。
【0025】
仮想マシン20は、プラットフォーム非依存性の仮想的な実行環境を構築し、その上でソフトウェアを実行する。具体的には、仮想マシン20は、所定のオブジェクト指向言語で記述されたソフトウェアの中間コードをプラットフォーム10の実行環境に応じたネイティブコードに変換する。
【0026】
実施例の仮想マシン20は、プラットフォーム10をネイティブ(Native)領域としたJava仮想マシン(JVM)になっている。
【0027】
ソフトウェア21は、Native領域のSLL11等のライブラリを仮想マシン20上から利用するアプリケーションソフトウェアになっている。ソフトウェア21は、Javaアプリケーションバンドルになっている(以下、「利用バンドル21」と呼ぶ。)。
【0028】
プラットフォーム10は、他からの命令に応じてメモリ確保及びメモリ解放を実行するメモリ管理モジュール12を有する。メモリ管理モジュール12は、
図3に示すように、各SLLとメモリ情報を対応付けて一覧にしたライブラリ一覧テーブル13(以下、「ライブラリ一覧13」と呼ぶ。)に基づいて、メモリのネイティブ領域を管理する。ライブラリ一覧13は、揮発性メモリ装置に保持される。メモリ情報は、SLL用に確保されたメモリのネイティブ領域を示す情報である。ライブラリ一覧13は、利用バンドルからのSLLの参照が外れた後に、当該SLLに対応したメモリ情報を解放する際にどのメモリ領域を解放するかを参照するためのものである。
【0029】
SLL用に確保されたメモリは、
図2に示すように、仮想マシン固有領域22と、OS固有領域23とからなる。仮想マシン固有領域22は、仮想マシン20上で動作するアプリケーションソフトウェアの各種オブジェクトを格納する領域である。OS固有領域23は、仮想マシン20自身が使用する領域であり、OS上で直接実行可能なライブラリを実行する際に使用する領域となる。すなわち、SLL用に確保されたメモリのネイティブ領域は、OS固有領域23内に存在する。実施例の場合、仮想マシン20がJVMからなるので、Javaオブジェクトの格納に使用するJavaヒープが仮想マシン固有領域22に含まれ、OSネイティブのライブラリの実行に使用するCヒープがOS固有領域23に含まれ、前記メモリ情報は、ポインタによって表される。メモリ管理モジュール12は、メモリから返却されたメモリ情報(ポインタの値)を
図3に示すライブラリ一覧13に登録し、また、メモリ解放の対象となったメモリ情報をライブラリ一覧13から削除する更新処理を行う。
【0030】
また、
図2に示すように、仮想マシン20は、制御バンドル24を有する。制御バンドル24は、利用バンドル21の起動や停止などのライフサイクルに関した制御を行う。
【0031】
また、通信機器1は、仮想マシン20で起動すべきソフトウェアが規定された一覧25を備える。一覧25は、
図4に示すように、通信機器1自体又は仮想マシン20自体が再起動した際、通信機器1の状況に合わせて起動するべきバンドルの一覧テーブルになっている(以下、「起動バンドル一覧25」と呼ぶ。)。起動バンドル一覧25は、バンドルの増減を知る以外に、バージョンの変更も検知するための情報を保持している。起動バンドル一覧25は、不揮発性メモリ装置に保持される。通信機器1の状況変化に応じた仮想マシン20の自動処理により、起動すべきバンドルを変更する起動バンドル一覧25の更新が実施される。
【0032】
制御バンドル24は、起動させるバンドルを起動バンドル一覧25に基づいて決定する。
【0033】
また、
図2に示すように、仮想マシン20は、ガベージコレクタ26を有する。ガベージコレクタ26は、他から参照されていない仮想マシン固有領域22のオブジェクトを自動的に、又は他から命令を受けて削除する。
【0034】
制御バンドル24は、利用バンドル21に関連した依存関係の更新の際にガベージコレクタ26を強制起動させる制御手段としてCPUを機能させるためのプラグラムも含んでいる。
【0035】
利用バンドル21は、自己に関連した依存関係の更新の際、自己で参照中のSLL11用に確保されたメモリのネイティブ領域を解放させるメモリ掃除機能27を含んでいる。メモリ掃除機能27の処理内容は、利用バンドル21のソースコードに記述されている。
【0036】
メモリ掃除機能27は、利用バンドル21に対して削除又は停止の命令が与えられたことを契機として、メモリ管理モジュール12に対し、利用バンドル21の名前(スタティックリンクライブラリ名)を通知すると共に対応のメモリ情報の削除命令を出すことにより、参照中のSLL11用に確保されたメモリのネイティブ領域を解放させるメモリ操作手順をCPUに実行させる。
【0037】
また、メモリ掃除機能27は、利用バンドル21に読込命令が与えられたことを契機として、利用バンドルによって利用されるSLL11の読込成功まで、SLL11用に確保されるべきメモリのネイティブ領域を解放させる処理を繰り返す。
【0038】
制御バンドル24に関する具体的な処理内容を
図5に示す。先ず、制御バンドル24は、仮想マシン20の起動後、CPUに常駐する(開始)。制御バンドル24は、利用バンドル21に関連した依存関係の更新契機となる所定のイベントを取得する(S1)。所定のイベントとして、起動するべき利用バンドル種別の変更、又は利用バンドルの再起動の発生が設定されている。イベントを取得する方法は、サービスを利用する方法等が存在するが、特に限定されない。イベントの発生に伴い、起動バンドル一覧25におけるバージョン情報、起動すべきバンドルの変更が、仮想マシン20によって行われる。
【0039】
制御バンドル24は、(S1)でイベントを取得すると、変更後の起動バンドル一覧25を取得し(S2)、依存関係の更新命令を仮想マシン20に出すことにより、利用バンドル21の削除、停止、SLL11の新たな結合相手とする利用バンドル21のインストールや起動を仮想マシン20に実行させる(S3)。仮想マシン20がJVMからなる場合、利用バンドルに関連した依存関係の更新は、「PackageAdmin.refleshPackage()」によって実行させることができる。この更新命令後、制御バンドル24は、ガベージコレクタ26を強制起動させるための命令を仮想マシン20に出す(S4〜S6)。これにより、当該更新に伴うサービス停止によってリソースに余裕ができたタイミングでガベージコレクタ26を起動させることができる。ひいては、可及的速やかに仮想マシン固有領域22から不要なオブジェクトを削除し、当該領域でのメモリ不足によって利用バンドル21の起動ができない事態を防ぐことができる。
【0040】
ここで、制御バンドル24は、(S4)〜(S6)により、ガベージコレクタ26の強制起動を規定回数nだけ実施した後、変更後の起動バンドル一覧25と、仮想マシン20の処理対象になっている各ソフトウェアのライフサイクル状況とを取得する(S7、S8)。仮想マシン20がJVMからなる場合、ライフサイクル状況は、「Bundle.getState()」の実行により、仮想マシン20上で動作中の全てのバンドルについて夫々のステータス状態が記述されたリストとして出力される。例えば、起動中のバンドルには、ステータス状態として「ACTIVE」が記述され、起動中でないバンドルには、その状態に応じて「INSTALLED」、「RESOLVED」、「STARTING」、「STOPPING」といった記述がなされる。
【0041】
制御バンドル24は、(S7、S8)で取得した起動バンドル一覧25及びライフサイクル状況間の一致性を判断する(S9)。ここで、制御バンドル24は、一覧25で特定された起動すべき全てのバンドルと、ライフサイクル状況の中でステータス状態が起動中(例えば、仮想マシン20がJVMからなる場合は「ACTIVE」)の全てのバンドルとが完全に一致する場合、一致すると判断し、それ以外は、不一致と判断する。
【0042】
制御バンドル24は、(S9)において、判断結果が不一致の場合、(S4)〜(S9)の処理を繰り返し、一致の場合、処理を終了する。これにより、前述の仮想マシン固有領域22のメモリ不足による起動失敗を確実に防止することができる。
【0043】
メモリ掃除機能27、メモリ管理モジュール12に関する具体的な処理内容を
図6、
図7に示す。先ず、メモリ掃除機能27は、利用バンドル21の起動により、仮想マシン20上で動作する状態となる(開始)。メモリ掃除機能27は、仮想マシン20からライフサイクル制御用の命令が与えられるまで待機している(S21)。対象の命令は、仮想マシン20がJVMからなる場合、「uninstall」、「stop」、「install」、「start」になる。
【0044】
メモリ掃除機能27は、仮想マシン20から利用バンドル21に削除(uninstall)又は停止(stop)の命令が与えられた場合(S22)、利用バンドル21で参照中のSLL11用に確保されたメモリのネイティブ領域を解放させるための命令をメモリ管理モジュール12に出す(S23)。これにより、利用バンドル21が終了する。
【0045】
メモリ管理モジュール12は、利用バンドル21から取得したライブラリ情報からSLL11を特定し(S31)、ライブラリ一覧テーブル13からSLL11のスタティックリンクライブラリ名に対応のメモリ情報を取得し(S32)、当該メモリ情報に該当するメモリのネイティブ領域を解放する命令を揮発性メモリ装置に出し(S33)、処理を終了する。
【0046】
利用バンドル21は、(S22)において、仮想マシン20から自己にロード(install)又は起動(start)の命令が与えられた場合、SLL11の読込(ロード)を実施する(S24)。仮想マシン20がJVMからなる場合、「System.loadLibrary」の実行により、読込が実行される。メモリ掃除機能27は、SLL11の読込に成功したか否かを監視する(S25)。
【0047】
メモリ掃除機能27は、(S25)において読込に成功した場合、これを取得した場合、処理を終了する。なお、メモリ管理モジュール12がメモリ確保に成功した場合、メモリ管理モジュール12からスタティックリンクライブラリ名を返されるので、この通知をもって読込成功と判断し、処理を終了するようにしてもよい。
【0048】
メモリ掃除機能27は、(S25)において読込に失敗した場合、利用バンドル21によって利用されるSLL11の読込成功まで、SLL11用に確保されるべきメモリのネイティブ領域を解放させるための命令をメモリ管理モジュール12に出す(S24〜S26)。これを受けてメモリ管理モジュール12は、(S31)〜(S33)を実行する。なお、(S25)において、メモリ掃除機能27は、メモリ管理モジュール12からエラー通知、タイムアウト等によって読込に失敗したと判断する。
【0049】
このように、メモリ掃除機能27は、(S24)〜(S26)の処理を(S25)において読込に成功するまで繰り返す。これにより、更新前からSLL11用に確保されているメモリのネイティブ領域解放が失敗していても、新たに起動される利用バンドル21のメモリ掃除機能27がSLL11の読込に成功するまでSLL11用に確保すべきメモリのネイティブ領域解放を行うため、当該利用バンドル21を確実に起動することが可能となる。
【0050】
以下、通信機器1の動作例を
図1、
図8に基づいて説明する。先ず、同図中に記載の制御バンドル24の処理に関する「起動バンドルが変化」の想定例について説明する。通信機器1は、通信事業者Aと通信事業者Bに対し、同じ初期設定で出荷される。仮想マシン20は、JVMになっている。通信事業者Aは、A地域をアクセス網提供サービスの事業エリアとする。通信事業者Bは、A地域と異なるB地域をアクセス網提供サービスの事業エリアとする。通信事業者A及び通信事業者B間には、通信機器1を利用して提供するサービス内容に差異がある。
図8に示すように、通信機器1には、AB判定バンドル31、Aエリアバンドル32、Bエリアバンドル33、利用バンドル21、A単独バンドル34、B単独バンドル35が搭載されている。Aエリアバンドル32は、A単独バンドル34及び利用バンドル21を利用するものとされ、A単独バンドル34は、通信事業者Aのみが提供するサービス機能を追加するためのものとなっている。Bエリアバンドル33は、B単独バンドル35及び利用バンドル21を利用するものとされ、B単独バンドル35は、通信事業者Bのみが提供するサービス機能を追加するものとなっている。利用バンドル21は、通信事業者A、B間で同じ基本的機能を実現するためのものとなっている。通信機器1が物理的にアクセス網に接続された後、通信機器1自体が初めて起動されたときに起動すべきハンドルは、AB判定バンドル31及び利用バンドル21に定められている。
【0051】
その初回起動時、利用バンドル21は、SLL11を以前に参照したものがないため、確実に起動する。すなわち、
図1に示すように制御バンドル24を経て、利用バンドル21の起動の際、メモリ管理モジュール12により、SLL11用にメモリのネイティブ領域が確保され、返却されたポインタがライブラリ一覧13にメモリ情報として記述される。
【0052】
また、初回起動時、AB判定バンドル31は、通信機器1が通信事業者A又はBのいずれに接続されているかを判定し、その判定結果に応じて、Aエリアバンドル32又はBエリアバンドル33のいずれを使用するかを決定する。Aエリアバンドル32に決定した場合に起動すべきバンドルは、Aエリアバンドル32、A単独バンドル34及び利用バンドル21と定められている。Bエリアバンドル33に決定した場合に起動すべきバンドルは、Bエリアバンドル33、B単独バンドル35及び利用バンドル21と定められている。いずれに決定された場合でも、初回起動時から起動すべきバンドルが変化することになり、AB判定バンドル31は、起動バンドル一覧25を更新する。この変化が同図中の「起動バンドルが変化」の想定例である。この想定例では、仮想マシン20において、利用バンドル21に関連した依存関係の更新が発生するため、利用バンドル21を一旦停止させ、その更新後にAエリアバンドル32又はBエリアバンドル33と共に利用バンドル21を再び起動させることが必要になる。
【0053】
次に、
図1中に記載の利用バンドル21の処理に関する「更新」の想定例について説明する。この想定例は、利用バンドル21を新しいバージョンに更新することである。この想定例では、新バージョンの利用バンドル21がダウンロードされると、起動バンドル一覧25に新規登録される。起動すべきバンドルは、旧バージョンの利用バンドル21に代わって新バージョンの利用バンドル21となるように定められている。新バージョンの利用バンドル21を起動するには、利用バンドル21に関連した依存関係の更新が発生するため、既に起動している旧バージョンの利用バンドル21を停止させ、依存関係の更新後に新バージョンの利用バンドル21を起動させることが必要になる。以下、
図5〜
図7のフローチャートに対応のステップ符号を適宜に示す。
【0054】
図1に示すように、前述の「起動バンドルが変化」又は「更新」のいずれかの発生により、利用バンドル21に関連した依存関係の更新が発生した際の動作は、次のようになる。なお、メモリのネイティブ領域のメモリ解放、ガベージコレクションに1回で成功した例で説明する。先ず、「起動バンドルが変化」又は「更新」が発生すると(S1)、起動すべきバンドルに変更が生じ、制御バンドル24は、その変更後の起動バンドル一覧25を取得する(S2)。
【0055】
次に、制御バンドル24は、利用バンドル21に関連した依存関係の更新を仮想マシン20に命令する(S3)。これを受けて仮想マシン20は、利用バンドル21に削除又は停止を命令する(S21)。これを受けて利用バンドル21のメモリ掃除機能は、SLL11用に確保されたメモリのネイティブ領域の解放をメモリ管理モジュール12に命令する(S22、S23)。これを受けてメモリ管理モジュール12は、ライブラリ一覧テーブル13からSLL11に対応のメモリ情報を取得し(S31、S32)、C言語の「Free()」の実行により、揮発性メモリ装置に当該メモリ情報に対応した領域のメモリ解放を命令する(S33)。これにより、SLL11用に確保されたメモリのネイティブ領域が解放される。通常、メモリ解放に成功するので、新たに起動する利用バンドル21のメモリ掃除機能27によるメモリ解放処理には至らない(S22、S24〜S26)。
【0056】
また、制御バンドル24は、依存関係の更新を命令したことを契機として(S3)、仮想マシン20にガベージコレクタ26の強制起動を命令する(S4)。これを受けてガベージコレクタ26がガベージコレクションを実行する(S5〜S6)。これにより、依存関係の更新前から利用バンドル21用に確保されている仮想マシン固有領域22内の領域が解放される。解放成功を確認した制御バンドル24は、ガベージコレクタ26の強制起動を終了する(S7〜S9)。なお、強制起動の規定回数nは、5回程度に設定するとよい。
【0057】
また、仮想マシン20は、新バージョンの利用バンドル21のロード、又は停止した利用バンドル21の起動をするための処理を開始し、当該利用バンドル21用に仮想マシン固有領域22内の領域を確保する。
【0058】
次に、仮想マシン20は、新バージョンの利用バンドル21にロード、又は停止した利用バンドル21に起動を命令する。これを受けた当該利用バンドル21は、SLL11の名前通知と読込命令をメモリ管理モジュール12に出す。これを受けてメモリ管理モジュール12は、C言語の「malloc()」の実行により、当該必要なネイティブ領域の確保を揮発性メモリ装置に命令する。これを受けて揮発性メモリ装置は、対応のOS固有領域23内に領域を確保し、SLL11の読込に成功し、メモリ管理モジュール12にポインタを返却する。これを受けたメモリ管理モジュール12は、ライブラリ一覧13に、ポインタに基づいてSLL11に対応のメモリ情報を登録し、また、当該利用バンドル21にSLL11の名前を通知する。以後、利用バンドル21は、SLL11の参照成功を知り、起動を完了する。
【0059】
通常、ここまでの処理に比べて、ガベージコレクタ26が5回程度のガベージコレクション実施を完了するまでに時間を要する。したがって、制御バンドル24は、規定回数の実施完了後、起動バンドル一覧25と、ライフサイクル状況とを取得し、その一致性を判断することになり、次の規定回数の実施に至らない。
【0060】
この発明の技術的範囲は、上述の実施形態や実施例に限定されず、特許請求の範囲の記載に基く技術的思想の範囲内での全ての変更を含むものである。