図1は本発明における多重系を構成するためのハードウェア構成の一例であり、少なくとも1台の現用系計算機10と、少なくとも1台の待機系計算機20から構成される。各計算機は少なくとも、OSを含むソフトウェアプログラムを実行する演算装置11と、前記プログラムおよびその実行に必要なデータを格納する記憶装置12と、多重系間でデータの送受信を行う通信装置1の13を備える。ここで記憶装置12は、例えばRAMやハードディスクなどである。また、通信装置1の13は、例えばLANアダプタなどである。
現用系計算機10と待機系計算機20は通信装置1の13で通信を行い、通信装置1の13は内部ネットワーク31で接続される。現用系計算機10と待機系計算機20はOSを含むソフトウェアプログラム含め対称的な構成をとる。前記現用系計算機10と待機系計算機20は通信装置2の14で外部ネットワーク32とつながっており、外部ネットワーク32は例えばネットワークスイッチなどで構成され、外部ネットワーク32につながっている外部の計算機とのデータの送受信を行う。
図2は本発明を実施する一形態におけるソフトウェアプログラムの構成図である。記憶装置内12で記憶され、演算装置11によって実行される。
本実施例においては、現用系計算機10と待機系計算機20間でのデータ一致化の対象は、タスク81がタスクの処理結果とタスク81の内部状態を記録する、後述の領域管理テーブルで管理されるメモリやディスクのブロックである。タスク81は少なくても1つ以上であり、予め実行順序が設定されている。そのため、外部ネットワーク32からの外部入力と前記計算機内で発生するタイマーイベントやシグナル等の内部イベントを現用系計算機10と待機系計算機20間で同期させると、タスク81の処理結果と内部状態は両系において一致することが可能である。以下、本発明を実現するためのソフトウェアプログラムの構成について説明する。
本構成は大きく4つのレイヤで構成されている。OSレイヤと、データ一致化ミドル51と通信ミドル61とタスク管理ミドル71からなるミドルレイヤと前記ミドルレイヤの機能を利用し特定の処理を行うタスク81のタスクレイヤ及び前記ミドルレイヤとタスクレイヤの処理結果や状態を記録しておく管理テーブルレイヤから構成される。OS 41は、スケジュール機能とタイマー機能とソフトウェアシグナル(以下、シグナル)機能と演算装置11と記憶装置12と通信装置13を制御する機能をもつソフトウェアであり、例えばLinux(登録商標)などがある。データ一致化ミドル51は現用系計算機10と待機系計算機20の多重系間でのデータ一致化を実現するソフトウェアプログラムであり、前述したOSの41の機能を活用し、後述する同期データ管理テーブル52の内容を待機系計算機11に送信しデータ一致化を実現する。また、後述する一致化データ管理テーブル53と稼働割計算部54と記憶領域差分計算部55と処理時間判定部56を備え、現用系計算機10または待機系計算機20に障害が発生した場合、障害発生した計算機のタスク81の処理状態を現用系計算機のタスク81の状態に一致化するデータ一致化を実現する。
通信ミドル61は通信装置2から受信したデータをタスクへ引き渡し、また、タスクからのデータを通信装置2で外部ネットワーク32へ送信する処理を行う。タスク管理ミドル71はタスクへ、タスクの起動と停止、タイマー設定、他タスクと共有する記憶領域のメモリの割当及び他タスクへのシグナル送信機能を提供するAPIを備えている。タスク管理ミドル71の前記APIの機能はOS41が提供している機能を活用して実現する。タスクは、少なくても1つ以上存在していてタスク管理ミドル71が提供するAPIを利用して特定の処理を実現する。また、制御系をはじめとする一定周期で同処理を反復的に行うシステムでは、複数のタスクが1つのグループになって、予め決まった順序でシーケンシャルに動作し、目的の処理を遂行するケースが多い。シーケンシャル動作はあるタスクが終了した時点でそのタスクが次に動作すべきタスクの起動をかけることで実現するケースが多く、OSの機能を活用してもよいし、タスク管理ミドル71でAPIでシーケンシャル処理を実現する機能を提供してもよい。
また、タスクの周期動作は処理開始のタイマーを設定することによって、生成する。タイマー設定はOSの機能を活用してもよいし、タスク管理ミドル71でAPIのシーケンシャル処理を実現する機能を提供してもよい。タスク管理ミドル71はタスクからのAPIの呼び出しで後述する各種管理テーブルのそれぞれの値として設定する。また、各種管理テーブルの内容(または値)は同期データ管理テーブル52のデータの内容として設定される。
図3(a)-(d)はタスク管理ミドル71の管理テーブルの図である。
まず、図3(a)に示すタスク管理テーブル72について説明する。タスクの実行情報はタスク管理ミドル71によりタスク管理テーブルへ格納される。 タスク識別子は記録されたタスクを識別するための情報である。
IPC識別子はタスクの開始や停止に使われるIPC資源を特定する情報である。タスクからタスク管理ミドル71が受け取り、タスク管理テーブルに格納される。IPC資源は例えばPOSIXのセマフォやメッセージボックスがある。
また、IPC資源は、前記タスク管理ミドル71が前記タスクのシーケンシャル処理を実現するために、他のタスクを起動及び停止するために使用される。
領域識別子はタスクが使用する記憶領域を識別するための情報で、メモリでもディスクでもよい。タスクの起動時に、前記タスク管理ミドルが前記OSの機能を利用し必要な領域を割当し、その領域を識別するために前記タスク管理ミドルが動的に付与し登録する情報である。この識別子は、前記領域の詳細情報が記録されている後述する領域管理テーブル75を特定するために使用される。
開始終了は少なくても1つ以上のタスクから構成される周期タスクにおいて、1周期内で最初に動作する先頭タスクと最後に動作する後尾タスクを特定するための情報である。
前記先頭タスク及び後尾タスクを特定する情報設定機能は、前記タスク管理ミドル71が提供する。前記情報登録専用の外部設定ファイルを用意し、前記タスク管理ミドル71の初期処理として前記外部設定ファイルの読み込みにより登録してもよい。
前記先頭タスクには”S”と後尾タスクには”E”という識別子が設定される。それ以外のタスクに対しては”0”と設定される。
図3(b)はタイマー管理テーブル73の図である。タスクはタイマーによって予め決められた時刻に起動されるものがある。例えば毎日09時00分に行う処理がある場合や50ms毎に行う処理がある場合、タスク管理ミドル71経由で下記の情報を登録する。登録する時刻、周期をOSへ登録し、OSがタイマーを発火されると、そのタイマーイベントを前記タスク管理ミドル71が受信し、登録元のタスクへ通知する。
タスク識別子は登録されるタスクを識別するための情報で、OSのPIDに相当するものである。前記タスク管理ミドル71がタイマーイベントの受信時にイベントの通知先を判別するための情報である。
タイマー識別子はタスクが登録した後述する開始時刻、インターバル、のタイマー内容を識別するための情報である。
開始時刻はタイマーの最初の発火時刻情報である。本実施例は、時間分秒ミリ秒までの設定とする。
インターバルは周期的にタイマーを発火する時間間隔の情報である。本実施例ではミリ秒の粒度で設定する。
図3(c)はシグナル管理テーブル74の図である。タスクは他タスクへ送信するシグナルを前記タスク管理ミドル71経由でシグナル管理テーブル74へ登録する。タスク管理ミドル71はOS41のシグナル機能、例えばkillを利用して登録したシグナルの実行を行う。
タスク識別子はシグナル登録元で送信元のアプリを識別する情報である。
シグナル識別子はタスクが登録したシグナルを識別するための情報である。
シグナル内容はタスク管理ミドル71が、利用するOSのシグナル情報である。例えば、POSIXのsiginfo構造体などがある。
図3(d)は領域管理テーブル75の図である。タスク管理ミドル71は予め一定領域の記憶領域を確保し、タスクが管理ミドル71へ予め定められたサイズ単位の領域の割当を依頼する。
本実施例ではタスク管理ミドル71が管理している記憶領域の現用系計算機10と待機系計算機20間でのデータ一致化の対象とする。
タスクからタスク管理ミドル71経由で下記の情報を登録する。
領域識別子は割り当てた記憶領域を識別するためにタスク管理ミドル71が付与する情報である。割り当てた後にタスク管理ミドル71はタスク管理テーブル72に割り当てた記憶領域のアドレス情報である開始アドレスと、
タスクから要求された領域のサイズの情報であるサイズを書き込む。
図4(a)(b)はデータ一致化ミドル51の管理テーブル図である。
図4(a)は現用系計算機10と待機系計算機20間で行われる同期用データ内容を示す同期データ管理テーブルである。前記現用系計算機は、外部ネットワーク32からの入力データ及び計算機内部のイベント発生状態を同期データとして内部ネットワーク31を通じて待機系計算機へ送信する。以下、テーブルの内容について説明する。
STATUSは同期処理の状態を示す。STARTは同期開始状態でENDは同期終了状態を示す。
SIZEは同期データ管理テーブルに設定されたデータの合計サイズを示す。
データソース識別子は同期対象のデータを識別するもので、外部ネットワークからの入力データや計算機内部のイベントがある。入力データのデータソースには、通信ミドル61、タスク管理テーブル72、タイマー管理テーブル73、シグナル管理テーブル74などがある。
データは同期対象のデータ内容であり、各データソースが提供する内容が設定される。例えば、データソースの通信ミドル61の場合、後述する図6の入力同期処理に必要な入力データ(IN_001)、タスク管理テーブル72の場合、タスク管理テーブル72のIPC識別子情報(IPC_3)、タイマー管理テーブル73の場合、タイマー管理テーブル73に登録している前記タスク管理ミドル71がOSから受信したタイマーイベントのタイマー情報(TR1)、シグナル管理テーブル74の場合、タイマー管理テーブル74に登録している前記タスク管理ミドル71がOSから受信したシグナルイベントのシグナル情報(SIG_1)が設定される。
サイズは各データのサイズである。
ロジカルクロックはテーブルに設定されたデータが発生順序を示す情報であり値が大きいほど発生順は遅い。
発生時刻はデータの発生時刻情報である。1970年からの時間をミリ秒で表している整数である。
図4(b)は現用系計算機10と待機系計算機20間で行われるデータ一致化のために現用系計算機10から待機系計算機20へ送信するデータ管理情報を示す一致化データ管理テーブルである。現用系計算機10または、待機系計算機20に障害が発生した場合、待機系計算機に交代または前記障害発生した計算機の再起動による多重系復旧の時、復旧対象の計算機と現用系計算機10の処理状態を一致化するために、現用系計算機10から復旧対象計算機へ送信するデータを管理するための情報が設定される。以下、テーブル内容について説明する。
一致化データ識別子は現用系計算機10と復旧対象計算機の処理状態の一致化で利用されるデータ種類を示す。LOGは先頭タスクの処理開始から後尾タスクの処理終了までの、同期テーブル管理テーブル52に記録される現用系計算機が処理する入力データとタスク管理ミドル61が処理するOSから通知される内部イベントの内容である。DIFFは先頭タスクが処理する直前の領域管理テーブル75の記憶領域の内容と後尾タスクの処理終了後の前記領域管理テーブル75の記憶領域の内容の差分情報を示す。LOG及びDIFFの作成処理は入力同期ログ作成処理503と差分作成処理903でそれぞれ詳細に説明する。
データ数はLOGとDIFFの作成された数を示す。初期設定値は0である。管理情報はLOGとDIFFの保存先番地とデータサイズを管理する。保存先番地はLOGとDIFFの保存先の記憶領域の番地を示す。サイズはLOGとDIFFのデータサイズを示す。
図5はタスク処理とタイミングの概要で、同期処理にかかわる前記ソフトウェアプログラムの動作タイミングと関連パラメータについて説明する。
周期(T)92はタスクの動作周期である。この周期は、データ一致化ミドル51において、タスク管理テーブル72の開始終了情報から先頭タスクを判別し、タイマー管理テーブル73から該当タスクのタイマーインターバル情報を読み出すことで求められる。
P93は少なくても1つ以上で構成されるタスクのタスクグループの処理時間の合計を示す。タスク管理テーブル72の開始終了情報から先頭タスクを判別し、タイマー管理テーブル73から該当タスクのタイマーインターバル情報を読み出して算出した処理周期開始の時刻から、タスク管理テーブルの開始終了情報から判別した後尾タスクの処理終了を実行した時刻までの時間を示す。
Q94は周期待ち時間を示す。後尾タスクの処理終了時刻から、先頭タスクの処理開始までの待ち時間を示す。
INQ_T95は通信ミドル61が外部ネットワーク32からの入力データをバッファリングする時間を示す。タスクグループの処理開始時間から後述する入力同期通信処理開始までの時間である。
ST96は現用系計算機10が待機系計算機20へ同期データ送信するのに必要な時間である。同期データ管理テーブル52のサイズを内部ネットワーク31の通信帯域で割った時間である。前記同期処理通信は本ST 96の値から、前記タスクグループの処理開始時間の直前まで終了するようにデータ一致化ミドル51は同期処理通信開始の時間を制御する。
AP制御処理とイベント処理97はタスクグループの処理中でOS 41から発生するタイマーやシグナルイベントをタスク管理ミドルで処理し、タスクグループに通知する。さらに、データ一致化ミドル51へ通知する。この通知によってデータ一致化ミドル51は、計算機内部で発生するイベント情報を同期データ管理テーブルへ設定することが可能である。
以下、データ一致化ミドル51の入力同期処理と多重系復旧処理について説明する。
図6は現用系計算機10と待機系計算機20間での外部ネットワーク32からの入力データに関する、データ一致化ミドル51の同期処理を示す。以下、各処理ステップを説明する。
ステップ101は初期設定。ミドルレイヤのソフトウェアプログラムの起動等の初期化やタスクの登録等タスクの処理開始のための初期処理を行う。ステップ102はデータ一致化ミドル51はタスク管理ミドル71からのイベント待ちを行う。ステップ103はタスク管理ミドル71からの通知イベントが後尾タスクの処理終了か判断する。通知イベントとしては後述するステップ107で設定したタイマーイベントもあり、タイマーイベントの場合、後述するステップ111の処理を行う。ステップ104はステップ103で後尾タスクの処理終了であれば(Y)、処理終了の時刻T1を取得する。ステップ105はタスク管理テーブル72の開始終了情報から先頭タスクの識別子を読出し、タイマー管理テーブル73のタイマーインターバル情報から先頭タスクの次の処理開始時刻T2を算出する。ステップ106は同期通信処理時間STと前記T2とT1の差から算出した周期待ち時間Qの大きさを比較する。
ステップ107はSTがQより小さい場合(Y)、同期通信処理開始タイマーを、OS41へ設定する。タイマー発火時間は、QとSTの差分である。このように同期通信処理開始を遅らせることで、通信ミドル61がバッファリングする入力データの量を大きくすることが可能である。可能であれば1回の同期通信処理で処理する入力データの量を大きくすることで、同期通信で発生するオーバーヘッドの軽減とシステムの応答性の向上が図れる。次にステップ102へ戻る。
ステップ111はSTがQより小さくない場合(N)、入力データの同期をするための同期通信処理を行う。まず、データ一致化ミドル内部で管理しているロジカルクロックLCに1を加算する。
ステップ112は通信ミドル61がバッファリングしていた入力データを同期データ管理テーブル52に設定する。入力データは1つ以上であってもよい。テーブルのデータ識別子は通信ミドルで、データは入力データで、サイズはデータのサイズでロジカルクロックにはステップ111で加算したロジカルクロックを、発生時刻は現在時刻を設定する。ステップ113はステップ112で設定した同期データ管理テーブル52を待機系計算機20へ送信する。また、同期データ管理テーブル52のSTATUSにSTARTを設定し入力同期の開始を示す。
ステップ114は待機系計算機20からの入力同期完了通知を待つ。ステップ115は同期データ管理テーブル52のSTATUSに入力同期の終了を示すENDに設定し、ステップ102へ戻る。
一方、待系計算機20はステップ113に対して以下の処理を行う。ステップ201は現用系計算機10からの同期データを受信する。ステップ202は同期データから入力データ情報を読出し、待機系計算機20の通信ミドル61のバッファリングした入力データとの整合性処理を行う。例えば、受信した同期データからの入力データのシリアル番号等の順の合わせ、待機系計算機20の通信ミドル61のバッファリングした入力データの並べ変え処理がある。待系計算機20のデータ一致化ミドルは通信ミドル61へ入力処理開始通知をし、通信ミドル61は待機系計算機のタスクへ入力データを渡す。それによって、タスクは処理開始を行う。前述したように、前現用系計算機10と待機系計算機20は同じソフトウェアプログラム構造を持っており、同じ処理順序でタスク81を動作させているため、同じ入力データをタスクへ引き渡すことで、タスクの処理結果及び内部状態は一致させることができる。ステップ203は入力同期完了を現用系計算機10へ送信する。
図7は、現用系計算機10または待機系計算機20に障害が発生した場合、障害発生した前記計算機を復旧する処理の流れを示す。ステップ301は障害復旧が必要な待機系計算機20からの復旧要求を待つ。ステップ302は待機系計算機20からの復旧要求がある場合、後尾タスク81の処理終了を待つ。復旧処理は、現用系計算機10のタスク81の処理に影響を及ばないように周期待ち時間Q94の時間を利用して行う。
ステップ303は領域管理テーブル75の記憶領域の内容をすべてメモリにコピーする。ステップ304はコピーしたメモリを待機系計算機20へ転送する。転送処理のオーバーヘッドの軽減を考え、転送処理専用の子プロセスを生成し、タスクが実行している別の演算装置11のコアで実行してもよい。ステップ305は後述する高速リプレイ前処理を行う。本実施例では、後述する高速リプレイ処理は子プロセスを生成し前記の別コアで実施する例を示す。この場合、本ステップでは、高速リプレイ処理の子プロセスへの前処理開始通知となる。前処理開始通知はUNIX(登録商標) DOMAIN等のプロセス間通信機構等を利用する。
ステップ306は後述する差分転送前処理を行う。本実施例では、後述する差分転送処理は子プロセスを生成し前記の別コアで実施する例を示す。この場合、本ステップでは、差分転送処理の子プロセスへの前処理開始通知となる。ステップ307はステップ304で送信したメモリのコピー完了受信を待つ。送信メモリのコピーは待機系計算機20で実行されコピー完了を現用系計算機10へ通信する。詳細は後述する。
ステップ308ではメモリコピー完了を受信すると、ステップ304からステップ307までに現用系計算機10のタスクが処理した周期T92の合計時間RD311の間に変更された記憶領域の内容の復旧手段を選定し、復旧処理を行う処理時間判定部56を呼び出す。処理時間判定部56による復旧手段の選択と復旧処理は後述する。
一方、待機系計算機20はステップ301に対して以下の処理を行う。ステップ401は待機系計算機20は初期設定処理として、ステップ101と同様に、ミドルレイヤのソフトウェアプログラムの起動等の初期化やタスクの登録等タスクの処理開始のための初期処理を行う。ステップ402は現用系計算機10のタスク81との処理結果及び内部状態を一致させ、多重系の復旧するために、現用系計算機10へ復旧要求送信を行う。要求送信によって、ステップ301からの処理が現用系計算機10にて行われる。ステップ403はメモリコピー用のメモリ内容の受信を待つ。ステップ404は領域管理テーブル75から記憶領域情報を読出し、受信したメモリ内容のコピー先を確認する。
ステップ405は受信したメモリを読出し領域にコピーする。ステップ406は現用系計算機10へメモリコピー完了を送信する。ステップ407はステップ308で選定された復旧処理から復旧処理イベントを受信し、復旧処理を行う。詳細は後述する。
図8は高速リプレイ処理を示す。ステップ501は処理要求を待つ。処理要求として、ステップ305からの高速リプレイ前処理の要求と、ステップ308にて復旧手段として高速リプレイが選定された場合、後述する入力同期ログ転送要求がある。ステップ502はステップ305からの高速リプレイ前処理の要求か判断する。ステップ503は高速リプレイ前処理の要求の場合(Y)、入力同期ログ作成処理を行う。本実施例では入力同期ログ作成処理のオーバーヘッドを考え、入力同期ログ作成処理専用の子プロセスを生成し、タスクが実行している別の演算装置11のコアで実行する。
入力同期ログは、図6で示した入力同期処理で設定した同期データ管理テーブルのログと計算機の内部イベントのログからなるものである。処理詳細は後述する。ステップ511は入力同期ログ転送要求の場合(N)、入力同期ログ転送処理を行う。処理詳細は後述する。
図9はステップ503の入力同期ログ作成処理を示す。ステップ601は入力同期ログ作成終了通知受信かを判断する。ステップ602は入力ログ作成終了通信を受信した場合(Y)、入力同期ログ作成を終了する。ステップ611は入力ログ作成終了通信を受信してない場合(N)、図6の入力同期通信処理(ST)の終了を待つ。終了の判断は、同期管理テーブル52のSTATUS情報を読出し、同期が完了しているかどうか判断する。STATUS情報がENDであれば同期完了と判断しステップ612に進む。
ステップ612は同期データ管理テーブル52の内容をコピーし、同期データ管理テーブル52の新規インスタンスをメモリ上で作成する。コピーによって新規インスタンスの同期データ管理テーブル52には、現時点で外部ネットワーク32からの入力データが設定される。ステップ613は前記データ一致化ミドル51の内部ロジカルクロックLCに1を加算し、現在時刻を取得し、新規作成した同期データ管理テーブル52のロジカルクロックと発生時刻の情報に設定する。
ステップ614はタスク管理ミドル71からのタイマーやシグナル発生イベントの通知を待つ。多重系復旧時は、同期データ管理テーブル52の内容コピーによる入力データだけではなく、入力データを処理するタスク81の処理に影響を与えるタイマーイベントやシグナルイベントの発生内容も内部入力として活用することで、待機系計算機20のタスク81の状態を、現用系計算機10の入力ログの内容でリプレイできる。ステップ615は前記タスク管理ミドル71からのイベント通知があるか判断する。ステップ616はイベント通知があれば(Y)、データ一致化ミドル51の内部ロジカルクロックLCに1を加算し、現在時刻を取得する。ステップ617はイベントがタイマーの場合、同期データ管理テーブル52のデータソース情報を、73で設定し、タイマー管理テーブル73から同タイマー識別子、例えばTR1に設定しているタイマー情報をデータとして設定する。また、そのデータのサイズTR_SIZEをサイズに設定する。またステップ616で取得したロジカルクロックと現在時刻を発生時刻として設定する。イベントがシグナルの場合は、前シグナル管理テーブル74をもって同様な処理を行う。次に、同期データ管理テーブル52のSIZE情報に設定したデータのサイズを加算する。
ステップ621はイベント通知がなければ(N)、タスク管理ミドル71からの通知により、後尾タスクの処理が終了したか判断する。判断がNであれば、ステップ614に戻りイベント通知を待つ。判断がYであれば、ステップ622に進む。
ステップ622は図4(b)の一致化データ管理テーブルの一致化データ識別子LOGの管理情報の保存先番地に前記ステップ612で作成したメモリの番地情報を設定し、そのメモリ上でコピーされた同期データ管理テーブル52のSIZE情報を管理情報のサイズに設定する。また、前記LOGのデータ数に1を加算する。次に、ステップ601に戻る。このステップで新規インスタンスの同期データ管理テーブル52はステップ304からタスクが処理したR回目、R+1回目のように、処理周期R+n回目の周期の入力同期ログの入力.logとしてメモリ上に保存される。
図10は図9で作成した入力同期ログの転送と待機系計算機20の高速リプレイ処理を示す。まず、ステップ511の入力同期ログ転送処理を説明する。ステップ701は図9で作成したすべての入力同期ログを転送する。ステップ304と同様にタスク81が実行している別の演算装置11のコアで実行している転送処理専用の子プロセスを利用して転送してもよい。
ステップ702は待機系計算機20からリプレイ処理完了通知を待つ。ステップ703は転送が必要な前記入力同期ログがあるか判断する。ステップ702のリプレイ完了待ちの間に作成された入力同期ログが存在するかを判断するためである。もし、存在すれば(Y)、ステップ701に戻る。ステップ711は転送すべき入力同期ログがなければ(N)、図8のステップ503の処理に対して入力同期ログ作成終了通知を行う。ステップ712は入力同期ログ転送処理を終了する。
一方、待系計算機20は前記ステップ701に対して以下の処理を行う。ステップ801は現用系計算機10から転送された入力同期ログを受信し、そのログ内容を読みだす。ステップ802は受信した入力同期ログの数分だけ下記ステップを繰り返す。ステップ803はログ数分の処理が終了されると(Y)、リプレイ終了通知を現用系計算機10へ送信する。ステップ811は受信した入力同期ログから同期データ管理テーブル52のデータソース情報から61の入力データをすべて読出し、待機系計算機20の通信ミドル61へ入力データを渡す。
また、待系計算機20のデータ一致化ミドル51は通信ミドル61へ入力処理開始通知をし、通信ミドル61は待機系計算機のタスクへ入力データを渡す。それによって、タスクは処理開始を行う。前述したように、前現用系計算機10と待機系計算機20は同じソフトウェアプログラム構造を持っており、同じ処理順序でタスク81を動作させているため、同じ入力データをタスクへ引き渡すことで、タスクの処理結果及び内部状態は一致させることができる。図6の入力同期処理に示したステップ113の現用系計算機10のデータ一致化ミドル51から送信される入力データの代わりに、本ステップでは前記ステップ801で受信した入力ログから取り出し、待機系計算機20の通信ミドル61へ入力データを渡すことで入力同期を実現している。
ステップ812は受信した入力同期ログに対して同期データ管理テーブル52のデータソース識別子に記載のタイマー管理テーブルのタイマーイベントや前記データソース識別子に記載のシグナル管理テーブルにあるシグナルイベントログを、ロジカルクロックLCの値が小さい順に並べ替える。また、同期データ管理テーブル52のデータソース識別子に記載の通信ミドルに設定されているデータ(IN_001)の設定時刻である発生時刻情報に対して、イベントログの発生の相対時間を算出し、待機系計算機20のOS41にタイマーイベント設定を行う。ステップ813はステップ812で設定したタイマーイベントか待機系計算機20の後尾タスクの終了イベントかを判断する。
ステップ814は設定したタイマーイベントか判断する。もし、後尾タスクの終了イベントであれば(N)、ステップ811に戻ると、先頭タスクの開始を行う。つまり、高速リプレイ処理は、821に示すように周期待ち時間Q94を省くことで、現用系計算機10のタスクの状態に追いつく時間を短縮する。短縮度合いは、タスク81の処理時間P93に対する周期待ち時間Q94の割合に比例する。詳細は、図13の復旧手段選択処理にて説明する。ステップ815は設定したタイマーイベントであれば(Y)、待機系計算機20のタスク管理ミドル71へタイマー/シグナルイベントを通知する。図5のAP制御処理とイベント処理97に示したように、現用系計算機10で、タイマー/シグナルイベント通知を行うOS41の処理を、本処理でデータ一致化ミドル51が行う。
図11はもう一つの多重系復旧手段である差分転送処理を示す。ステップ901は処理要求を待つ。処理要求として、ステップ306からの差分転送前処理の要求と、ステップ308にて復旧手段として差分転送が選定された場合の、差分転送要求がある。ステップ902は前記ステップ306からの差分転送前処理の要求か判断する。ステップ903は処理要求が差分転送前処理であれば(Y)、差分作成処理を行う。ステップ304のように、差分作成処理のオーバーヘッドを考え、差分作成処理専用の子プロセスを生成し、タスクが実行している別の演算装置11のコアで実行してもよい。詳細は後述する。
ステップ912は差分転送要求の場合(N)、ステップ903で作成した転送可能な差分があるか判断する。ステップ912は差分が存在すれば(Y)、ステップ913へ進む。なければ(N)ステップ921の差分作成終了へ進む。ステップ913はステップ903で作成した差分を待機系計算機20へ転送する。ステップ304のように、転送処理のオーバーヘッドを考え、転送処理専用の子プロセスを生成し、タスク81が実行している別の演算装置11のコアで実行してもよい。
ステップ914は待機系計算機20からの差分コピー完了通知を待つ。待機系計算機20は現用系計算機10が送信した差分をコピーし、差分コピー完了を現用系計算機10へ通知する。差分コピー完了通知を受信すると、ステップ911へ戻る。ステップ921はステップ903の処理に対して差分作成終了通知を行い、ステップ901へ戻る。
図12はステップ903の差分作成処理を示す。ステップ1001は差分作成終了通知受信したか判断する。ステップ1002は終了通知を受信した場合(Y)、差分作成処理を終了する。ステップ1011は終了通知を受信しなかった場合(N)、ステップ304で送信した記憶領域の更新の監視フラグがONされているか判断する。ステップ1012は記憶領域の更新の監視フラグがONの場合(Y)、後尾タスク81の処理終了が実行されたか確認する。処理終了が実行されていなければステップ1001へ戻る。
ステップ1013は記憶領域の更新をチェックする。例えば、記憶領域がメモリでOS41がLinux(登録商標)であれば、/proc/pid/pagemapのファイル内容を確認することでミドルレイヤでもチェックは可能である。ステップ1014は記憶領域の更新があった場合、内容をコピーする。このステップでステップ304からタスクが処理したR回目、R+1回目のように、処理周期R+n回目のまでの処理の差分が1031のように差分.glbとしてメモリ上で保存される。もし、記憶領域がメモリであれば、ページ単位で記録され、ページ単位サイズ、例えば4KBの複数の差分.glbが作成される。差分.glbの数は、変更された記憶領域のサイズをページ単位で割った整数となる。そのため、前記タスク81の処理によっては、データ一致化対象の領域の全サイズの量の差分.glbが作成される可能性がある。この差分の量が一定量を超えると差分転送による多重系復旧において復旧時間が長くなり、復旧不可能となる場合がある。そのため、図10の高速リプレイによる復旧処理に切り替える判断が必要となる。その判断は、図13の復旧手段選択処理にて説明する。
ステップ1015は図4(b)の一致化データ管理テーブル53の一致化データ識別子のDIFFの情報を更新する。まず、ステップ1014で作成した差分のメモリ番地を一致化データ管理テーブル53の一致化データ識別子のDIFFの管理情報の保存先番地に設定し、差分のサイズを管理情報のサイズに設定する。次に、一致化データ管理テーブル53のデータ数に1を加算する。
ステップ1016は差分コピーが完了すると、記憶領域の更新の監視フラグをOFFとする。また、記憶領域変更監視処理のリセットを行う。例えば、記憶領域がメモリでOS41がLinuxであれば、/proc/pid/clear_refsのファイル内容を設定することでミドルレイヤでも更新監視のクリア処理が可能である。以上のステップにより図5のタスクの処理時間P93の間の更新をチェックし、タスクの周期待ち時間Q94で差分を作成することになる。次に、ステップ1001に戻る。
図13は処理時間判定部56に行う復旧処理時間に基づく復旧手段選択処理を示す。ステップ1101は稼動割計算部54を呼び出し、図5の周期Tの1周期内における実行時間Pに対する周期待ち時間Qの割合の[Q/P]を算出する。ステップ1102は記憶領域差分計算部55を呼び出し、1031の差分総量(Δ)に対する内部ネットワークの転送量である帯域(N)の割合の[N/Δ]を算出する。ステップ1103はステップ1101で算出した[Q/P]と、ステップ1102で算出した[N/Δ]に1(周期)を引いた([N/Δ]−1)の量を比較する。
ステップ1104は[Q/P]が大きければ、高速リプレイ処理要求処理として、ステップ501に対して入力同期ログ転送要求を送信し、高速リプレイによる多重系復旧を実施する。ステップ1105は[Q/P]が大きくなければ、ステップ901に対して差分転送要求を送信し、差分転送による多重系復旧を実施する。
ステップ1103の判断の根拠を以下に説明にする。まず、関連用語を纏める。
M[byte]:データ一致化対象の記憶領域の総量
N[byte/秒]:内部ネットワーク31の転送量。帯域
T[秒]:図5のタスク実行周期時間
P[秒]:図5の周期内のタスク実行時間の合計
Q[秒]:図5の周期内のタスク次の周期までの待ち時間
Δ[byte]:1031の多重系復旧に必要な記憶領域の差分の総量
以上のパラメータにより以下の性質が導ける。
L1. データ一致化対象の記憶領域の総量を待機系計算機20へ転送する時間(311のRD)で現用系計算機10のタスク81が実行できる周期の回数は以下となる。
周期の回数=M/N × 1/T
L2. 図10の高速リプレイ処理で、待機系計算機20が現用系計算機10の処理に追いつくまでの時間(αT)は以下の計算式で算出できる。
αT =(M/N × 1/T)/[Q/P]
L3. 図11の差分転送処理で待機系計算機20が現用系計算機10の処理に追いつくまでの時間(αT)は以下の計算式で算出できる。
αT =(M/N × 1/T)/([N/Δ]−1)
L3-1. 図11の差分転送処理による多重系復旧処理時間が収束する条件は以下である。
[N/Δ] > 1回の周期時間
L4. L2とL3から、多重系復旧時間を短縮するには現用系計算機10の処理に追いつくまでの時間(αT)を短くする手段を選択する必要があり、[Q/P]と([N/Δ]−1)を比較し、この値が大きい方が手段を選べば、αTが小さくなるので多重系復旧時間を短縮することができる。
図14は稼動割合計算部の処理を示す。
ステップ1201は前記タイマー管理テーブル73から先頭タスク81が設定しているタイマーインターバル情報を取得し、t1に設定する。
ステップ1202は入力同期作成処理503で作成された入力ログの内容である同期データ管理テーブル52のデータソース識別子61の発生時刻を読込、先頭タスク81の処理開始時刻として、t2に設定する。まず、図9の入力同期ログ作成処理において入力同期処理後にデータソース識別子61のログが作成される。また、図6の入力同期処理終了後に先頭タスクの処理開始が行われるため、先頭タスクの処理開始時刻として利用可能である。ただし、前述したように図5のPの算出方法でのタスクの開始時刻算出も可能であり、その算出方法については本実施例に限定されるものではない。
ステップ1203は同期データ管理テーブル52のデータソース識別子72から、後尾タスクの終了時に利用されるIPC_3の発生時刻を読込、後尾タスクの終了時刻t3を設定する。
ステップ1204はステップ1202で設定したt2と前記ステップ1203で設定したt3の差からタスクグループの処理時間Pを算出する。
ステップ1205はステップ1201で設定したt1にステップ1202で設定したt2を加算し先頭タスクが次に処理開始を行う時刻を算出する。また、算出した時刻とステップ1203で設定したt3との差からタスクグループの待ち時間Qを算出する。
ステップ1206はステップ1204で算出したタスクグループの処理時間Pに対してステップ1205で算出したタスクグループの待ち時間Qの割合を算出する。
図15は記憶領域差分計算部の処理を示す。
ステップ1301は一致化データ管理テーブル53の一致化データ識別子DIFFのデータ数を読込む。
ステップ1302はデータ数分の、一致化データ管理テーブル53の一致化データ識別子DIFFの管理情報のサイズの合計を算出し、図7のRD間で作成された記憶領域の差分の総量Δを算出する。
ステップ1303は内部ネットワークの帯域を取得し、ステップ1302で算出した差分の総量Δに対する割合N/Δを算出する。