(57)【要約】【課題】  複数のソフトウェア・モジュールからなるソフトウェア・システムを停止する際に、安全に各ソフトウェア・モジュールを停止する方法を実現する。【解決手段】  バンドル起動順リスト規定された起動された順番と逆の順番で、各ソフトウェア・モジュールを停止する。また、ソフトウェア・モジュールの静的な参照関係を木構造として表現したり、ソフトウェア・モジュールの動的な参照関係を木構造として表現したりして、深さ優先探索によって探索して得られた順番で、停止してもよい。【選択図】  図８
2006065462.tif 000002
【特許請求の範囲】
【請求項１】
複数のプログラム・モジュールからなるソフトウェア・システムにおいて、
プログラム・モジュールをソフトウェア・システムの起動後にソフトウェア・システムにインストールするインストール手段、
前記インストール手段によってインストールされたプログラム・モジュールを個々に指定し起動するプログラム・モジュール起動手段、
前記プログラム・モジュール起動手段によって起動されたプログラム・モジュールを個々に指定し停止するプログラム・モジュール停止手段、
ソフトウェア・システムの起動時におけるプログラム・モジュールの起動順序を規定しその順番にしたがってプログラム・モジュールを起動する起動順序制御手段、
ソフトウェア・システムの停止処理時にプログラム・モジュールの停止順序を規定しその順番にしたがってプログラム・モジュールを停止する停止順序制御手段を有することを特徴とするソフトウェア・システム。
【請求項２】
前記停止順序制御手段で規定される停止順番が、前記起動順序制御手段で順序付けられた起動順番の逆順であることを特徴とする請求項１に記載されたソフトウェア・システム。
【請求項３】
請求項１のソフトウェア・システムにおいて、
プログラム・モジュール間の依存関係を静的に定義する静的依存関係定義手段を有し、
前記静的依存関係定義手段によって定義されている静的依存関係を抽出し、抽出した依存関係から各プログラム・モジュールの依存関係を表す木構造を導出し、木構造を探索しながら他のプログラム・モジュールに依存しているプログラム・モジュールから停止する順番に前記停止順序制御手段で規定することを特徴とするソフトウェア・システム。
【請求項４】
前記停止順序制御手段おいて、導出される木構造の葉の部分に最小の重みをつけ、子ノードの持つ重みのうち最大のものに決められた量を加算した重みをつけ最小の重みを持つプログラム・モジュールから重みの重くなる順番に並べて停止順序を規定することを特徴とする請求項３に記載されたソフトウェア・システム。
【請求項５】
同じ重みを持つプログラム・モジュールは並行して停止することを特徴とする請求項４に記載されたソフトウェア・システム。
【請求項６】
請求項１のソフトウェア・システムにおいて、
プログラム・モジュールの持つ機能を他のプログラム・モジュールから使用するいわゆるサービスを管理するサービス管理手段と、
前記サービス管理手段に対してサービスを登録するサービス登録手段と、
前記サービス管理手段に前記サービス登録手段で登録されたサービスを検索してサービスを使用可能な形で取得するサービス取得手段と、
前記サービス管理手段に、サービスの登録元と使用先の組を問い合わせるサービス使用関係取得手段を有し、
前記停止順序制御手段において、前記サービス使用関係取得手段によって取得したサービス使用関係から各プログラム・モジュールのサービスの使用関係を表す木構造を導出し、木構造を探索しながら提供しているサービスを他のプログラム・モジュールから使用されていないプログラム・モジュールから停止する順番に前記停止順序制御手段で規定することを特徴とするソフトウェア・システム。
【請求項７】
前記停止順序制御手段において、導出される木構造の葉の部分に最小の重みをつけ、子ノードの持つ重みのうち最大のものに決められた量だけ加算された重みをつけ最小の重みを持つプログラム・モジュールから重みの重くなる順番に並べて停止順序を規定することを特徴とする請求項６に記載されたソフトウェア・システム。
【請求項８】
同じ重みを持つプログラム・モジュールは並行して停止することを特徴とする請求項７に記載されたソフトウェア・システム。
【請求項９】
請求項１から請求項８に記載されたソフトウェア・システムを実現するプログラムを格納した記憶媒体。
【請求項１０】
複数のプログラム・モジュールからなるソフトウェア・システムのソフトウェア停止方法において、
プログラム・モジュールを個々に指定し起動するプログラム・モジュール起動工程、
前記プログラム・モジュール起動工程で起動されたプログラム・モジュールを個々に指定し停止するプログラム・モジュール停止工程、
ソフトウェア・システムの起動時におけるプログラム・モジュールの起動順序を規定しその順番にしたがってプログラム・モジュールを起動する起動順序制御工程、
ソフトウェア・システムの停止処理時に、プログラム・モジュールの起動順序に応じた順番でプログラム・モジュールを停止する停止順序制御工程を有することを特徴とするソフトウェア停止方法。
【請求項１１】
複数のプログラム・モジュールからなるソフトウェア・システムのソフトウェア停止方法において、
プログラム・モジュールをソフトウェア・システムの起動後にソフトウェア・システムにインストールするインストール工程、
前記インストール工程でインストールされたプログラム・モジュールを個々に指定し起動するプログラム・モジュール起動工程、
前記プログラム・モジュール起動工程で起動されたプログラム・モジュールを個々に指定し停止するプログラム・モジュール停止工程、
ソフトウェア・システムの停止処理時に、各プログラム・モジュールの依存関係に基づいて、他のプログラム・モジュールに依存しているプログラム・モジュールから順番に、プログラム・モジュールを停止する停止順序制御工程を有することを特徴とするソフトウェア停止方法。
【請求項１２】
複数のプログラム・モジュールからなるソフトウェア・システムのソフトウェア停止方法において、
プログラム・モジュールをソフトウェア・システムの起動後にソフトウェア・システムにインストールするインストール工程、
前記インストール工程でインストールされたプログラム・モジュールを個々に指定し起動するプログラム・モジュール起動工程、
前記プログラム・モジュール起動工程で起動されたプログラム・モジュールを個々に指定し停止するプログラム・モジュール停止工程、
ソフトウェア・システムの停止処理時に、各プログラム・モジュールのサービスの使用関係に基づいて、提供しているサービスが他のプログラム・モジュールから使用されていないプログラム・モジュールから順番に、プログラム・モジュールを停止する停止順序制御工程を有することを特徴とするソフトウェア停止方法。
【請求項１３】
請求項１０から請求項１２に記載されたソフトウェア停止方法を実現するプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のプログラム・モジュールからなるソフトウェア・システム、そのシステムを実現するためのプログラム、及びそのプログラムを格納した記憶媒体に関する。
【背景技術】
【０００２】
従来複数のプログラム・モジュールから構成されるソフトウェア・システムにおいて、システムの起動時にそれらのプログラム・モジュールをどのような順番で起動していくかを制御するための起動順序制御手段を有するものがある（たとえば、特許文献１、特許文献２、特許文献３、非特許文献１参照）。
【０００３】
起動順序を制御する目的は、あるプログラム・モジュールが他のプログラム・モジュールの提供している機能を使用する際に、機能を提供するプログラム・モジュールが先に起動されていないと機能を利用するプログラム・モジュールの起動が失敗してしまうような依存関係を満足することであることが多い。
【０００４】
組み込み機器では、電源投入時にはシステム稼動に必要なプログラムを立ち上げ初期化を行なう初期化プログラムが起動される。
【０００５】
一方、システムの停止に関して従来の組み込み機器では、電源スイッチを切断することで電源供給を遮断してプログラムの実行を強制的に停止させてしまうことが多かった。
【０００６】
このように強制的に電源供給を遮断してしまうと、それまでダイナミックＲＡＭなどの揮発性メモリ中に保存されていてスタティックＲＡＭやハードディスクなどの不揮発性メモリに移動されていないデータは失われることになる。また、ハードディスクを搭載しているシステムでは、ハードディスクに書き込み中に電力供給が遮断されることに起因してハードディスクの物理的な破損や、記憶していたデータの消失などの事態を招くことがあった。
【０００７】
そこで、組み込み機器でもシステムの停止時にシステムの停止処理、いわゆるシャットダウン処理を行ない、プログラム・モジュールが実行している最中の処理を安全に停止させたり、揮発メモリ中にしか存在していないデータを不揮発性メモリに移動させたりする処理を実行しうるようにしたものが出てきている。
【特許文献１】特開２００２−１９６９３９号公報
【特許文献２】特開２００２−２９７４０３号公報
【特許文献３】特開２００２−３５１６７７号公報
【非特許文献１】「ＯＳＧｉ  Ｓｅｒｖｉｃｅ  Ｐｌａｔｆｏｒｍ  Ｒｅｌｅａｓｅ  ３」、Ｏｐｅｎ  Ｓｅｒｖｉｃｅ  Ｇａｔｅｗａｙ  Ｉｎｉｔｉａｔｉｖｅ、２００３年３月
【発明の開示】
【発明が解決しようとする課題】
【０００８】
プログラム・モジュールを停止する際に、起動時と同様、他のプログラム・モジュールの提供している機能を停止処理中で利用しているプログラム・モジュールがあるような場合、機能を提供しているプログラム・モジュールを先に停止してしまうと、機能を利用しているプログラム・モジュールを停止する際に処理が正常に行なえず、停止処理に失敗してしまうという問題点が存在する。
【０００９】
また、特許文献１で提示されている方法では、システムの稼動中にシステムに追加されたプログラム・モジュールを対象にして起動・停止処理を行なう場合は、起動・停止処理の順序を規定する定義ファイルをその都度書き直して設定する必要があるという問題点が存在する。
【００１０】
本発明は、このような従来のシステムが有する問題点を解決しようとするものであり、簡便で安全なシステム停止方法を提供することを目的とするものである。
【００１１】
また、本発明は、上述したシステムを構築するソフトウェア、及びソフトウェアを格納した記憶媒体を提供することも目的とするものである。
【課題を解決するための手段】
【００１２】
本発明は上記目的を達成するため為されたもので、複数のプログラム・モジュールからなるソフトウェア・システムにおいて、プログラム・モジュールをソフトウェア・システムの起動後にソフトウェア・システムにインストールするインストール手段、前記インストール手段によってインストールされたプログラム・モジュールを個々に指定し起動するプログラム・モジュール起動手段、前記プログラム・モジュール起動手段によって起動されたプログラム・モジュールを個々に指定し停止するプログラム・モジュール停止手段、ソフトウェア・システムの起動時におけるプログラム・モジュールの起動順序を規定しその順番どおりにプログラム・モジュールを前記プログラム・モジュール起動手段によって起動する起動順序制御手段、ソフトウェア・システムの停止処理時にプログラム・モジュールの停止順序を規定しその順番どおりにプログラム・モジュールを前記プログラム・モジュール停止手段によって停止する停止順序制御手段を有することを特徴とするソフトウェア停止方式を実現するものである。
【発明の効果】
【００１３】
上述したように本発明のプログラム・モジュール停止制御システムでは、簡便な設定で依存関係を有するプログラム・モジュールの停止順序を、安全に停止できる順序とすることができ、安全性の高い装置を提供することができる。
【発明を実施するための最良の形態】
【００１４】
本発明では、次のいずれかの順番で各ソフトウェア・モジュールの停止順番を決定する手段を実現する。
（１）起動された順番とは異なる順番
（２）起動された順番と逆の順番（実施例１）
（３）ソフトウェア・モジュールの静的な参照関係を木構造として表現し、深さ優先探索によって決められる順番（実施例２、３）
（４）（３）の木構造のノードの重みを計算し重みの大きさによる順番（実施例３）
（５）ソフトウェア・モジュールの動的な参照関係を木構造として表現し、深さ優先探索によって探索して得られた順番（実施例４）
（６）（５）の木構造のノードの重みを計算し重みの大きさによる順番（実施例４）
【実施例１】
【００１５】
図を用いて本発明の第１の実施例について説明する。本実施例では、複数のプログラム・モジュールからなるソフトウェア・システムにおいて、各プログラム・モジュールがお互いに依存関係を持つとき、安全にソフトウェア・システムを停止させるために、各プログラム・モジュールの停止順序を制御するシステム、及びそのシステムを実現するためのソフトウェアを説明する。
【００１６】
図１は本発明を実施するシステム上で稼動するソフトウェアの構成を示したもので、非特許文献１に記載されているＯＳＧｉサービス・プラットフォームで規定されているものである。
【００１７】
同図において、１０１０はハードウェアやソフトウェアを制御するためのオペレーティングシステム、１０２０はオペレーティングシステム１０１０上で稼動しＪａｖａ（登録商標）言語（Ｊａｖａ（登録商標）はＳｕｎ  Ｍｉｃｒｏｓｙｓｔｅｍｓ，Ｉｎｃ．社の登録商標である）から生成された中間言語であるバイトコードを解釈実行するためのＪａｖａ（登録商標）仮想マシン、１０３０はＪａｖａ（登録商標）言語で記述された各種アプリケーション・プログラムを一つのＪａｖａ（登録商標）仮想マシン１０２０の上で実行可能にするためのフレームワーク（フレームワーク１０３０も、Ｊａｖａ（登録商標）言語で記述されている）、１０４０はフレームワーク１０３０上で動作するアプリケーションのフレームワーク上の管理単位であるバンドルである。
【００１８】
バンドル１０４０はアプリケーションを構成するＪａｖａ（登録商標）言語によって記述されたプログラムやそのプログラムが使用する画像データや各種ファイルデータなどを内包している。フレームワーク１０３０はバンドル１０４０をおのおの独立してフレームワークに対してインストール／アンインストールする機能、インストールされているバンドルを新しいものに更新する機能、インストールされているバンドルを起動／停止する機能を有する。
【００１９】
図２は、フレームワーク１０３０を構成する主なＪａｖａ（登録商標）言語のクラスの構成を記述した図である。同図において、２０１０はフレームワーク１０３０の主な機能を実現しているフレームワーク実装クラス、２０１５はフレームワーク実装クラスが実装している機能をフレームワーク以外からアクセスするためのインタフェースを定義しているＢｕｎｌｅＣｏｎｔｅｘｔインタフェース、２０２０は他のバンドルからバンドル１０４０に対してアクセスするためのインタフェースを規定しているＢｕｎｄｌｅインタフェース、２０２５はフレームワーク１０３０上でバンドル１０４０を管理するために生成されるバンドル制御実装クラス、２０３０はバンドル１０４０を起動／停止する際にフレームワーク１０３０が呼び出すメソッドを規定したインタフェースであるＢｕｎｄｌｅＡｃｔｉｖａｔｏｒインタフェース、２０３５はバンドル１０４０内でＢｕｎｄｌｅＡｃｔｉｖａｔｏｒインタフェース２０３０を実装しているバンドル実装、２０４０はバンドル１０４０が他のバンドルに対して提供しているサービスをフレームワーク１０３０上で管理するためのサービス制御実装、２０４５はバンドル１０４０内でバンドル１０４０が提供するサービスを実際に実装しているサービス実装、２０５０はサービス登録データにアクセスするためのインタフェースであるＳｅｒｖｉｃｅＲｅｇｉｓｔｒａｔｉｏｎインタフェース、２０５５はサービスを使用する際にサービスのデータにアクセスするためのインタフェースであるＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅインタフェースである。
【００２０】
図３はバンドル１０４０をインストールする際に用いられるアーカイブファイルであるＪａｒファイルの構造と、バンドルを構成するファイル（バンドル・ファイルと呼ぶ）の際にＪａｒファイルのヘッダであるマニフェストヘッダに設定されるバンドルの属性を示したものである。ただし、これらのバンドル属性は必ずしも指定する必要はなく、順番も規定されているものではない。
【００２１】
同図において、３０１０はバンドル１０４０の名前を記述しているバンドル名、３０２０はバンドル１０４０が参照する他のバンドル１０４０が提供するＪａｖａ（登録商標）パッケージのパッケージ名のリストである静的参照パッケージ、３０３０はバンドル１０４０が他のバンドルに対して提供しているＪａｖａ（登録商標）パッケージ名のリストである提供パッケージ、３０４０は静的参照パッケージ３０２０と同様にバンドル１０４０が参照するＪａｖａ（登録商標）パッケージ名のリストであるが、静的参照パッケージ３０２０がバンドル１０４０の起動時に参照関係の解決が必要なのに対し、実際に必要となるときに参照関係が解決できれば良い動的参照パッケージ、３０５０は他のバンドル１０４０が提供しているサービスのうちのどのサービスを使用するかを宣言する参照サービス、３０６０は他のバンドル１０４０に提供可能なサービスを宣言する提供サービス、３０７０はＢｕｎｄｌｅＡｃｔｉｖａｔｏｒインタフェース２０３０を実装しているクラスの名前を宣言するＢｕｎｄｌｅＡｃｔｉｖａｔｏｒ実装クラス名である。
【００２２】
以下、システムの停止時に参照されるデータが生成されるインストール処理、バンドルの起動／停止処理、システムの再起動処理、システム停止処理について説明する。
【００２３】
《インストール処理》
はじめにバンドル１０４０がフレームワーク１０３０にインストールされる際の処理について図４を用いて説明する。本実施例では、プログラム・モジュールをソフトウェア・システムの起動後にソフトウェア・システムにインストールする。
【００２４】
システムのオペレータがバンドル・ファイルの格納されている場所をＵＲＬ（Ｕｎｉｆｏｒｍ  Ｒｅｓｏｕｒｃｅ  Ｌｏｃａｔｏｒｓ）を使用して指定し、指定された場所に格納されているバンドル・ファイルをフレームワーク１０３０にインストールすることをフレームワーク実装２０１０に指示する（４１０）。
【００２５】
フレームワーク実装２０１０は指定された格納場所からバンドル・ファイルを読み込み、読み込んだバンドル・ファイルのデータをフレームワーク内で参照しやすいように設けられたキャッシュに格納する（４１５）。
【００２６】
読み込まれたバンドル・ファイルのマニフェスト（Ｊａｒファイルの属性などを定義するヘッダ）から提供パッケージ・ヘッダ３０３０と静的参照パッケージ・ヘッダ３０２０を読み出す。各バンドル１０４０が提供しているＪａｖａ（登録商標）パッケージは、提供しているバンドル１０４０のバンドルＩＤとともにフレームワーク実装２０１０の持つ提供パッケージ・レジストリに格納されている。静的参照パッケージ・ヘッダ３０２０に記述されている参照パッケージがこの提供パッケージ・レジストリにすでに登録されている、もしくは自身の提供パッケージ・ヘッダ３０３０に記述されている場合は処理を続行する。そうでない場合は、インストール処理が失敗したことを示す例外を発生させ処理を停止する（４２０）。
【００２７】
バンドル制御実装２０２５のオブジェクトを生成し（４２５）、バンドル・ファイルのマニフェストの情報によって初期化を行なう（４３０）。マニフェストの内容はバンドル制御実装２０２５によって管理され、各マニフェスト・ヘッダのエントリを表す文字列をキーにして参照可能となっている。また、バンドルにはバンドルを一意に特定するためのバンドルＩＤが付与される。
【００２８】
図８に示される構造をもったバンドル・リストがフレームワーク実装２０１０によって生成されている。新たにインストールされたバンドルに関するエントリをバンドルＩＤ、キャッシュ内の格納位置などの情報によって作成し、バンドル・リストの最後に追加する（４３５）。このバンドル・リストは、ハードディスクなどの不揮発なメモリに格納される。
【００２９】
バンドル制御実装２０２５にインストールされたことを示すＩＮＳＴＡＬＬＥＤ状態を設定する（４４０）。
【００３０】
この状態をバンドル・リストからバンドルＩＤをキーにして対象となるバンドルに対するバンドル・リスト・エントリを検索し、そのエントリに登録されている状態をＩＮＳＴＡＬＬＥＤに変更する（４４５）。
【００３１】
このようにしてバンドル１０４０がフレームワーク１０３０にインストールされる。
【００３２】
《バンドルの起動／停止処理》
次にバンドル１０４０が起動／停止されるときの処理について図５を用いて説明する。本実施例では、上記のインストール処理でインストールされたプログラム・モジュールを個々に指定して起動し、起動されたプログラム・モジュールを個々に指定して停止する。
【００３３】
オペレータからバンドルＩＤを指定して指定されたバンドルＩＤに対応するバンドルを起動するよう指示されたフレームワーク実装２０１０は（５１０）、バンドルＩＤからそのバンドルＩＤに対応するバンドル制御実装２０２５を検出する。
【００３４】
バンドル制御実装２０２５に対してＢｕｎｄｌｅＡｃｔｉｖａｔｏｒ実装クラス名ヘッダ３０７０を表す文字列をキーとして指定しＢｕｎｄｌｅＡｃｔｉｖａｔｏｒ実装クラス名３０７０のデータを取得する（５１５）。
【００３５】
ＢｕｎｄｌｅＡｃｔｉｖａｔｏｒ実装クラス名３０７０が定義されている場合は、このＢｕｎｄｌｅＡｃｔｉｖａｔｏｒ実装クラス名３０７０が示すクラスをロードし、オブジェクト生成を行なう（５２０）。生成されたＢｕｎｄｌｅＡｃｔｉｖａｔｏｒオブジェクトはバンドル制御実装２０２５に記憶される。生成されたＢｕｎｄｌｅＡｃｔｉｖａｔｏｒオブジェクトに対してｓｔａｒｔメソッドを呼び出し、バンドル１０４０ごとに定義されたバンドルの初期化ルーチンを実行する（５２５）。この初期化ルーチンの中で、バンドル１０４０が提供するサービスをフレームワーク実装２０１０に登録して（５３０）、登録されたサービスを表すＳｅｒｖｉｃｅＲｅｇｉｓｔｒａｔｉｏｎオブジェクトを取得したり、フレームワーク実装２０１０に登録されているサービスからバンドル１０４０が使用するサービスを検索し、検索したサービスを表すＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅオブジェクトを取得しサービス・オブジェクトを取得したり（５３５）するなどの処理を行なうことが一般的である。
【００３６】
起動が成功すると、バンドル１０４０が起動されていることを示す状態であるＡＣＴＩＶＥ状態にバンドル制御実装が設定される（５４０）。
【００３７】
また、このＡＣＴＩＶＥ状態はバンドル・リストの対応するエントリの状態フィールドにも設定されて永続的に記憶される（５４５）。
【００３８】
さらに、フレームワーク実装２０１０は、図８に示すバンドル起動順リストを保持しており、このリストもバンドル・リストと同様に永続的に記憶される。このバンドル起動順リストの最後に起動したバンドルのバンドルＩＤを追加する（５４８）。このバンドル起動順リストは、ソフトウェア・システムの起動時におけるプログラム・モジュールの起動順序を規定する。
【００３９】
次に停止処理について説明する。本実施例では、上記のプログラム・モジュール起動処理で起動されたプログラム・モジュールを個々に指定して停止する。
【００４０】
オペレータからバンドルＩＤを指定して指定されたバンドルＩＤに対応するバンドルを停止するよう指示されたフレームワーク実装２０１０は（５５０）、バンドルＩＤからそのバンドルＩＤに対応するバンドル制御実装２０２５を検出する。
【００４１】
バンドル制御実装２０２５が記憶しているＢｕｎｄｌｅＡｃｔｉｖａｔｏｒオブジェクトを取得する。取得したＢｕｎｄｌｅＡｃｔｉｖａｔｏｒオブジェクトに対してｓｔｏｐメソッドを呼び出し、バンドル１０４０ごとに定義されたバンドルの停止ルーチンを実行する（５５５）。この停止ルーチンの中で、バンドル１０４０が登録したサービスの登録解除を行なったり（５６５）、使用していたサービスの開放を行なったりする（５６０）ことが一般的である。
【００４２】
停止が成功すると、バンドル１０４０が停止していることを示す状態であるＲＥＳＯＬＶＥＤ状態にバンドル制御実装が設定される（５７０）。
【００４３】
また、このＲＥＳＯＬＶＥＤ状態はバンドル・リストの対応するエントリの状態フィールドにも設定されて永続的に記憶される（５７５）。さらに、バンドル起動順リスト（図８）から停止したバンドルのバンドルＩＤが記述されているエントリを削除する（５８０）。こうすることによって、バンドル起動順リスト（図８）は起動されているバンドルがどのような順番で起動されたのかを保持することができる。
【００４４】
《システム再起動処理》
図６を用いてシステムが再起動するときの処理を説明する。本実施例では、ソフトウェア・システムの起動時におけるプログラム・モジュールの起動順序を規定し（バンドル起動順リスト）、その順番にしたがって（その順番どおりに）プログラム・モジュールを起動する。すなわち、このシステムはシステムの停止処理（後述）が開始するまで稼動していたバンドル１０４０をシステムの再起動時に自動的に起動するようになっている。その方法について説明する。
【００４５】
まず、システムが起動されると（６１０）、フレームワーク実装２０１０が生成される（６１５）。
【００４６】
フレームワーク実装２０１０が起動されると（６２０）、永続的に記憶されていたバンドル・リストを読み出す（６２５）。
【００４７】
バンドル・リストに記憶されていたバンドルの情報からバンドル制御実装２０２５を生成し（６３０）、生成されたバンドル制御実装２０２５を初期化する（６３５）。また、バンドル・リストに記憶されていた状態にバンドルの状態を設定する（６４０）。
【００４８】
さらに永続的に記憶されていたバンドル起動順リスト（図８）を読み出し（６４５）、リストに登録されている順番にバンドルＩＤを取得し、取得したバンドルＩＤのバンドル制御実装２０２５のオブジェクトを検索してバンドル１０４０の起動処理を行なう（６５０、６５５、６６０）。ここで行われる起動処理（６５０、６５５、６６０）は通常のバンドル１０４０の起動処理（５１５、５２０、５２５）と同等である。このようにして、バンドル起動順リストにしたがって、システムが停止される前と同じ順番でバンドル１０４０が再起動されていく。
【００４９】
《システム停止処理》
次に、システムを停止する際の処理について図７を用いて説明する。本実施例では、ソフトウェア・システムの停止処理時にプログラム・モジュールの停止順序を規定し、その順番にしたがって（その順番どおりに）プログラム・モジュールを停止する。停止順序は、プログラム・モジュールの起動順序に応じた順番（バンドル起動順リストで順序付けられた起動順番の逆順）である。
【００５０】
システムが停止しようとすると（７１０）、フレームワーク実装２０１０に対して停止メソッドが呼ばれる（７１５）。
【００５１】
フレームワーク実装２０１０がシステム起動時に永続的記憶領域から読み込んで保持しているバンドル起動順リスト（図８）を参照する。バンドル起動順リストは、バンドルの起動／停止処理時に更新されている。
【００５２】
このバンドル起動順リスト（図８）を逆に参照し、最も遅く起動されたバンドル１０４０から停止していく（７２０、７２５、７３０）。この停止処理方法（７２０、７２５、７３０）は、通常のバンドル１０４０の停止方法（５５５、５６０、５６５、５７０、５７５）と比較して、状態の保存（バンドル・リストの対応するエントリの状態フィールドへのＲＥＳＯＬＶＥＤ状態の設定）を行なわないことを除いて同等である。再起動時には、このバンドル・リストの対応するエントリの状態フィールドに永続的に記憶された状態を見て、対象となるバンドルを起動するか否かを決める。したがって、もし、システムの停止処理中に操作者が明示的に指示して行なわれるバンドルの停止処理と同じように永続的に記憶されているバンドルの状態を停止状態であるＲＥＳＯＬＶＥＤ状態にしてしまうと、次回システムが立ち上がったときに全てのバンドルが停止状態になってしまうので、それを避けるため、システムの停止時にはバンドルの状態を永続的に記憶することを止めている。
【００５３】
なお、次のバンドルの停止処理を開始する前には、前のバンドルの停止処理は完全に終了していなければならない。
【００５４】
本実施例においてはバンドル１０４０の起動順序を記憶しておくバンドル起動順リスト（図８）を設けたが、起動順序をインストール順序のままで起動順序の変更手段を持たないなどのシステムの条件によってはバンドル・リストを逆に参照して起動されているバンドルを停止することでも実現できる。
【００５５】
ただし、システムが動的参照パッケージをサポートしている場合は、この限りではない。なぜなら、バンドル１０４０が提供しているサービスのインタフェースはサービスを提供しているバンドル１０４０が提供パッケージ・ヘッダ３０３０にて他のバンドルに対して提供しているパッケージ内に存在し外部から参照できるようにするのが標準的な使用方法である。そのため、サービスを使用するバンドルは静的参照パッケージ・ヘッダ３０２０にサービスのインタフェースが定義されているパッケージを指定しなければならない。したがって、動的参照パッケージ３０４０がサポートされていないシステムでは、バンドル１０４０のインストール時にパッケージの参照関係が解決されるので、サービスを使用するバンドル１０４０はサービスとそのサービスのインタフェースを提供するバンドル１０４０よりあとにインストールされなければならない。このことにより、あとからインストールされたバンドルから停止していけばサービスを参照しているバンドル１０４０から先に停止していくことができる。逆に言えば動的参照パッケージがサポートされている場合、バンドルのインストール順の逆順では安全な停止順を規定できない可能性があるためである。
【００５６】
また、本実施例では起動順の逆順をそのまま停止順としたが、より細かな制御を行なうため、起動順リストからその逆順に停止順リストを生成し、システム管理者が停止順リストを変更して停止させる順番を調整できるよう構成することもできる。
【実施例２】
【００５７】
次に第２の実施例について説明する。
【００５８】
本実施例において、ソフトウェア構成等、システムの停止時の処理以外は第１の実施例と同じである。
【００５９】
システム停止時の処理を図９の処理の流れと図１０に示す２つの例を用いて説明する。本実施例では、プログラム・モジュール間の依存関係から各プログラム・モジュールの依存関係を表す木構造を導出し、木構造を探索しながら他のプログラム・モジュールに依存しているプログラム・モジュールから停止するように、停止順序を規定する。
【００６０】
システムが停止しようとすると（９１０）、フレームワーク実装２０１０に対して停止メソッドが呼ばれる（９１５）。
【００６１】
フレームワーク実装２０１０は、自身の停止順序決定メソッドを呼び出す（９２０）。
【００６２】
停止順序決定メソッドでは、バンドル制御実装２０２５よりインストールされている各バンドルの参照サービス３０５０と提供サービス３０６０を取得する。それらの参照サービス３０５０と提供サービス３０６０のデータからサービスの提供関係を有向グラフで表す。有向グラフの向きはサービスを提供しているバンドルから参照しているバンドルへとなるようにする。
【００６３】
これらの有向グラフの例を図１０の左側に示す。この例ではＡ、Ｂ、Ｃ、Ｄの４つのバンドルがバンドルＡの提供するサービスをバンドルＢとバンドルＤが参照し、バンドルＢが提供するサービスをバンドルＣとバンドルＤが参照し、バンドルＣの提供するサービスをバンドルＤが参照している。バンドルのインストール順序はバンドルＡ、バンドルＢ、バンドルＣ、バンドルＤの順であるものとする。
【００６４】
この有向グラフから図１０の右側に示すような木構造を導出する。この木構造の導出のアルゴリズムは、以下のとおりである。
【００６５】
バンドル・リストを参照して、各バンドルをインストールされている順に処理する。
【００６６】
処理対象バンドルが有向グラフの辺の終端となっていない場合、すなわち他のバンドルのサービスを参照していない場合（たとえば、例１、例２のバンドルＡ、例２のバンドルＣのような場合）、処理対象バンドルをルート・ノードとする新しい木構造を構築する。
【００６７】
そうでない場合（処理対象バンドルが有向グラフの辺の終端となっている場合（例えば、例１、例２のバンドルＢ））、生成されている木構造を生成された順に対象とし、各木構造を深さ優先探索して、処理対象バンドル（例えば、バンドルＢ）が登録されているノードを見つける。処理対象となっているバンドルが始点となっているグラフの指しているバンドル（例１では、バンドルＢは、バンドルＣとＤを指している）をインストールされた順番に処理対象バンドルのノードの子ノードとして登録する。子ノードをインストールされた順番に、第１子、第２子、第３子のように考え、左から降順に並べる（例１のノードＢの子ノードＣ、Ｄは、インストールされた順番に、左から降順に並べられる）。
【００６８】
このようにして生成した木構造群を生成した順（例２では、バンドルＡをルート・ノードとする木構造がさきで、バンドルＣをルート・ノードとする木構造があと）に使用し、各木構造は深さ優先探索して、停止順序リストを構成していく。各ノードにおいて、停止順序リストに存在していないバンドルの場合、停止順序リストの最後に追加する。すなわち、停止順序決定メソッドで取得された参照サービス３０５０と提供サービス３０６０で定義されたプログラム・モジュール間の依存関係を静的に定義し、この依存関係から各プログラム・モジュールの依存関係を表す木構造を導出し、木構造を探索しながら他のプログラム・モジュールに依存しているプログラム・モジュールから停止するように、停止順序リストを規定する。
【００６９】
このように生成した停止順序リストに登録されているバンドルを順に停止していく。停止処理方法（９２５、９３０、９３５）は通常のバンドル１０４０の停止方法（５５５、５６０、５６５、５７０、５７５と比較して状態の保存（バンドル・リストの対応するエントリの状態フィールドへのＲＥＳＯＬＶＥＤ状態の設定）を行なわないことを除いて同等である。
【００７０】
以上のように、本実施例では、ソフトウェア・システムの停止処理時に、プログラム・モジュール間の依存関係から導出した各プログラム・モジュールの依存関係を表す木構造、各プログラム・モジュールの依存関係（から導出した各プログラム・モジュールの依存関係を表す木構造）に基づいて、他のプログラム・モジュールに依存しているプログラム・モジュールから順番に、プログラム・モジュールを停止する。
【実施例３】
【００７１】
次に第３の実施例について説明する。本実施例でも、プログラム・モジュール間の依存関係から各プログラム・モジュールの依存関係を表す木構造を導出し、木構造を探索しながら他のプログラム・モジュールに依存しているプログラム・モジュールから停止するように、停止順序を規定する。
【００７２】
静的に決定されるサービスの参照関係から有向グラフを作成し、木構造を作成するまでは第２の実施例と同じである。すなわち、本実施例でも、停止順序決定メソッドで取得された参照サービス３０５０と提供サービス３０６０で定義されたプログラム・モジュール間の依存関係を静的に定義し、この依存関係から各プログラム・モジュールの依存関係を表す木構造を導出する。
【００７３】
本実施例では構築された木構造から次のアルゴリズムによってバンドルの停止順序を決定する。
【００７４】
本実施例の停止順序決定アルゴリズムを、図１１を用いて説明する。本実施例において木構造のノードに正の整数値で表す重みを付加することができる。
【００７５】
木構造を深さ優先探索し、葉の部分（他のバンドルに参照されていないバンドルであり、この例では、ＣとＤ）には重みとして１を付加する。
【００７６】
ノードに対しては、すべての子ノード（当該バンドルが参照しているバンドル）に重みが付加されたときに、子ノードの重みの中で最も大きな重みに１加えた数を自ノードの重みとする。例えば、ノードＡに対しては、子ノードＢ、Ｃの重み（２と１）の中で、最も大きな重み（２）に１を加えた数を、ノードＡの重み（３）とする。
【００７７】
このようにして、すべてのノードに重み付けを行なう。
【００７８】
図１１の左側に例として示すような有向グラフからは、同図の右側に示す木構造が導出され、各ノードの重みはノードの肩に書かれている数字のようになる。
【００７９】
停止順リストは、重みの小さなバンドルから並ぶように構成する。すなわち、各プログラム・モジュールの依存関係を表す木構造を探索しながら他のプログラム・モジュールに依存しているプログラム・モジュールから停止するように、停止順リストを規定する。本実施例では、導出される木構造の葉の部分に最小の重み（この例では、１）をつけ、子ノードの持つ重みのうち最大のものに決められた量（この例では、１）を加算した重みをつけ、最小の重みを持つプログラム・モジュールから重みの重くなる順番に並べて、停止順序を規定する。
【００８０】
バンドルの停止処理は、重みの小さい順に実行される。このリストのうちの同じ重みのバンドルの停止処理は、別のスレッドを生成してそのスレッドの中で実行することにより並列に処理することができる。ただし、次に小さな重みのバンドルの停止処理は、そのバンドルより小さい重みを持ったバンドルの停止処理を行っているスレッドの処理が停止するのを待ってから、行なう。
【００８１】
以上のように、本実施例では、ソフトウェア・システムの停止処理時に、プログラム・モジュール間の依存関係から導出した各プログラム・モジュールの依存関係を表す木構造、各プログラム・モジュールの依存関係（から導出した各プログラム・モジュールの依存関係を表す木構造）に基づいて、他のプログラム・モジュールに依存しているプログラム・モジュールから順番に、プログラム・モジュールを停止する。
【実施例４】
【００８２】
次に第４の実施例について説明する。
【００８３】
実施例２および実施例３ではサービスの参照関係をバンドル・ファイルに定義されている静的な情報から導出したが、本実施例では動的に変化するサービスの参照関係により停止順序を決定する。
【００８４】
本実施例における停止順序決定方法を説明する前に、図１２を用いてサービスの取得処理について説明する。
【００８５】
図５に示すようにバンドル１０４０が提供するサービスは、通常バンドル１０４０が起動されるときにフレームワーク実装２０１０に対して登録される。登録されたサービスはＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅクラス２０５５としてフレームワーク実装２０１０の中に構築されるサービス・レジストリに登録されて管理される。すなわち、フレームワーク実行２０１０の中に構築されるサービス・レジストリは、プログラム・モジュールの持つ機能を他のプログラム・モジュールから使用するいわゆるサービスを管理する。ＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅ内には、サービスを提供しているバンドル１０４０に対するバンドル制御実装２０２５が記憶されている。
【００８６】
登録されたサービスを他のバンドル１０４０が使用する場合、最初にフレームワーク実装２０１０に対して使用するサービスを定義しているサービス・インタフェースの名前を指定してそのサービスのＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅの検索を依頼する（１２１０）。
【００８７】
フレームワーク実装２０１０はサービス・レジストリを検索して指定されたサービス・インタフェースを実装しているサービスのＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅオブジェクトを検索し（１２１５）、戻り値として返す（１２２０）。すなわち、バンドル制御実装２０２５は、フレームワーク実装２０１０の中に構築されるサービス・レジストリに登録されたサービスを検索してサービスを使用可能な形で取得する。
【００８８】
さらにサービス・インタフェースを実装したサービス・オブジェクトを取得してサービスを使用する場合は、検索して発見したＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅ２０５５を引数にしてフレームワーク実装２０１０に対してサービス・オブジェクトの取得を依頼する（１２２５）。
【００８９】
フレームワーク実装２０１０では、引数として渡されたＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅ２０５５に対してサービス・オブジェクトの取得を依頼しているバンドルがサービスを使用することを参照関係として記憶するよう、依頼しているバンドル１０４０のバンドル制御実装２０２５を引数として指定して指示する（１２３０）。その後、ＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅ２０５５からサービス・オブジェクトを取得して（１２３５、１２４０）、サービス・オブジェクトを要求しているバンドルに返す（１２４５）。
【００９０】
このように、各ＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅ２０５５内にこのＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅ２０５５が管理しているサービスをどのバンドルで使用しているかを記憶している。
【００９１】
本実施例におけるシステム停止の際の処理を、図１３を用いて説明する。
【００９２】
前述した実施例と同様、フレームワーク実装２０１０は停止メソッド（１３１０）でバンドル１０４０の停止順リストを作成する（１３１５）。本実施例において停止順リストは次のようにして作成される。
【００９３】
フレームワーク実装２０１０の中に構築されるサービス・レジストリに登録されているすべてのサービスに対して（１３２０）、そのサービスを登録したバンドルとそのサービスを使用しているバンドルを取得する（１３２５、１３３０、１３３５、１３４０）。すなわち、フレームワーク実装２０１０の中に構築されるサービス・レジストリに、サービスの登録元と使用先の組を問い合わせる。有向グラフにおいてサービスを登録しているバンドルのノードから使用しているバンドルのノードの向きにグラフを構築する。
【００９４】
構築された有向グラフから、停止順リストを構築する方法は実施例２もしくは実施例３と同様な処理を行なうことによって導出する。すなわち、サービス使用関係から各プログラム・モジュールのサービスの使用関係を表す木構造を導出し、木構造を探索しながら提供しているサービスを他のプログラム・モジュールから使用されていないプログラム・モジュールから停止するように、停止順リストを規定する。
【００９５】
構築された有向グラフから実施例３と同様な処理で停止順リストを構築する例では、導出される木構造の葉の部分に最小の重みをつけ、子ノードの持つ重みのうち最大のものに決められた量だけ加算された重みをつけ最小の重みを持つプログラム・モジュールから重みの重くなる順番に並べて停止順リストを規定する。また、同じ重みを持つプログラム・モジュールは並行して停止するようにしてもよい。
【００９６】
さらに、各ＳｅｒｖｉｃｅＲｅｆｅｎｃｅ２０５５にサービスを参照しているバンドルを登録しているバンドルより先に停止する必要がないことを示すフラグを設け、このフラグが設定されているサービスに関しては有向グラフに参照関係を反映せずに停止順序を決めることも可能である。
【００９７】
以上のようにして、本実施例では、ソフトウェア・システムの停止処理時に、各プログラム・モジュールのサービスの使用関係（から導出した各プログラム・モジュールのサービスの使用関係を表す木構造）に基づいて、提供しているサービスが他のプログラム・モジュールから使用されていないプログラム・モジュールから順番に、プログラム・モジュールを停止する。
【図面の簡単な説明】
【００９８】
【図１】実施例におけるソフトウェア構成図である。
【図２】実施例におけるフレームワークのクラス構成図である。
【図３】Ｊａｒファイル及びマニフェストの構造図である。
【図４】バンドル・インストール処理フロー図である。
【図５】バンドル起動／停止処理フロー図である。
【図６】システム再起動処理フロー図である。
【図７】実施例１のシステム停止処理フロー図である。
【図８】バンドル・リストとバンドル停止順リストの構造図である。
【図９】実施例２のシステム停止処理フロー図である。
【図１０】停止順を決定する有向グラフと木構造の例の図である。
【図１１】実施例３における有向グラフと機構造の例の図である。
【図１２】実施例４におけるサービス取得処理フロー図である。
【図１３】実施例４のシステム停止処理フロー図である。
【符号の説明】
【００９９】
１０１０  オペレーティングシステム
１０２０  Ｊａｖａ（登録商標）仮想マシン
１０３０  フレームワーク
１０４０  バンドル
２０１０  フレームワーク実装
２０１５  ＢｕｎｄｌｅＣｏｎｔｅｘｔ
２０２０  Ｂｕｎｄｌｅ
２０２５  バンドル制御実装
２０３０  ＢｕｎｄｌｅＡｃｔｉｖａｔｏｒ
２０３５  バンドル実装
２０４０  サービス制御実装
２０４５  サービス実装
２０５０  ＳｅｒｖｉｃｅＲｅｇｉｓｔｒａｔｉｏｎ
２０５５  ＳｅｒｖｉｃｅＲｅｆｅｒｅｎｃｅ
【図１】
2006065462.tif 000003
【図２】
2006065462.tif 000004
【図３】
2006065462.tif 000005
【図４】
2006065462.tif 000006
【図５】
2006065462.tif 000007
【図６】
2006065462.tif 000008
【図７】
2006065462.tif 000009
【図８】
2006065462.tif 000010
【図９】
2006065462.tif 000011
【図１０】
2006065462.tif 000012
【図１１】
2006065462.tif 000013
【図１２】
2006065462.tif 000014
【図１３】
2006065462.tif 000015