(57)【特許請求の範囲】
【請求項１】
メモリを備え、計算機で実行可能なプログラムである複数のモジュールを実行する計算機を備える計算機システムであって、
前記モジュールは、第１の前記モジュールと、前記第１のモジュールの改版後の新しい世代の第２の前記モジュールとを含む、複数の世代の前記モジュールを含み、
前記メモリは、第１の記憶領域と第２の記憶領域とを含み
前記計算機システムは、
前記第１の記憶領域と前記第２の記憶領域とに同じデータを格納し、
前記第１の記憶領域に格納されるデータを用いて、前記第１のモジュールを実行し、
その後、前記第２の記憶領域に格納されるデータを用いて、前記第２のモジュールを実行し、
前記第１のモジュールの実行結果と、前記第２のモジュールの実行結果とを比較し、
前記第２の記憶領域に複製されるデータを示す情報を保持し、
前記保持される情報に従って、前記第１の記憶領域に格納されるデータのうち、値が変更されるデータを、前記第２の記憶領域に複製することによって、前記第１の記憶領域と前記第２の記憶領域とに同じデータを格納し、
前記第２のモジュールは、その実行のために用いられるデータのうち、前記第２の記憶領域に格納されているデータについては、当該第２の記憶領域に格納されたデータを用いて実行され、前記第２の記憶領域に格納されず、値が変更されないデータについては、前記第１の記憶領域に格納されたデータを用いて実行されることを特徴とする計算機システム。
【請求項２】
前記計算機システムは、
前記第２のモジュールにおいて問題が発生する前、前記第１の記憶領域に格納されるデータを用いて、前記第２のモジュールを実行し、
前記第２のモジュールにおいて問題が発生した場合、前記第１のモジュールを実行した後、前記第２のモジュールを実行することを特徴とする請求項１に記載の計算機システム。
【請求項３】
前記計算機システムは、
前記複数のモジュール間の依存関係を保持し、
前記第１のモジュールと第２のモジュールとを実行する場合、前記第２のモジュールと依存関係にある第４の前記モジュールを特定し、
前記第１のモジュールと依存関係があり、かつ、前記第４のモジュールの改版前の古い世代の第３のモジュールを特定し、
前記第３のモジュールと、前記第４のモジュールとを実行することを特徴とする請求項１又は２に記載の計算機システム。
【請求項４】
前記計算機システムは、前記第２のモジュールを実行する場合、前記第２のモジュールと依存関係にないモジュールについては、前記第１のモジュールと整合する世代のモジュールを実行することを特徴とする請求項１から３のいずれか一つに記載の計算機システム。
【請求項５】
前記計算機システムは、
前記第１のモジュールの実行結果と、前記第２のモジュールの実行結果とのうち、比較すべきデータを示す情報を保持し、
前記比較すべきデータを示す情報に従って、前記第１のモジュールの実行結果と、前記第２のモジュールの実行結果とを比較するためのデータを生成することを特徴とする請求項１から４のいずれか一つに記載の計算機システム。
【請求項６】
前記メモリは、第３の記憶領域を含み、
前記計算機システムは、
前記第１の記憶領域に格納されるデータを、前記第３の記憶領域に複製し、
前記第１のモジュールの実行結果と、前記第２のモジュールの実行結果と、前記第３の記憶領域に複製されたデータとを、比較するためのデータを生成することを特徴とする請求項１から５のいずれか一つに記載の計算機システム。
【請求項７】
前記計算機システムは、
前記第１のモジュールが実行される時刻と、前記第２のモジュールが実行される時刻とを取得し、
前記取得された第１のモジュールが実行される時刻と、前記取得された第２のモジュールが実行される時刻との時間差を算出し、
前記取得された第２のモジュールが実行される時刻と、前記算出された時間差とによって、前記第２のモジュールを実行するために用いる時刻を補正することを特徴とする請求項１から６のいずれか一つに記載の計算機システム。
【請求項８】
前記計算機システムは、
前記第１のモジュールが実行される時刻を取得し、
前記第１のモジュールが実行される時刻によって、前記第１及び前記第２のモジュールを実行することを特徴とする請求項１から６のいずれか一つに記載の計算機システム。
【請求項９】
メモリを備え、計算機で実行可能なプログラムである複数のモジュールを実行する計算機によるモジュール実行方法であって、
前記モジュールは、第１の前記モジュールと、前記第１のモジュールの改版後の新しい世代の第２の前記モジュールとを含む、複数の世代の前記モジュールを含み、
前記メモリは、第１の記憶領域と第２の記憶領域とを含み
前記方法は、
前記計算機が、前記第１の記憶領域と前記第２の記憶領域とに同じデータを格納し、
前記計算機が、前記第１の記憶領域に格納されるデータを用いて、前記第１のモジュールを実行し、
その後、前記計算機が、前記データを複製された第２の記憶領域に格納されるデータを用いて、前記第２のモジュールを実行し、
前記計算機が、前記第１のモジュールが実行された結果と、前記第２のモジュールが実行された結果とを比較し、
前記計算機は、前記第２の記憶領域に複製されるデータを示す情報を保持し、
前記方法は、
前記計算機が、前記保持される情報に従って、前記第１の記憶領域に格納されるデータのうち、値が変更されるデータを、前記第２の記憶領域に複製することによって、前記第１の記憶領域と前記第２の記憶領域とに同じデータを格納し、
前記計算機が、前記第２のモジュールは、その実行のために用いられるデータのうち、前記第２の記憶領域に格納されているデータについては、当該第２の記憶領域に格納されたデータを用いて実行され、前記第２の記憶領域に格納されず、値が変更されないデータは、前記第１の記憶領域に格納されたデータを用いて実行されることを特徴とするモジュール実行方法。
【請求項１０】
第２の前記モジュールにおいて問題が発生する前、前記計算機が、前記第１の記憶領域に格納されるデータを用いて、前記第２のモジュールを実行し、
前記第２のモジュールにおいて問題が発生した場合、前記計算機が、前記第１のモジュールを実行した後、前記第２のモジュールを実行することを特徴とする請求項９に記載のモジュール実行方法。
【請求項１１】
前記計算機は、前記複数のモジュール間の依存関係を保持し、
前記方法は、
前記第１のモジュールと第２のモジュールとを実行する場合、前記計算機が、前記第２のモジュールと依存関係にある第４の前記モジュールを特定し、
前記計算機が、前記第１のモジュールと依存関係があり、かつ、前記第４のモジュールの改版前の古い世代の第３のモジュールを特定し、
前記計算機が、前記第３のモジュールと、前記第４のモジュールとを実行し、
前記計算機が、前記第２のモジュールと依存関係にないモジュールについては、前記第１のモジュールと整合する世代のモジュールを実行することを特徴とする請求項９又は１０に記載のモジュール実行方法。
【請求項１２】
前記計算機は、前第１のモジュールの実行結果と、前記第２のモジュールの実行結果とのうち、比較すべきデータを示す情報を保持し、
前記メモリは、第３の記憶領域を含み、
前記方法は、
前記計算機が、前記第１の記憶領域に格納されるデータを、前記第３の記憶領域に複製し、
前記計算機が、前記比較すべきデータを示す情報に従って、前記第１のモジュールが実行された結果と、前記第２のモジュールが実行された結果とを比較するためのデータを生成し、
前記計算機が、前記第１のモジュールの実行結果と、前記第２のモジュールの実行結果と、前記第３の記憶領域に複製されたデータとを、比較するためのデータを生成することを特徴とする請求項９から１１のいずれか一つに記載のモジュール実行方法。
【請求項１３】
前記方法は、
前記計算機が、前記第１のモジュールが実行される時刻と、前記第２のモジュールが実行される時刻とを取得し、
前記計算機が、前記取得された第１のモジュールが実行される時刻と、前記取得された第２のモジュールが実行される時刻との時間差を算出し、
前記計算機が、前記取得された第２のモジュールが実行される時刻と、前記算出された時間差とによって、前記第２のモジュールを実行するために用いる時刻を補正することを特徴とする請求項９から１２のいずれか一つに記載のモジュール実行方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機システムに関し、特に、モジュールの実行を管理する計算機システムに関する。
【背景技術】
【０００２】
鉄道運行管理システムのような情報制御システムは、システムが一度構築されると、１０〜１５年間程度、システムに含まれる既存のソースコードには手を加えられず、主に継ぎ足しによる部分的な改造又は改修がされる。このような改造又は改修が長年続くと、ソースコードが複雑化して読みにくいものとなる。また、有識者の異動又は退職によって、全体を俯瞰できる人材が少なくなる。その結果、システムがブラックボックス化してしまい、障害発生時の対策に多大な工数を要することになる。
【０００３】
そこで、システム内のブラックボックス化されたソースコードを、見通しの良いソースコード、すなわち、ユーザが理解しやすいソースコードへ移行することによって、これらの課題を解決することが求められている。特に、鉄道運行管理システムのような社会インフラシステムは、現行信頼性（すなわち、現行のシステムに備わる信頼性）の担保が強く求められるため、ソースコードをゼロから作り直すのではなく、すでにあるソースコードを元にホワイトボックス化して段階的に作り直す方法が取られる。
【０００４】
鉄道運行管理システムは、複数のモジュールを組み合わせて構築されるため、開発者はモジュールごとにホワイトボックス化し、モジュールを作り直す。そのため、モジュールの入出力及び機能が同じである複数のバージョンのモジュールが存在することになる。
【０００５】
これらのバージョンの異なる複数のモジュールのうち一つは、現行信頼性を有しているが、ブラックボックス化された旧バージョンのモジュール（以降、旧モジュールと記載）である。他の一つは、ホワイトボックス化されて見通しの良い構造となった新バージョンのモジュール（以降、新モジュールと記載）である。
【０００６】
この新モジュールは、旧モジュールのソースコードを受け継いでいるとはいえ、見通しの良い構造になるようにソースコードの構成を変更しているため、現行信頼性を保持しているか不安な面がある。万が一新モジュールにおいて障害が発生した場合、鉄道運行管理システムのような社会インフラシステムでは大きな問題となってしまう。また、鉄道運行管理システムは止めることができないため、すぐに復旧できるような仕組みが必要である。
【０００７】
このような中で、障害発生時に障害が発生したモジュールと置き換え可能なモジュールを検索し、障害発生モジュールと検索結果のモジュールとを置き換えることによって、システムとしての動作を継続させる技術が提案されている（例えば、特許文献１参照）。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２０００−１８１７５３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
特許文献１に提案された技術は、障害が発生したモジュールを他の可換なモジュールと置き換えてしまう。このため、障害が発生したモジュールがどのような入力に対してどのように結果を出力するのか、どこに相違があるのかなどの、障害の原因を特定するための情報を取得することができず、改修が困難になる。また、改修箇所を特定するために、様々な入力データを用意して動作テストを行うこととなり、作業コストが膨大なものとなる。
【００１０】
本発明は、システムの動作を継続させながら、新モジュールの実行結果のどこに相違があるかを抽出し、モジュールに含まれるソースコードを修正するためのデータを取得することを目的とする。
【課題を解決するための手段】
【００１１】
本発明の代表的な一形態によると、メモリを備え、計算機で実行可能なプログラムである複数のモジュールを実行する計算機を備える計算機システムであって、前記モジュールは、第１の前記モジュールと、前記第１のモジュールの改版後の新しい世代の第２の前記モジュールとを含む、複数の世代の前記モジュールを含み、前記メモリは、第１の記憶領域と第２の記憶領域とを含み前記計算機システムは、前記第１の記憶領域と前記第２の記憶領域とに同じデータを格納し、前記第１の記憶領域に格納されるデータを用いて、前記第１のモジュールを実行し、その後、前記第２の記憶領域に格納されるデータを用いて、前記第２のモジュールを実行し、前記第１のモジュールの実行結果と、前記第２のモジュールの実行結果とを比較し、前記第２の記憶領域に複製されるデータを示す情報を保持し、前記保持される情報に従って、前記第１の記憶領域に格納されるデータのうち、値が変更されるデータを、前記第２の記憶領域に複製することによって、前記第１の記憶領域と前記第２の記憶領域とに同じデータを格納し、前記第２のモジュールは、その実行のために用いられるデータのうち、前記第２の記憶領域に格納されているデータについては、当該第２の記憶領域に格納されたデータを用いて実行され、前記第２の記憶領域に格納されず、値が変更されないデータについては、前記第１の記憶領域に格納されたデータを用いて実行される。
【発明の効果】
【００１２】
本発明の一実施形態によると、障害が発生したモジュールのうち、どこに相違があるのかを取得することができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の実施形態のモジュール実行管理装置のシステム構成を示すブロック図である。
【図２Ａ】本発明の実施形態のモジュールが単独ランである場合のシステムを示す説明図である。
【図２Ｂ】本発明の実施形態のモジュールの一部が共存ランである場合のシステムを示す説明図である。
【図３】本発明の実施形態のモジュール定義情報を示す説明図である。
【図４】本発明の実施形態のデータ定義情報を示す説明図である。
【図５】本発明の実施形態の比較結果情報を示す説明図である。
【図６Ａ】本発明の実施形態のモジュールが単独ランである場合のモジュール管理情報を示す説明図である。
【図６Ｂ】本発明の実施形態のモジュールの一部が共存ランである場合のモジュール管理情報を示す説明図である。
【図７】本発明の実施形態のデータ管理情報を示す説明図である。
【図８】本発明の実施形態の時刻補正情報を示す説明図である。
【図９】本発明の実施形態のモジュール実行手段の処理を示すフローチャートである。
【図１０】本発明の実施形態のモード変更手段による処理を示すフローチャートである。
【図１１】本発明の実施形態の比較結果表示手段による表示例を示す説明図である。
【発明を実施するための形態】
【００１４】
以下、本発明の実施形態を、図１〜図１１を参照して詳細に説明する。
【００１５】
図１は、本発明の実施形態のモジュール実行管理装置１０のシステム構成を示すブロック図である。
【００１６】
なお、本実施形態のシステムには例として鉄道運行管理システムを用いるが、鉄道運行管理システムに限らず、プログラムによって動作するシステムであれば、本発明はいずれのシステムにおいても適用可能である。以下に記載されるシステムは、鉄道運行管理システムなどの社会インフラシステムとする。
【００１７】
モジュール実行管理装置１０は、記憶部１１、ＣＰＵ１２、メモリ１３、入力部１４、出力部１５、及び、通信部１６を備える。記憶部１１は、データ及びプログラムを格納するハードディスクである。ＣＰＵ１２は、演算をすることによって、プログラムを実行するためのプロセッサである。メモリ１３は、プログラム及び演算に関係する一時的な情報を記憶する。
【００１８】
入力部１４は、ユーザによって、モジュール実行管理装置１０にデータを入力するためのキーボード又はマウスなどの装置である。出力部１５は、ユーザに実行結果等を表示するためのディスプレイなどの装置である。通信部１６は、Ｅｔｈｅｒｎｅｔ（登録商標、以下同じ）又は、インターネットなどに接続するためのインターフェースである。
【００１９】
記憶部１１は、モジュール定義情報２１、データ定義情報２２、比較結果情報２３、モジュール管理情報３１、データ管理情報３２、及び、時刻補正情報３３などのデータを保持する。また、記憶部１１は、モジュール実行手段４１、モード変更手段４２、比較結果表示手段４３、及び、モジュール５０群などのプログラムを保持する。モジュール実行管理装置１０は、プログラムを記憶部１１からメモリ１３にロードし、ＣＰＵ１２を用いて演算することによって、各種プログラムを実行する。
【００２０】
なお、本実施形態のシステムは、複数のモジュール５０を組み合わせることによって構築されており、モジュール５０が順番にロードされることによって動作する。システムが動作する際、モジュール５０間のデータは、メモリ１３に含まれる共有メモリを介してやり取りされる。具体的には、モジュール５０への入力は、共有メモリに含まれるデータをモジュール５０が読み込むことであり、モジュール５０からの出力は、共有メモリに出力することである。
【００２１】
さらに、モジュール５０には、アドレス解決手段５０１、時刻補正手段５０２、及び、ログ出力手段などの、モジュール５０を実行するためのモジュール５０が含まれる。
【００２２】
本実施形態におけるメモリ１３は、共有メモリ（正）１３１、共有メモリ（副）１３２、及び、共有メモリ（保存用）１３３を保持する。共有メモリ（正）１３１、共有メモリ（副）１３２、及び、共有メモリ（保存用）１３３は、モジュール５０への入力値を格納する領域であり、モジュール５０による演算結果をモジュール５０によって出力される領域である。なお、共有メモリ（正）１３１、共有メモリ（副）１３２、及び、共有メモリ（保存用）１３３は、各々が別のメモリ領域に実装されてもよいし、論理的にデータを分割されることによって実装されてもよい。
【００２３】
本実施形態において、システムの入出力となり、他のシステムへの入力となるデータは、共有メモリ（正）１３１に格納されるデータだけであり、共有メモリ（副）１３２及び共有メモリ（保存用）１３３に格納されるデータは、共有メモリ（正）１３１のコピーである。
【００２４】
また、モジュール５０は、プログラム作成時、すなわちモジュール５０作成時に他のプログラムと静的リンクされることによって一つのファイルとして作成される場合、及び、別のファイルとして作成され、動的にリンクされる場合がある。本発明はどちらのプログラム作成方法においても使用することができるが、本実施形態におけるモジュール５０は、ＤＬＬ（Ｄｙｎａｍｉｃ  Ｌｉｎｋ  Ｌｉｂｒａｒｙ）又はＳＯ（Ｓｈａｒｅｄ  Ｏｂｊｅｃｔ）のような別ファイルとして用意されるプログラムであり、動的リンクされ、呼び出されるものである。
【００２５】
図２Ａ及び図２Ｂは、本発明の概要を示したものである。
【００２６】
モジュール実行管理装置１０は、モジュール５０Ａ、モジュール５０Ｂ、モジュール５０Ｃの３種類のモジュール５０を管理し、それぞれのモジュール５０ごとに、旧バージョン（以降、旧モジュール５０と記載）と新バージョン（以降、新モジュール５０と記載）を管理する。
【００２７】
また、モジュール実行管理装置１０は、モジュール５０ごとに実行モードを持つ。実行モードには、「単独ラン」及び「共存ラン」の２つのモードがある。「単独ラン」は、旧モジュール５０又は新モジュール５０のいずれかのみが実行されるモードである。「共存ラン」は、旧モジュール５０及び新モジュール５０の双方が実行されるモードである。実行モードを変更することによって、新モジュール５０において問題が発生した場合、システムとしての動作を継続させながら、問題解決のための情報を収集することができる。
【００２８】
なお、本実施形態において問題とは、モジュール５０内にコーディングミスなどが存在することであり、これによって、本来システムが取得するべきデータが取得できなくなることを言う。
【００２９】
図２Ａは、本発明の実施形態のモジュール５０が単独ランである場合のシステムを示す説明図である。
【００３０】
図２Ａは、モジュール５０Ａ、モジュール５０Ｂ及びモジュール５０Ｃのすべてが新バージョンの「単独ラン」によって実行されている。モジュール５０Ａ、モジュール５０Ｂ及びモジュール５０Ｃは、モジュール実行手段４１によって制御され、モジュール５０Ａ、モジュール５０Ｂ及びモジュール５０Ｃの順に実行される。また、モジュール５０Ａ、モジュール５０Ｂ及びモジュール５０Ｃは、入力値を共有メモリ（正）１３１から取得し、出力結果を共有メモリ（正）１３１に返す。
【００３１】
ここで、モジュール５０Ａに問題が発生した場合、本実施形態のシステムは図２Ｂの状態となる。
【００３２】
図２Ｂは、本発明の実施形態のモジュール５０の一部が共存ランである場合のシステムを示す説明図である。
【００３３】
図２Ｂにおけるモジュール５０Ａは、「共存ラン」によって実行され、モジュール５０Ｂ及びモジュール５０Ｃは、旧バージョンの「単独ラン」によって実行される。これは、図２Ａに示す新バージョンのモジュール５０Ａにおいて問題が発生したため、実行モードを変更した結果である。
【００３４】
旧モジュール５０Ａ、旧モジュール５０Ｂ及び旧モジュール５０Ｃは、入力値を共有メモリ（正）１３１から取得し、出力結果を共有メモリ（正）１３１に返す。また、新モジュール５０Ａは、入力値を共有メモリ（副）１３２から取得し、出力結果を共有メモリ（副）１３２に返す。
【００３５】
図２Ｂに示すすべてのモジュール５０において、旧モジュール５０が実行されているため、システムとしての動作は、過去に動作の実績がある旧バージョンのモジュール５０によって実行される。すなわち、より安全に動作が可能なバージョンに切り替わる。
【００３６】
また、問題のあったモジュール５０Ａについては、新モジュール５０と旧モジュール５０とが実行されており、旧モジュール５０と新モジュール５０との結果を比較することによって、新モジュール５０の実行結果のどこに相違があったかを抽出することができる。そして、相違のある実行結果部分を生成している部分のソースコードを見直すことによって、新モジュール５０のソースコードを容易に修正することができる。
【００３７】
なお、本実施形態においては、問題が発生したモジュール５０を「共存ラン」にした際に、問題が発生していないモジュール５０も旧モジュール５０に置き換えたが、すべてのモジュール５０が独立していれば、問題が発生していないモジュール５０は新モジュール５０のままでもよい。
【００３８】
以降では、システムの開発において、新モジュール５０の開発が完了し、図２Ａのようにすべて新バージョンの「単独ラン」によって実行させる場合と、モジュール５０のうち新バージョンのモジュール５０Ａにおいて問題が発生し、図２Ｂのように「共存ラン」によって実行させる場合と、問題のあった新バージョンのモジュール５０Ａの修正が終わり、再び図２Ａのようにすべて新バージョンの「単独ラン」モードによって実行させる場合について説明する。
【００３９】
図３は、本発明の実施形態のモジュール定義情報２１を示す説明図である。
【００４０】
図３は、モジュール実行管理装置１０が使用するモジュール５０に関する定義情報を管理するための、モジュール定義情報２１を示す。図３に示すモジュール定義情報２１は、本実施形態のシステムが使用するモジュール５０である、モジュール５０Ａ、モジュール５０Ｂ及びモジュール５０Ｃに関する定義情報を保持する。
【００４１】
図３に示すモジュール定義情報２１は、モジュール名２１０１、バージョン２１０２、ファイル名２１０３及び依存モジュール２１０４を含む。また、依存モジュール２１０４には、名称２１０５及びバージョン２１０６が含まれる。
【００４２】
モジュール名２１０１は、モジュール５０の名称を示す。モジュール名２１０１の順番によって、システム内のモジュール５０は実行される。
【００４３】
バージョン２１０２には、モジュール５０のバージョン番号を一意に示す識別子が含まれる。本実施形態において、旧バージョンの識別子は、「１」（以下において、バージョン１と記載）であり、新バージョンの識別子は、「２」（以下において、バージョン２と記載）である。図３のモジュール定義情報２１に含まれるそれぞれのモジュール５０には、旧バージョンのバージョン１と、新バージョンのバージョン２とがある。なお、本実施形態においてバージョン２１０２は、「１」及び「２」のみであるが、三つ以上のバージョンが格納されてもよい。
【００４４】
そしてファイル名２１０３は、それぞれモジュール５０のソースコード等を格納するモジュールファイルの名前を示す。
【００４５】
モジュール５０が他のモジュール５０と依存関係にある場合、モジュール定義情報２１には依存関係のあるモジュール５０を定義することができる。依存モジュール２１０４は、モジュール名２１０１に示されたモジュール５０と依存関係にあるモジュール５０の情報を示す。名称２１０５は、モジュール名２１０１に示されたモジュール５０と依存関係にあるモジュール５０の名称を示し、バージョン２１０６は、モジュール名２１０１に示されたモジュール５０と依存関係にあるモジュール５０のバージョンを示す。
【００４６】
例えば、レコード２１３は、バージョン１のモジュール５０Ｂを実行するためには、バージョン１のモジュール５０Ｃを一緒に実行する必要があることを示す。
【００４７】
図４は、本発明の実施形態のデータ定義情報２２を示す説明図である。
【００４８】
図４は、モジュール５０が用いる共有メモリに含まれるデータに関する定義情報を管理するためのデータ定義情報２２を示す。データ定義情報２２は、データ名２２０１、サイズ２２０２、コピー規則２２０３、比較規則２２０４、共有メモリ（正）先頭アドレス２２０５、共有メモリ（副）先頭アドレス２２０６及び共有メモリ（保存用）先頭アドレス２２０７を含む。
【００４９】
データ名２２０１は、システムが使用する共有メモリに含まれるデータの名称を示す。本実施形態のデータ定義情報２２は、データ名２２０１が「駅情報」、「列車情報」及び「信号機情報」である３種類のデータの定義を保持する。
【００５０】
サイズ２２０２は、データ名２２０１に示されるデータのサイズを示す。本実施形態において、サイズ２２０２の単位はバイトである。
【００５１】
コピー規則２２０３は、実行モードが「共存ラン」であるモジュール５０が発生した場合に、データ名２２０１に示されるデータが、共有メモリ（正）１３１から共有メモリ（副）１３２及び共有メモリ（保存用）１３３にコピーする対象となるデータであるか否かを示す。
【００５２】
比較規則２２０４は、実行モードが「共存ラン」であるモジュール５０が発生した場合に、データ名２２０１に示されるデータが、共有メモリ（正）１３１と共有メモリ（副）１３２との間で値の比較をする対象となるデータであるか否かを示す。本実施形態における比較は、データごとにデータサイズ分比較し、すべてが等しい場合か、それ以外かを判定する。
【００５３】
共有メモリ（正）先頭アドレス２２０５、共有メモリ（副）先頭アドレス２２０６、及び、共有メモリ（保存用）先頭アドレス２２０７は、それぞれのデータがマッピングされる共有メモリ上のアドレスのうち先頭のアドレスを示す。
【００５４】
例えば、データ名２２０１が「駅情報」であるデータは、モジュール５０によって書き換えられないデータであるため、コピー規則２２０３、比較規則２２０４、共有メモリ（副）先頭アドレス２２０６及び共有メモリ（保存用）先頭アドレス２２０７に値を格納しない。これによってモジュール５０は、データ名２２０１が「駅情報」であるデータを読み出す場合は、常に共有メモリ（正）１３１を用いる。
【００５５】
一方、データ名２２０１が「列車情報」及び「信号機情報」であるデータは、モジュール５０によって書き換わるデータであるため、コピー規則２２０３、共有メモリ（副）先頭アドレス２２０６及び共有メモリ（保存用）先頭アドレス２２０７に値を格納する。これによって旧モジュール５０と新モジュール５０とは、アクセスする先のアドレスをデータによって変更することができる。
【００５６】
すなわち、旧モジュール５０が「列車情報」のデータを読み出す場合、旧モジュール５０は、共有メモリ（正）先頭アドレス２２０５が「１２０００」である領域を読み出す。また、新モジュール５０が「列車情報」のデータを読み出す場合、新モジュール５０は、共有メモリ（副）先頭アドレス２２０６が「２２０００」である領域を読み出す。
【００５７】
また、必要に応じて、比較規則２２０４に値を設定することによって、旧モジュールと新モジュールとの実行結果を、各々比較し、相違がないかを検証する。
【００５８】
なお、本実施形態におけるコピー規則２２０３及び比較規則２２０４には、「○」が格納される。コピー規則２２０３の値が「○」である場合、コピー規則２２０３は、データ名２２０１が示すデータの全領域をコピーすることを示し、比較規則２２０４の値が「○」である場合、比較規則２２０４は、データ名２２０１が示すデータの全領域を比較することを示す。
【００５９】
また、共有メモリ（正）先頭アドレス２２０５、共有メモリ（副）先頭アドレス２２０６、及び、共有メモリ（保存用）先頭アドレス２２０７は、格納される値が固定される方法と、格納される値が動的に割り当てられる方法とがある。
【００６０】
格納される値が固定される方法は、あらかじめどの領域が使用されるか決められ、モジュール実行管理装置１０に備わるＯＳにそのアドレスの領域を予約するものである。また、動的に割り当てる方法は、モジュール実行管理装置１０が起動時にデータ定義情報２２を参照し、データのサイズ２２０２から必要なサイズを求め、共有メモリ（正）１３１、共有メモリ（副）１３２、及び、共有メモリ（保存用）１３３において、求められたサイズ分の領域を確保し、確保された共有メモリの領域のアドレスをデータ定義情報２２に格納するものである。
【００６１】
図５は、本発明の実施形態の比較結果情報２３を示す説明図である。
【００６２】
図５は、モジュール実行管理装置１０が複数の新バージョン及び旧バージョンのモジュール５０を実行した場合に、それぞれの実行結果を格納した共有メモリ（正）１３１と共有メモリ（副）１３２との内容、及び、その内容を比較した結果を格納する比較結果情報２３を示す。比較結果情報２３は、モジュール名２３０１、時刻２３０２、データ名２３０３、タイミング２３０４、データ２３０５及び判定結果２３０６を含む。
【００６３】
モジュール名２３０１は、新バージョン及び旧バージョンを共存して実行させたモジュール５０の名称を示す。時刻２３０２は、比較のためにモジュール名２３０１に示されるモジュール５０を実行し始めた時刻を示す。
【００６４】
またデータ名２３０３は、比較を行った対象のデータ名称を示す。タイミング２３０４は、データ２３０５に格納されるデータがどのタイミングにおいて取得されたかを示し、データ２３０５は、各モジュール５０の実行によって取得されたデータの内容を示す。タデータ２３０５には、モジュール５０を実行する前のデータ、旧モジュール５０を実行した結果のデータ、及び、新モジュール５０を実行した結果のデータとが格納される。
【００６５】
そして判定結果２３０６は、新バージョン及び旧バージョンのモジュール５０の各々の実行結果を比較した結果を示す。判定結果２３０６には、新モジュール５０の実行結果と旧モジュール５０の実行結果とに相違がない場合、「ＯＫ」が格納され、新モジュール５０の実行結果と旧モジュール５０の実行結果とに相違がある場合、「ＮＧ」が格納される。
【００６６】
また、判定結果２３０６に「ＮＧ」が格納される場合、実行結果に相違があったデータの位置を、「ＮＧ」の値と共に格納してもよい。例えば、図５に示す判定結果２３０６において、相違があったデータの位置を示す「（２バイト目〜２バイト目）」が格納されてもよい。
【００６７】
図６Ａは、本発明の実施形態のモジュール５０が単独ランである場合のモジュール管理情報３１ａを示す説明図である。
【００６８】
図６Ｂは、本発明の実施形態のモジュール５０の一部が共存ランである場合のモジュール管理情報３１ｂを示す説明図である。
【００６９】
図６Ａ及び図６Ｂは、実行対象となっているモジュール５０に関する情報を管理するモジュール管理情報３１を示す。図６Ａは、図２Ａの状態におけるモジュール管理情報３１ａであり、図６Ｂは図２Ｂの状態におけるモジュール管理情報３１ｂを示す。
【００７０】
モジュール管理情報３１は、実行する対象であるモジュール５０ごとに、モジュール名３１０１、実行モード３１０２、単独ランのバージョン３１０３、共存ラン３１０４、旧バージョン３１０５及び新バージョン３１０６を含む。
【００７１】
モジュール名３１０１は、実行する対象であるモジュール５０の名称を示す。実行モード３１０２は、モジュール名３１０１に示されるモジュール５０の実行モードを示す。単独ランのバージョン３１０３は、モジュール名３１０１が示すモジュール５０に「単独ラン」させる場合のモジュール５０のバージョンを示す。
【００７２】
共存ラン３１０４に含まれる旧バージョン３１０５は、モジュール名３１０１が示すモジュール５０に「共存ラン」させる場合の旧モジュール５０のバージョンを示す。また、共存ラン３１０４に含まれる新モジュール５０のバージョンを示す。
【００７３】
例えば、レコード３１ａ１は、モジュール５０Ａの実行モードが「単独ラン」であり、バージョン２のモジュール５０Ａが実行されることを示す。また、レコード３１ｂ１は、モジュール５０Ａの実行モードが「共存ラン」であり、バージョン１の旧モジュール５０と、バージョン２の新モジュール５０とが、共存して実行されることを示す。
【００７４】
図７は、本発明の実施形態のデータ管理情報３２を示す説明図である。
【００７５】
図７は、モジュール５０によって参照されるデータを格納する共有メモリ上のアドレスについて管理するためのデータ管理情報３２を示す。データ管理情報３２は、実行モード及びデータの種類ごとに、共有メモリ（正）１３１及び共有メモリ（副）１３２のアドレスを保持する。
【００７６】
データ管理情報３２は、データ名３２０１、単独ランの共有メモリ先頭アドレス３２０２、共存ラン３２０３、旧モジュール用共有メモリ先頭アドレス３２０４、及び、新モジュール用共有メモリ先頭アドレス３２０５を含む。
【００７７】
データ名３２０１は、共有メモリに格納されるデータの名称を示す。単独ランの共有メモリ先頭アドレス３２０２は、「単独ラン」においてデータが格納される共有メモリのアドレスのうち、先頭のアドレスを示す。単独ランの共有メモリ先頭アドレス３２０２は、すべて共有メモリ（正）のアドレスである。
【００７８】
共存ラン３２０３に含まれる旧モジュール用共有メモリ先頭アドレス３２０４は、「共存ラン」において旧モジュール５０によって参照されるデータが格納される共有メモリのアドレスのうち、先頭のアドレスを示す。また、共存ラン３２０３に含まれる新モジュール用共有メモリ先頭アドレス３２０５は、「共存ラン」において新モジュール５０によって参照されるデータが格納される共有メモリのアドレスのうち、先頭のアドレスを示す。
【００７９】
旧モジュール用共有メモリ先頭アドレス３２０４及び新モジュール用共有メモリ先頭アドレス３２０５の値は、データ定義情報２２のコピー規則２２０３の値によって、単独ランの共有メモリ先頭アドレス３２０２と異なる。
【００８０】
例えば、データ名３２０１が「駅情報」のように、モジュール５０によって値が変更されないデータの場合、図４に示すコピー規則２２０３に値が格納されないため、データが共有メモリ（正）１３１から共有メモリ（副）１３２にコピーされない。このため、図７に示すレコード３２１に示すように、旧モジュール５０と新モジュール５０とは、同じアドレスを参照する。
【００８１】
一方、データ名３２０１が「列車情報」及び「信号機情報」のように、モジュール５０によって値が変更されるデータの場合、図４に示すコピー規則２２０３に値が格納されるため、データが共有メモリ間でコピーされる。このため、図７に示すレコード３２２に示すように、旧モジュールと新モジュールとは、異なる共有メモリのアドレスを参照する。
【００８２】
データ管理情報３２は、図４に示すコピー規則２２０３に従って、データ定義２２から生成される。このため、データ管理情報３２は、共有メモリ（正）１３１、共有メモリ（副）１３２、及び、共有メモリ（保存用）１３３のアドレスと同じく、固定の値が格納される場合と、モジュール実行管理装置１０の起動時に動的に値が格納される場合とがある。
【００８３】
図８は、本発明の実施形態の時刻補正情報３３を示す説明図である。
【００８４】
図８は、実行モードが「共存ラン」において、旧モジュール５０及び新モジュール５０が実行される時刻の差を補正するための時刻補正情報３３を示す。時刻補正情報３３は、旧モジュールを実行開始する直前の時刻情報３３１と、新モジュールを実行する直前の時刻情報３３２とを保持する。
【００８５】
図９は、本発明の実施形態のモジュール実行手段４１の処理を示すフローチャートである。
【００８６】
モジュール実行手段４１は、モジュール定義情報２１において決められた順番によって、モジュール５０を順次実行する。
【００８７】
図２Ａにおけるモジュール５０Ａの実行を例に説明する。
【００８８】
モジュール実行手段４１は、モジュール管理情報３１を参照し、実行させるモジュール５０の実行モード３１０２を参照し、「単独ラン」であるか、「共存ラン」であるかを判定する（ステップ４１１）。モジュール実行手段４１は、ステップ４１１において例えば、図６Ａに示すモジュール管理情報３１ａのモジュール５０Ａに関するレコード３１ａ１を参照し、実行モード３１０２が「単独ラン」であり、単独ランのバージョン３１０３が「２」である情報を取得する。そして、モジュール実行手段４１は、実行モード３１０２が「単独ラン」であるため、ステップ４１２に進む。
【００８９】
次にモジュール実行手段４１は、モジュール定義情報２１を参照し、ステップ４１１において取得された情報に該当するモジュール５０を実行する（ステップ４１２）。例えば、ステップ４１１において取得された、実行するモジュール５０Ａのバージョンが「２」である場合、モジュール実行手段４１は、図３に示すモジュール定義情報２１のレコード２１２を参照し、ファイル「ｍａ．ｓｏ．２」を実行する。
【００９０】
以上によって、図２Ａにおけるモジュール５０Ａを実行する。
【００９１】
その後モジュール実行手段４１は、モジュール定義情報２１のモジュール名２１０１に示すモジュール５０をループ処理によって順次実行する。
【００９２】
次に、図２Ｂにおけるモジュール５０Ａの実行を例に説明する。
【００９３】
モジュール実行手段４１は、モジュール管理情報３１を参照し、実行させるモジュール５０の実行モード３１０２を参照し、「単独ラン」であるか、「共存ラン」であるかを判定する（ステップ４１１）。モジュール実行手段４１は、ステップ４１１において、図６Ｂに示す３１ｂのモジュール５０Ａに関するレコード３１ｂ１を参照し、実行モード３１０２が「共存ラン」であり、共存ラン３１０４に含まれる旧バージョン３１０５が「１」であり、共存ラン３１０４に含まれる新バージョン３１０６が「２」である情報を取得する。
【００９４】
そしてモジュール実行手段４１は、実行モード３１０２が「共存ラン」であるため、ステップ４１３に進む。
【００９５】
モジュール実行手段４１は、データ定義情報２２とデータ管理情報３２とを参照し、共有メモリ（正）１３１上のデータを、共有メモリ（副）１３２と共有メモリ（保存用）１３３とにコピーする（ステップ４１３）。
【００９６】
例えば、モジュール実行手段４１はステップ４１３において、図４に示すデータ定義情報２２を参照することによって、コピー規則２２０３に値が格納されているレコードが、データ名２２０１が列車情報であり、サイズ２２０２が２０００であるレコード２２２と、データ名２２０１が信号機情報であり、サイズ２２０２が４０００バイトであるレコード２２３のデータであることを取得する。すなわち、モジュール実行手段４１は、データ名２２０１が「列車情報」（サイズ２２０２が２０００バイト）であるデータとデータ名２２０１が「信号機情報」（サイズ２２０２が４０００バイト）であるデータとがコピー対象であることを取得する。
【００９７】
さらにモジュール実行手段４１は、図４に示すデータ定義情報２２を参照し、共有メモリ上のコピー元とコピー先のアドレスとを取得する。モジュール実行手段４１は、データ名２２０１が「列車情報」であるデータを示すレコード２２２の値によって、共有メモリ（副）１３２の先頭アドレス「２２０００」の領域と共有メモリ（保存用）１３３の先頭アドレス「３２０００」の領域との双方に、共有メモリ（正）１３１の先頭アドレス「１２０００」の「２０００」バイト分の領域をコピーする。
【００９８】
さらにモジュール実行手段４１は、データ名２２０１が「信号機情報」であるデータを示すレコード２２３の値によって、共有メモリ（副）１３２の先頭アドレス「２６０００」の領域と共有メモリ（保存用）１３３の先頭アドレス「３６０００」の領域との双方に、共有メモリ（正）１３１の先頭アドレス「１６０００」から「４０００」バイト分の領域をコピーする。
【００９９】
ステップ４１３の後、モジュール実行手段４１は、現在時刻をＯＳなどの機能によって取得し、取得された現在時刻を、時刻補正情報３３に格納する（ステップ４１４）。ステップ４１４において取得される現在時刻は、旧モジュール５０を実行する直前の時刻であり、旧モジュール５０が開始される時刻の基点であるため、モジュール実行手段４１は、図８に示す時刻補正情報３３の旧モジュール実行開始時刻のレコードであるレコード３３１に、取得された現在時刻を格納する。
【０１００】
ステップ４１４の後、モジュール実行手段４１は、モジュール定義情報２１及びモジュール管理情報３１を参照し、該当する旧モジュール５０を実行する（ステップ４１５）。例えばモジュール実行手段４１は、図６Ｂのモジュール管理情報３１ｂのモジュール５０Ａに関するレコード３１ｂ１を参照し、旧モジュール５０のバージョンが「１」である情報を取得する。そのため、モジュール実行手段４１は、図３に示すモジュール定義情報２１のレコード２１１を参照して、ファイル「ｍａ．ｓｏ．１」を実行する。
【０１０１】
ステップ４１５の後、モジュール実行手段４１は、現在時刻をＯＳなどの機能によって取得し、取得された現在時刻を、時刻補正情報３３に格納する（ステップ４１６）。ステップ４１６において取得される現在時刻は、新モジュール５０を実行する直前の時刻であり、新モジュール５０が開始される時刻の基点であるため、モジュール実行手段４１は、図８に示す時刻補正情報３３の新モジュール実行開始時刻のレコードであるレコード３３２に、取得された現在時刻を格納する。
【０１０２】
ステップ４１６の後、モジュール実行手段４１は、モジュール定義情報２１及びモジュール管理情報３１を参照し、該当する新モジュール５０を実行する（ステップ４１７）。例えばモジュール実行手段４１は、図６Ｂのモジュール管理情報３１ｂのモジュール５０Ａに関するレコード３１ｂ１を参照し、新モジュール５０のバージョンが「２」である情報を取得する。そのため、モジュール実行手段４１は、図３に示すモジュール定義情報２１のレコード２１２を参照して、ファイル「ｍａ．ｓｏ．２」を実行する。
【０１０３】
ステップ４１７の後、モジュール実行手段４１は、データ定義情報２２及びデータ管理情報３２を参照し、旧モジュールの実行結果が出力された共有メモリ（正）１３１のデータと、新モジュールの実行結果が出力された共有メモリ（副）１３２のデータとを比較し、比較結果を比較結果情報２３に格納する（ステップ４１８）。
【０１０４】
例えばモジュール実行手段４１は、図４のデータ定義情報２２に示すレコード２２２及びレコード２２３を参照し、データ名２２０１が「列車情報」であり、サイズ２２０２が２０００バイトであるデータと、データ名２２０１が「信号機情報」であり、サイズ２２０２が４０００バイトであるデータとが、新旧モジュール５０によって生成された結果を比較するデータであることを取得する。
【０１０５】
そこで、モジュール実行手段４１は、図４に示すデータ名２２０１が「列車情報」であるデータについては、図４のデータ定義情報２２に示すレコード２２２に従い、共有メモリ（正）１３１の先頭アドレス「１２０００」を基点とする「２０００」バイト分の領域と、共有メモリ（副）１３２の先頭アドレス「２２０００」を基点とする「２０００」バイト分の領域とを比較し、比較した結果を図５に示す比較結果情報２３に出力する。
【０１０６】
そしてモジュール実行手段４１は、図５に示すレコード２３１、すなわち、モジュール名２３０１がモジュール５０Ａを示し、データ名２３０３が「列車情報」であるレコードについて、旧モジュール５０の実行後のデータが「００１０…」であることを取得する。また、レコード２３１によって、新モジュール５０の実行後のデータが「００２０…」であり、さらに新旧モジュール５０の実行結果を比較した結果は、「ＮＧ（２バイト目〜２バイト目）」であることを取得する。前述の通り「ＮＧ」とは、新旧モジュール５０の実行結果が相違することを意味する。
【０１０７】
一方、モジュール実行手段４１は、図４に示すデータ名２２０１が「信号機情報」であるデータについては、図４のデータ定義情報２２のレコード２２３に従い、共有メモリ（正）１３１の先頭アドレス「１６０００」を基点とする「４０００」バイト分の領域と、共有メモリ（副）１３２の先頭アドレス「２６０００」を基点とする「４０００」バイト分の領域とを比較し、比較した結果を図５に示す比較結果情報２３に出力する。
【０１０８】
そしてモジュール実行手段４１は、図５に示すレコード２３２、すなわち、モジュール名２３０１がモジュール５０Ａを示し、データ名２３０３が「信号機情報」であるレコードについて、旧モジュール５０の実行後のデータが「３３３３…」であることを取得する。また、レコード２３２によって、新モジュール５０の実行後のデータも「３３３３…」であり、さらに新旧モジュール５０の実行結果比較した結果は、「ＯＫ」であることを取得する。前述の通り「ＯＫ」とは、新旧モジュール５０の実行結果が等しいことを意味する。
【０１０９】
また、新旧モジュール５０を実行する前のデータが、共有メモリ（保存用）１３３に保存されているため、モジュール実行手段４１は、比較結果情報２３に前述のデータの比較結果を格納する際、共有メモリ（保存用）１３３を参照し、該当するデータを図５のタイミング２３０４が「実行前」であるデータ２３０５に、新旧モジュール５０を実行する前のデータを格納する。
【０１１０】
以上によって、図２Ｂにおけるモジュール５０Ａの実行、すなわち図９に示すステップ４１３〜ステップ４１８を終了する。この後、モジュール５０Ａに続けて実行するべきモジュール５０がある場合、モジュール実行手段４１は、図９に示すフローを繰り返す。
【０１１１】
なお、モジュール実行手段４１がステップ４１２、ステップ４１５、及び、ステップ４１７においてモジュール５０を実行する際、モジュール実行手段４１は、アドレス解決手段５０１、時刻補正手段５０２、及び、ログ出力手段５０３を用いる。
【０１１２】
前述の通り、ステップ４１２、ステップ４１５、及び、ステップ４１７などのモジュール５０が共有メモリ上のデータにアクセスする場合、実行モードによってアクセス先のアドレスが異なる。そのため、モジュール実行手段４１は、ステップ４１２、ステップ４１５、及び、ステップ４１７において、これから実行するモジュール５０の実行モードに従って、データ管理情報３２のようなデータ名３２０１と共有メモリ上のアドレスとの対応表を、モジュール５０のアドレス解決手段５０１に通知する。
【０１１３】
アドレス解決手段５０１は、モジュール実行手段４１から通知されたデータ名３２０１と共有メモリ上のアドレスとの対応表を参照し、アクセスしようとするデータ名３２０１からアドレスを解決してから、データにアクセスする。
【０１１４】
さらに、実行モードが「単独ラン」である場合、モジュール実行手段４１は現在の実時刻を使用すればよい。しかし、実行モードが「共存ラン」である場合、モジュール実行手段４１は旧モジュール５０を実行してから新モジュール５０を実行するため、モジュール５０実行時の時刻が異なる。システムにおけるわずかな時刻の差は、処理の結果に影響を与える可能性がある。
【０１１５】
そこで時刻補正手段５０２は、時刻補正情報３３を参照し、補正した時刻を算出し、ステップ４１７において、補正後の時刻を実行中のモジュール５０に返す。補正後の時刻は、「実時刻−旧モジュール５０と新モジュール５０との実行開始時刻の差分＋α」とする。「＋α」は、処理の切り替え等のオーバーヘッドにかかる時間を調整するための値である。「α」は、負の値でもよい。
【０１１６】
例えば、図８に示すように、旧モジュール５０の実行開始時刻が「１０：００：００．１００」であり、新モジュール５０の実行時刻が「１０：００：００．１５０」である場合、旧モジュール５０と新モジュール５０との実行開始時刻の差分は０．０５０秒となる。さらに、ステップ４１７において、新モジュール５０が実行中に取得する実際の時刻が「１０：００：００．１７０」であり、「＋α」が０である場合、時刻補正手段５０２は、「１０：００：００．１７０」から０．０５０秒分だけ引いた「１０：００：００．１２０」を算出し、算出された時刻を補正後の時刻として新モジュール５０に返す。
【０１１７】
このように、時刻補正手段５０２は、実行モードに従って時刻を補正し、現在として扱う時刻を取得して、モジュール５０に返す。
【０１１８】
なお、時刻補正手段５０２は、旧モジュール５０の実行開始時刻を保存しておき、旧モジュール５０及び新モジュール５０が現在時刻取得要求をしたときに保存した旧モジュール５０の実行開始時刻を返すことによって、時刻を補正してもよい。
【０１１９】
さらに、モジュール５０がログ（ジャーナル）をファイルに出力する場合、旧モジュール５０と新モジュール５０とが同じログファイルにログを出力すると、ログが混ざり、最終的に実行されたモジュール５０がいずれのログを出力したのかが不明となり、また、いずれのモジュール５０が実行されたのかも不明になる。そこで、ログ出力手段５０３は、「単独ラン」において実行されるモジュール５０、及び、「共存ラン」において旧モジュール５０として実行されるモジュール５０に、本来のログファイルに出力させ、「共存ラン」において新モジュールとして実行されるモジュール５０に別のログファイルに出力させる。
【０１２０】
本実施形態のシステムは、旧モジュールの実行結果を実際のデータとして採用するため、ログ出力手段５０３によって、最終的に実行された処理のログが本来のログファイルに残される。なお、ログ出力手段５０３は、「共存ラン」において実行される新モジュール５０の実行結果も、新モジュール５０の実行結果であることが認識できるような情報を付加し、本来のログファイルにログを出力してもよい。
【０１２１】
図１０は、本発明の実施形態のモード変更手段４２による処理を示すフローチャートである。
【０１２２】
モード変更手段４２は、モジュール実行手段４１がモジュール５０を実行した後、特にステップ４１２の後、ユーザによる実行結果の検証において、実行結果のデータに矛盾が検出され、そのままのシステムの動作が危険であると判定された場合、又は、外部コンソールなどの入力部１４を介してユーザからパラメタの指定を受けた場合に起動する。すなわち、モード変更手段４２は、システムに障害などの問題が発生した際、又は、ユーザによるテストを実施する際に、起動する。
【０１２３】
モード変更手段４２は、切り替えるモジュール５０の名称、すなわち、障害などの問題が発生したモジュール５０の名称、障害時フラグ、変更後の実行モード、及び、実行モードを変更した後のバージョンを指定され起動する。「障害時フラグ」は、前述のように特定のモジュール５０において問題が発生した場合に、自動又は手動によって、モジュール実行管理装置１０に格納されるフラグである。
【０１２４】
以下では、モジュール５０Ａにおいて問題が発生した際、図２Ａから図２Ｂに実行モードが変更する例について説明する。図１０においてモード変更手段４２は、モジュール５０Ａで問題が発生したため、モジュール５０の名称が「Ａ（モジュール５０Ａ）」であり、障害時フラグが「ＯＮ」であり、変更後の実行モードが「共存ラン」であるパラメタを指定され起動したものとする。
【０１２５】
なお、本実施形態においては、実行モードが「共存ラン」になる場合、一つ前のバージョンと共存されることがあらかじめ指定されているが、ユーザによって任意のバージョンを指定されてよい。
【０１２６】
モード変更手段４２は、障害時フラグがＯＮであるかＯＦＦであるかを判定する（ステップ４２１）。ここでは、障害時フラグがＯＮであるため、ステップ４２２に進む。
【０１２７】
モード変更手段４２は、指定されたモジュール５０Ａの実行モードを、「共存ラン」に変更する（ステップ４２２）。モード変更手段４２は、ステップ４２２において、問題が発生するまで用いていたモジュール管理情報３１のモジュール５０Ａに関するレコードを、図６Ｂのモジュール管理情報３１ｂに示すレコード３１ｂ１の実行モード３１０２のように変更する。
【０１２８】
さらにモード変更手段４２は、図３に示すモジュール定義情報２１を参照し、問題が発生するまでモジュール５０Ａとして実行されていたバージョン２の、前のバージョンが「１」であることを取得する。そして、モジュール管理情報３１のモジュール５０Ａに関するレコードの旧バージョン３１０５に「１」を格納し、新バージョン３１０６に問題が発生するまでのモジュール５０Ａのバージョンである「２」を格納する。これによってモード変更手段４２は、図６Ｂに示すレコード３１ｂ１を生成する。
【０１２９】
ステップ４２２の後、モード変更手段４２は、指定されたモジュール５０Ａ以外のモジュール５０の実行モード３１０２を、旧モジュール５０による「単独ラン」に変更する（ステップ４２３）。モード変更手段４２は、ステップ４２３において、モジュール５０Ａの旧バージョン３１０５が「１」であるため、モジュール５０Ｂに関するレコード及びモジュール５０Ｃに関するレコードについても、図６Ｂのモジュール管理情報３１ｂのレコード３１ｂ２、レコード３１ｂ３のように、実行モード３１０２に「単独ラン」を格納し、単独ランのバージョン３１０３に「１」を格納する。
【０１３０】
これによってモード変更手段４２は、図６Ｂに示すレコード３１ｂ２及びレコード３１ｂ３を生成する。なお、本実施形態において。モジュール５０Ｂ及びモジュール５０Ｃのバージョン３１０３は、モジュール５０Ａの旧バージョン３１０５と同じ「１」であるが、モジュール５０Ａのバージョン「１」とともに動作した場合に、システムが現行信頼性を保持できるバージョンであれば、いずれのバージョンでもよい。
【０１３１】
以上によってモード変更手段４２は、図２Ａから図２Ｂのように、モジュール５０Ａの実行モードを「共存ラン」に変更する。
【０１３２】
以下では、モジュール５０Ａの実行モードを、「共存ラン」から新モジュールによる「単独ラン」に変更する例について説明する。このため、モード変更手段４２は、モジュール５０の名称が「Ａ（モジュール５０Ａ）」であり、障害時フラグが「ＯＦＦ」であり、実行モードが「単独ラン」であり、バージョンが「２」であるパラメタを指定されて起動したものとする。
【０１３３】
モード変更手段４２は、障害時フラグがＯＮであるかＯＦＦであるかを判定し（ステップ４２１）、障害時フラグが「ＯＦＦ」であるため、ステップ４２４に進む。
【０１３４】
モード変更手段４２は、指定されたモジュール５０Ａの実行モードを、指定されたバージョン「２」による「単独ラン」に変更する（ステップ４２４）。モード変更手段４２は、ステップ４２４において、図６Ａのモジュール管理情報３１ａのモジュール５０Ａに関するレコード３１ａ１のように、実行モード３１０２に「単独ラン」を格納し、単独ランのバージョン３１０３に「２」を格納する。
【０１３５】
モード変更手段４２は、以上の処理をモジュール５０Ａ、モジュール５０Ｂ、及び、モジュール５０Ｃのすべてに繰り返すことによって、図２Ｂに示すような「共存ラン」の状態を、図２Ａに示すようなすべて新モジュールによる「単独ラン」の状態に変更する。
【０１３６】
以上によって、図２Ｂから図２Ａのように、モジュール５０Ａの実行モードを新モジュール５０による「単独ラン」に変更することができる。
【０１３７】
なお、本実施形態のステップ４２２及びステップ４２４において、モード変更手段４２は、指定されたモジュール５０のみの実行モードを変更した。しかし、モジュール５０の特定のバージョン間に依存関係がある場合、指定されたモジュール５０の実行モードの変更とともに、依存関係のあるモジュール５０についても、実行モードを変更する。
【０１３８】
例えば、図３のモジュール定義情報２１は、モジュール名称２１０１が「Ｂ」のモジュール５０（モジュール５０Ｂ）のバージョン２１０２「１」と、名称２１０５が「Ｃ」のモジュール５０（モジュール５０Ｃ）のバージョン２１０６「１」との間、及び、モジュール名称２１０１が「Ｂ」のモジュール５０（モジュール５０Ｂ）のバージョン２１０２「２」と、名称２１０５が「Ｃ」のモジュール５０（モジュール５０Ｃ）のバージョン２１０６「２」との間において、依存関係があることを示す。
【０１３９】
本実施形態のシステムが図３に示すモジュール定義情報２１の状態である場合、モード変更手段４２は、モジュール５０Ｂをバージョン１の「単独ラン」にする場合、モジュール５０Ｃをバージョン１の「単独ラン」に変更する。また、モジュール５０Ｂをバージョン１とバージョン２の「共存ラン」にする場合、モジュール５０Ｃについてもバージョン１とバージョン２の「共存ラン」に変更する。
【０１４０】
さらに、問題が発生したモジュール５０Ａと他のモジュール５０に依存関係がある場合も、問題が発生したモジュール５０Ａの実行モードを「共存ラン」にするとともに、問題は発生していないがモジュール５０Ａと依存関係のある他のモジュール５０の実行モードを「共存ラン」にする。
【０１４１】
また、モード変更手段４２は、前述のステップ４２３において、指定されていないモジュール５０について、実行モードを旧バージョンにおける「単独ラン」に変更したが、新バージョンの信頼性が十分確認されている場合には、ステップ４２３を実施せず、新バージョンによる「単独ラン」のまま実行させてもよい。
【０１４２】
図１１は、本発明の実施形態の比較結果表示手段４３による表示例を示す説明図である。
【０１４３】
図１１は、モジュール５０が「共存ラン」によってモジュール実行手段４１に実行される際に生成される比較結果情報２３を、比較結果表示手段４３がユーザに表示する例を示す。比較結果表示手段４３は、比較されたモジュール５０の一定期間分の比較結果情報２３を集計し、集計結果を表示する。
【０１４４】
比較結果表示手段４３によって表示される内容には、比較されたモジュール名４３１、「共存ラン」によって実行された期間４３２、モジュール５０が実行された回数４３３、比較の判定結果４３４がある。また、比較結果表示手段４３は、モジュール５０による実行結果を比較した結果を比較結果４３５に表示する。
【０１４５】
図１１に示す期間４３２において、図５に示す比較結果情報２３の判定結果２３０６のうち「ＮＧ」が１つでもある場合、判定結果４３４には「ＮＧ」が表示される。また、図１１に示す期間４３２において、図５に示す比較結果情報２３の判定結果２３０６がすべて「ＯＫ」である場合、判定結果４３４には「ＯＫ」が表示される。
【０１４６】
比較結果４３５には、データ名４３５１、位置４３５２、及び、ＮＧ回数４３５３が含まれる。比較結果情報２３の判定結果２３０６のうち「ＮＧ」があった場合、比較結果表示手段４３は、その「ＮＧ」となったデータ名２３０３を、データ名４３５１に表示し、どの位置のデータがＮＧであったのかを位置４３５２に表示し、そして、ＮＧになったのはモジュール５０が実行された回数４３３中、何回あったのかをＮＧ回数４３５３に表示する。
【０１４７】
位置４３５２は、図１１に示す「進行許可フラグ」のデータ項目のように、データ構造定義（構造体定義：図示せず）を参照することによって、データ内のどのデータ項目が「ＮＧ」に該当するかを表示してもよい。
【０１４８】
ユーザは、比較結果４３５を参照することによって、新モジュール５０の実行結果のどこに相違があったかを抽出することができる。そして、相違のあった実行結果部分を生成しているソースコードの部分を見直すことによって、新モジュール５０のソースコードの修正に結びつけることができる。
【０１４９】
またユーザは、２４時間などの長期間、新モジュール５０を「共存ラン」によって試験することによって、新モジュール５０が旧モジュール５０と同じ処理を実行していることを確認することができる。長期間の試験において判定結果が「ＯＫ」であり、旧モジュール５０と新モジュール５０との実行結果が等しいことがわかれば、新モジュール５０が現行信頼性（現行のモジュール５０によってシステムに備わる信頼性）を持つことを確認できる。そして、新モジュール５０が現行信頼性を持っている場合、ユーザは、「共存ラン」から新モジュールによる「単独ラン」に切り替えても良いと判断することができる。
【０１５０】
なお、図４に示すデータ定義情報２２の比較規則２２０４は、「○」が格納され、データのサイズ２２０２分等しいか否かを検証する「全比較」を示す。しかし、データのサイズ２２０２分すべての比較だけでなく、比較規則２２０４に比較しない領域を指定してもよい。
【０１５１】
例えば、旧モジュール５０から新モジュール５０への開発にあたり、変更していないため比較による検証をする必要がない部分、又は、十分検証をしており更なる比較による検証が不要である場合、比較規則２２０４に指定された領域を比較範囲から外すよう、比較規則２２０４を設定してもよい。
【０１５２】
また、旧モジュール５０から新モジュール５０への開発にあたり、機能拡張を行っているため、共有メモリへの出力が異なることがわかっている領域についても、その領域を比較範囲から外すよう比較規則２２０４の値を格納してもよい。さらに、比較する方法についても「等しい」だけでなく、データ内の特定のデータ項目について、比較規則２２０４を、「旧モジュール５０の出力結果と新モジュール５０の出力結果との相違が一定範囲以内」としてもよい。また、新モジュール５０において機能拡張されたデータについては、「特定の値になっているか」を比較規則２２０４としてもよい。
【０１５３】
また、一般的に旧モジュール５０は、アドレス解決手段５０１のように参照先である共有メモリ上のアドレスを切り替える機能を持たず、固定の共有メモリ（正）１３１のアドレスを直接参照する場合が多い。本発明は、実行モードが「単独ラン」又は「共存ラン」のいずれであっても、旧モジュール５０は常に共有メモリ（正）１３１を参照するために、アドレスを切り替える機能を持たなくても対応することができる。新モジュール５０がアドレス解決手段５０１を持てばよい。特に、見通しの良いソースコードになるように新モジュール５０を開発するにあたり、データと処理とを分離し、データを管理する部分をアドレス解決手段５０１が持つようにすることができる。
【０１５４】
以上のように本発明は、鉄道運行管理システムのような長期間運用され高信頼が求められる大規模な情報制御システムにおいて、システムを構成するモジュール５０を管理及び実行する。
【０１５５】
本発明のシステムは、複数のバージョンのモジュール５０を管理し、モジュール５０ごとに単一バージョンの「単独ラン」モードと、複数バージョンの「共存ラン」モードの２種類の実行モードを持つ。そして、モジュール５０において問題発生時に、システムは「単独ラン」モードから「共存ラン」モードに切り替わる。
【０１５６】
「単独ラン」モードでは、共有メモリ（正）１３１を使用してモジュール５０を実行する。「共存ラン」モードでは、モジュール５０の入力となる共有メモリ（正）のデータを別の共有メモリ（副）１３２にコピーし、共有メモリ（正）１３１を使用して旧バージョンのモジュール５０を実行し、共有メモリ（副）１３２を使用して新バージョンのモジュール５０を実行する。旧バージョンのモジュール５０の出力を格納する共有メモリ（正）１３１と、新バージョンのモジュール５０の出力を格納する共有メモリ（副）１３２の内容を比較し、実行前のデータとともに、新旧の実行結果の違いを出力する。
【０１５７】
本発明によれば、システムとしての動作を継続させながら、信頼性のある旧モジュール５０の実行結果と、問題の発生した新モジュール５０の実行結果を比較し検証することによって、新モジュール５０の実行結果のどこに相違があるかを抽出することができる。そして、相違のある実行結果部分を生成している部分のソースコードを見直すことにより、新モジュール５０のソースコードの修正に結びつけることができる。その際に、モジュール５０を実行する前の入力となったデータを含めて参照することによって、どのような入力のときに相違が発生するかを把握することができる。
【符号の説明】
【０１５８】
１０  モジュール実行管理装置
１１  記憶部
１２  ＣＰＵ
１３  メモリ
１４  入力部
１５  出力部
１６  通信部
２１  モジュール定義情報
２２  データ定義情報
２３  比較結果情報
３１、３１ａ、３１ｂ  モジュール管理情報
３２  データ管理情報
３３  時刻補正情報
４１  モジュール実行手段
４２  モード変更手段
４３  比較結果表示手段
５０、５０Ａ、５０Ｂ、５０Ｃ  モジュール
１３１  共有メモリ（正）
１３２  共有メモリ（副）
１３３  共有メモリ（保存用）
５０１  アドレス解決手段
５０２  時刻補正手段
５０３  ログ出力手段
【図１】
0005428050.tif 000002
【図２Ａ】
0005428050.tif 000003
【図２Ｂ】
0005428050.tif 000004
【図３】
0005428050.tif 000005
【図４】
0005428050.tif 000006
【図５】
0005428050.tif 000007
【図６Ａ】
0005428050.tif 000008
【図６Ｂ】
0005428050.tif 000009
【図７】
0005428050.tif 000010
【図８】
0005428050.tif 000011
【図９】
0005428050.tif 000012
【図１０】
0005428050.tif 000013
【図１１】
0005428050.tif 000014