(57)【特許請求の範囲】
【請求項１】
不揮発性の主記憶部と、
前記主記憶部に記憶されたデータの複製を記憶する不揮発性のバックアップ記憶部と、
前記バックアップ記憶部に記憶されたデータのそれぞれについて前記主記憶部へ書戻しが必要か否かを識別する際に用いられるシーケンス番号を記憶する不揮発性のシーケンス番号記憶部と、
プロセッサ部から送出された、前記主記憶部に対する書込み対象のデータと当該書込み対象のデータの書込み先を指定する書込み先アドレスとを含む書込みアクセスを検出した場合に、前記書込み先アドレスによって指定される記憶領域に既に記憶されている元データを読取る第１の読取手段と、
前記シーケンス番号記憶部に記憶されているシーケンス番号を読取る第２の読取手段と、
前記第１の読取手段で読取られた前記元データと、前記書込みアクセスに含まれる前記書込み先アドレスと、前記第２の読取手段で読取られた前記シーケンス番号と、前記元データと前記書込み先アドレスと前記シーケンス番号とが前記バックアップ記憶部に正常に書込まれたか否かを示す完全性検証用データとを含むバックアップデータを、前記バックアップ記憶部へ書込む第１の書込手段と、
前記バックアップデータが前記バックアップ記憶部に書込まれた後、前記主記憶部の前記書込み先アドレスによって指定された記憶領域へ、前記書込み対象のデータを書込む第２の書込手段と、
前記シーケンス番号記憶部に記憶されたシーケンス番号を変更する変更手段と、
前記シーケンス番号が前回変更された時点における前記主記憶部の記憶内容へ、前記主記憶部の記憶内容を書戻す旨を指示された場合に、前記バックアップ記憶部に格納された前記バックアップデータの中から、前記シーケンス番号記憶部に記憶されたシーケンス番号を含み、かつ正常な書込みが行われたことを示す完全性検証用データを含むバックアップデータを選択する選択手段と、
選択された前記バックアップデータに含まれる前記元データおよび前記書込み先アドレスを抽出する抽出手段と、
前記バックアップデータから抽出された前記元データおよび前記書込みアドレスごとに、当該元データを当該書込み先アドレスが示す前記主記憶部上の記憶領域へ書込む第３の書込手段と、
を備え、
前記完全性検証用データは、前記バックアップデータに含まれる、前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかと同一の値であり、
前記第１の書込手段は、前記バックアップデータを前記バックアップ記憶部へ書込む際に、前記バックアップデータに含まれる前記元データ、前記書込み先アドレス、前記シーケンス番号、および前記完全性検証用データのうち、前記完全性検証用データと同一の値となった前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかを最初に書込み、前記完全性検証用データを最後に書込むこと、を特徴とする情報処理装置。
【請求項２】
不揮発性の主記憶部と、
前記主記憶部に記憶されたデータの複製を記憶する不揮発性のバックアップ記憶部と、
前記バックアップ記憶部に記憶されたデータのそれぞれについて前記主記憶部へ書戻しが必要か否かを識別する際に用いられるシーケンス番号を記憶する不揮発性のシーケンス番号記憶部と、
プロセッサ部から送出された、前記主記憶部に対する書込み対象のデータと当該書込み対象のデータの書込み先を指定する書込み先アドレスとを含む書込みアクセスを検出した場合に、前記書込み先アドレスによって指定される記憶領域に既に記憶されている元データを読取る第１の読取手段と、
前記シーケンス番号記憶部に記憶されているシーケンス番号を読取る第２の読取手段と、
前記第１の読取手段で読取られた前記元データと、前記書込みアクセスに含まれる前記書込み先アドレスと、前記第２の読取手段で読取られた前記シーケンス番号と、前記元データと前記書込み先アドレスと前記シーケンス番号とが前記バックアップ記憶部に正常に書込まれたか否かを示す完全性検証用データとを含むバックアップデータを、前記バックアップ記憶部へ書込む第１の書込手段と、
前記バックアップデータが前記バックアップ記憶部に書込まれた後、前記主記憶部の前記書込み先アドレスによって指定された記憶領域へ、前記書込み対象のデータを書込む第２の書込手段と、
前記シーケンス番号記憶部に記憶されたシーケンス番号を変更する変更手段と、
前記シーケンス番号が前回変更された時点における前記主記憶部の記憶内容へ、前記主記憶部の記憶内容を書戻す旨を指示された場合に、前記バックアップ記憶部に格納された前記バックアップデータの中から、前記シーケンス番号記憶部に記憶されたシーケンス番号を含み、かつ正常な書込みが行われたことを示す完全性検証用データを含むバックアップデータを選択する選択手段と、
選択された前記バックアップデータに含まれる前記元データおよび前記書込み先アドレスを抽出する抽出手段と、
前記バックアップデータから抽出された前記元データおよび前記書込みアドレスごとに、当該元データを当該書込み先アドレスが示す前記主記憶部上の記憶領域へ書込む第３の書込手段と、
を備え、
前記完全性検証用データは、前記バックアップデータに含まれる、前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかと同一の値であり、
前記第１の書込手段は、前記バックアップデータを前記バックアップ記憶部へ書込む際に、前記バックアップデータに含まれる、前記元データ、前記書込み先アドレス、前記シーケンス番号、および前記完全性検証用データのうち、前記完全性検証用データを最初に書込み、前記完全性検証用データと同一の値となった前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかを最後に書込むこと、を特徴とする情報処理装置。
【請求項３】
前記第１の書込手段は、前記完全性検証用データを格納した記憶領域と、前記完全性検証用データと同一の値のデータを格納した記憶領域との間の記憶領域に、前記バックアップデータのうち、前記完全性検証用データまたは前記完全性検証用データと同一の値のデータを除くデータを書込むこと、を特徴とする請求項１または請求項２に記載の情報処理装置。
【請求項４】
前記第１の書込手段は、前記バックアップデータに含まれる、前記元データ、前記書込み先アドレス、前記シーケンス番号、前記完全性検証用データのうち、前記完全性検証用データを最後尾の記憶領域に書込むこと、を特徴とする請求項３に記載の情報処理装置。
【請求項５】
前記完全性検証用データは、前記シーケンス番号と同一番号のデータであること、を特徴とする請求項３または請求項４に記載の情報処理装置。
【請求項６】
前記第１の書込手段は、読取られた前記元データと同一の値を前記完全性検証用データとし、前記バックアップデータに含まれる、前記元データ、前記書込み先アドレス、前記シーケンス番号、前記完全性検証用データのうち、前記完全性検証用データを先頭の記憶領域に格納し、前記元データを最後尾の記憶領域に書込むこと、を特徴とする請求項１または請求項２に記載の情報処理装置。
【請求項７】
前記完全性検証用データは、前記元データ、前記書込み先アドレス、および前記シーケンス番号の少なくとも１つ以上についての排他的論理和によるパリティデータであること、を特徴とする請求項１または請求項２に記載の情報処理装置。
【請求項８】
前記バックアップ手段は、前記プロセッサ部と前記主記憶部との間に接続され、前記プロセッサ部から前記書込みアクセスを受け、受けた前記書込みアクセスを前記主記憶部へ送出すること、を特徴とする請求項１乃至７のいずれか１項に記載の情報処理装置。
【請求項９】
前記シーケンス番号記憶部は、揮発性の記憶装置から構成され、
前記変更手段は、前記主記憶部上の記憶領域を示すアドレスを記憶する書込みアドレス記憶部を有し、
前記第２の書込手段は、前記変更手段によって前記シーケンス番号記憶部に記憶されているシーケンス番号が変更された後に、
前記書込みアドレス記憶部に記憶されたアドレスが示す前記主記憶部上の記憶領域へ、書込み対象のデータを書込むこと、を特徴とする請求項１乃至８のいずれか１項に記載の情報処理装置。
【請求項１０】
前記バックアップ記憶部で前記バックアップデータの書込みアドレスを記憶する書込みアドレス記憶手段と、
前記変更手段によって前記シーケンス番号記憶部に記憶されているシーケンス番号が変更された後に、前記書込みアドレス記憶手段に記憶する前記書込みアドレスを前記バックアップ記憶部の先頭アドレスとする書込みアドレス設定手段と、をさらに備えることを特徴とする請求項１乃至９のいずれか１項に記載の情報処理装置。
【請求項１１】
不揮発性の主記憶部と、前記主記憶部に記憶されたデータの複製を記憶する不揮発性のバックアップ記憶部と、前記バックアップ記憶部に記憶されたデータのそれぞれについて前記主記憶部へ書戻しが必要か否かを識別する際に用いられるシーケンス番号を記憶する不揮発性のシーケンス番号記憶部とを備える情報処理装置のデータ復旧方法であって、
プロセッサ部から送出された、前記主記憶部に対する書込み対象のデータと当該書込み対象のデータの書込み先を指定する書込み先アドレスとを含む書込みアクセスを検出した場合に、前記書込み先アドレスによって指定される記憶領域に既に記憶されている元データを読取る第１の読取ステップと、
前記シーケンス番号記憶部に記憶されているシーケンス番号を読取る第２の読取ステップと、
前記第１の読取ステップで読取られた前記元データと、前記書込みアクセスに含まれる前記書込み先アドレスと、前記第２の読取ステップで読取られた前記シーケンス番号と、前記元データと前記書込み先アドレスと前記シーケンス番号とが前記バックアップ記憶部に正常に書込まれたか否かを示す完全性検証用データとを含むバックアップデータを、前記バックアップ記憶部へ書込む第１の書込ステップと、
前記バックアップデータが前記バックアップ記憶部に書込まれた後、前記主記憶部の前記書込み先アドレスによって指定される記憶領域へ、前記書込み対象のデータを書込む第２の書込ステップと、
前記シーケンス番号記憶部に記憶されたシーケンス番号を変更する変更ステップと、
前記シーケンス番号が前回変更された時点における前記主記憶部の記憶内容へ、前記主記憶部の記憶内容を書戻す旨を指示された場合に、前記バックアップ記憶部に格納された前記バックアップデータの中から、前記シーケンス番号記憶部に記憶されたシーケンス番号を含み、かつ正常な書込みが行われたことを示す完全性検証用データを含むバックアップデータを選択する選択ステップと、
選択された前記バックアップデータに含まれる前記元データおよび前記書込み先アドレスを抽出する抽出ステップと、
前記バックアップデータから抽出された前記元データおよび前記書込みアドレスごとに、当該元データを当該書込み先アドレスが示す前記主記憶部上の記憶領域へ書込む第３の書込ステップと、
を含み、
前記完全性検証用データは、前記バックアップデータに含まれる、前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかと同一の値であり、
前記第１の書込ステップでは、前記バックアップデータを前記バックアップ記憶部へ書込む際に、前記バックアップデータに含まれる前記元データ、前記書込み先アドレス、前記シーケンス番号、および前記完全性検証用データのうち、前記完全性検証用データと同一の値となった前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかを最初に書込み、前記完全性検証用データを最後に書込むこと、を特徴とする情報処理装置のデータ復旧方法。
【請求項１２】
不揮発性の主記憶部と、前記主記憶部に記憶されたデータの複製を記憶する不揮発性のバックアップ記憶部と、前記バックアップ記憶部に記憶されたデータのそれぞれについて前記主記憶部へ書戻しが必要か否かを識別する際に用いられるシーケンス番号を記憶する不揮発性のシーケンス番号記憶部とを備える情報処理装置のデータ復旧方法であって、
プロセッサ部から送出された、前記主記憶部に対する書込み対象のデータと当該書込み対象のデータの書込み先を指定する書込み先アドレスとを含む書込みアクセスを検出した場合に、前記書込み先アドレスによって指定される記憶領域に既に記憶されている元データを読取る第１の読取ステップと、
前記シーケンス番号記憶部に記憶されているシーケンス番号を読取る第２の読取ステップと、
前記第１の読取ステップで読取られた前記元データと、前記書込みアクセスに含まれる前記書込み先アドレスと、前記第２の読取ステップで読取られた前記シーケンス番号と、前記元データと前記書込み先アドレスと前記シーケンス番号とが前記バックアップ記憶部に正常に書込まれたか否かを示す完全性検証用データとを含むバックアップデータを、前記バックアップ記憶部へ書込む第１の書込ステップと、
前記バックアップデータが前記バックアップ記憶部に書込まれた後、前記主記憶部の前記書込み先アドレスによって指定される記憶領域へ、前記書込み対象のデータを書込む第２の書込ステップと、
前記シーケンス番号記憶部に記憶されたシーケンス番号を変更する変更ステップと、
前記シーケンス番号が前回変更された時点における前記主記憶部の記憶内容へ、前記主記憶部の記憶内容を書戻す旨を指示された場合に、前記バックアップ記憶部に格納された前記バックアップデータの中から、前記シーケンス番号記憶部に記憶されたシーケンス番号を含み、かつ正常な書込みが行われたことを示す完全性検証用データを含むバックアップデータを選択する選択ステップと、
選択された前記バックアップデータに含まれる前記元データおよび前記書込み先アドレスを抽出する抽出ステップと、
前記バックアップデータから抽出された前記元データおよび前記書込みアドレスごとに、当該元データを当該書込み先アドレスが示す前記主記憶部上の記憶領域へ書込む第３の書込ステップと、
を含み、
前記完全性検証用データは、前記バックアップデータに含まれる、前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかと同一の値であり、
前記第１の書込手段は、前記バックアップデータを前記バックアップ記憶部へ書込む際に、前記バックアップデータに含まれる、前記元データ、前記書込み先アドレス、前記シーケンス番号、および前記完全性検証用データのうち、前記完全性検証用データを最初に書込み、前記完全性検証用データと同一の値となった前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかを最後に書込むこと、を特徴とする情報処理装置のデータ復旧方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、不揮発性の主記憶部を備える情報処理装置およびデータ復旧方法に関する。
【背景技術】
【０００２】
近年、フラッシュメモリ、ＭＲＡＭ（Magnetoresistive Random Access Memory）、ＦｅＲＡＭ（Ferroelectric Random Access Memory）やＰＲＡＭ（Phase change Random Access Memory）といった電源供給を断っても記録した内容が失われない不揮発性メモリの技術開発が進んでいる。将来、それらの不揮発性メモリが、現在コンピュータの主記憶部として広く使われているＤＲＡＭ等の揮発性メモリにとって代わることが予想される。
【０００３】
このような不揮発性メモリをコンピュータの主記憶部に使用すると、プログラムの処理中に主記憶部への電源供給が途切れた場合でも、その主記憶部に保存されたデータやシステムの状態は主記憶部に残り、失われない。これにより、電源供給復旧時に、電源が切れた瞬間の状態からコンピュータの動作を再開することが容易になり、コンピュータの起動時間が短縮され、操作性が向上する。また、不揮発性メモリは、揮発性メモリと異なり、記憶内容を保持するための電源装置が必要ないため、コンピュータ全体としての消費電力の削減、電池の小型化、電池の長寿命化が期待される。
【０００４】
このような不揮発性メモリを使用したコンピュータで不意の電源断を経てその後電源が復旧した際に、電源が切れた瞬間の状態を保持してかつ復元する方法としては、電源断が生じた場合に電源監視機構によってＣＰＵに割り込みが通知され、オペレーティングシステムのような制御ソフトウェアによってＣＰＵの状態を主記憶部に保存する方法が開示されている（特許文献１参照）。
【０００５】
【特許文献１】特開２００５−１０７５７３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、上記特許文献１に記載された技術では、不意の電源断に際して実行中の書込み処理を完結し、主記憶部として用いている不揮発性メモリ（以下、不揮発性主記憶部という）の内容を安定させるため、別途キャパシタ等の電池が必要である。一般にコンピュータが書込み処理を完結するために備える電池は、二次電池であることが多く、頻繁な電源断が生じた場合に十分な電力を供給できない可能性がある。
【０００７】
また、上記特許文献１に記載された技術では、不揮発性主記憶部の内容を含むコンピュータの状態を電源断以前の特定の時点の状態に戻すために、処理のログを取っている。この場合、ログ領域にログデータを書込んでいる途中で電池を含めた電源が切れると、ログデータが不完全な状態でログ領域に書込まれる可能性がある。そうすると、電源復旧時にログ領域に残されていたログから不揮発性主記憶部の内容を復元しようとしても、データが不完全なため復元に必要なログデータを特定できない。このため、データの復元に失敗し、結果的に以前のどの状態も復元できず、処理を継続することができなくなってしまうという問題があった。
【０００８】
本発明は、上記に鑑みてなされたものであって、不揮発性主記憶部を備えたコンピュータにおいて、電池のような追加の電源を用いることなく、不意の電源断が起きた場合でも、その後の電源復旧時に不揮発性主記憶部に格納されたデータの状態を復元することができる情報処理装置およびデータ復旧方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
上述した課題を解決し、目的を達成するために、本発明にかかる情報処理装置は、不揮発性の主記憶部と、前記主記憶部に記憶されたデータの複製を記憶する不揮発性のバックアップ記憶部と、前記バックアップ記憶部に記憶されたデータのそれぞれについて前記主記憶部へ書戻しが必要か否かを識別する際に用いられるシーケンス番号を記憶する不揮発性のシーケンス番号記憶部と、プロセッサ部から送出された、前記主記憶部に対する書込み対象のデータと当該書込み対象のデータの書込み先を指定する書込み先アドレスとを含む書込みアクセスを検出した場合に、前記書込み先アドレスによって指定される記憶領域に既に記憶されている元データを読取る第１の読取手段と、前記シーケンス番号記憶部に記憶されているシーケンス番号を読取る第２の読取手段と、前記第１の読取手段で読取られた前記元データと、前記書込みアクセスに含まれる前記書込み先アドレスと、前記第２の読取手段で読取られた前記シーケンス番号と、前記元データと前記書込み先アドレスと前記シーケンス番号とが前記バックアップ記憶部に正常に書込まれたか否かを示す完全性検証用データとを含むバックアップデータを、前記バックアップ記憶部へ書込む第１の書込手段と、前記バックアップデータが前記バックアップ記憶部に書込まれた後、前記主記憶部の前記書込み先アドレスによって指定された記憶領域へ、前記書込み対象のデータを書込む第２の書込手段と、前記シーケンス番号記憶部に記憶されたシーケンス番号を変更する変更手段と、前記シーケンス番号が前回変更された時点における前記主記憶部の記憶内容へ、前記主記憶部の記憶内容を書戻す旨を指示された場合に、前記バックアップ記憶部に格納された前記バックアップデータの中から、前記シーケンス番号記憶部に記憶されたシーケンス番号を含み、かつ正常な書込みが行われたことを示す完全性検証用データを含むバックアップデータを選択する選択手段と、選択された前記バックアップデータに含まれる前記元データおよび前記書込み先アドレスを抽出する抽出手段と、前記バックアップデータから抽出された前記元データおよび前記書込みアドレスごとに、当該元データを当該書込み先アドレスが示す前記主記憶部上の記憶領域へ書込む第３の書込手段と、を備え、前記完全性検証用データは、前記バックアップデータに含まれる、前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかと同一の値であり、前記第１の書込手段は、前記バックアップデータを前記バックアップ記憶部へ書込む際に、前記バックアップデータに含まれる前記元データ、前記書込み先アドレス、前記シーケンス番号、および前記完全性検証用データのうち、前記完全性検証用データと同一の値となった前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかを最初に書込み、前記完全性検証用データを最後に書込むこと、を特徴とする。
【００１０】
また、本発明にかかるデータ復旧方法は、不揮発性の主記憶部と、前記主記憶部に記憶されたデータの複製を記憶する不揮発性のバックアップ記憶部と、前記バックアップ記憶部に記憶されたデータのそれぞれについて前記主記憶部へ書戻しが必要か否かを識別する際に用いられるシーケンス番号を記憶する不揮発性のシーケンス番号記憶部とを備える情報処理装置のデータ復旧方法であって、プロセッサ部から送出された、前記主記憶部に対する書込み対象のデータと当該書込み対象のデータの書込み先を指定する書込み先アドレスとを含む書込みアクセスを検出した場合に、前記書込み先アドレスによって指定される記憶領域に既に記憶されている元データを読取る第１の読取ステップと、前記シーケンス番号記憶部に記憶されているシーケンス番号を読取る第２の読取ステップと、前記第１の読取ステップで読取られた前記元データと、前記書込みアクセスに含まれる前記書込み先アドレスと、前記第２の読取ステップで読取られた前記シーケンス番号と、前記元データと前記書込み先アドレスと前記シーケンス番号とが前記バックアップ記憶部に正常に書込まれたか否かを示す完全性検証用データとを含むバックアップデータを、前記バックアップ記憶部へ書込む第１の書込ステップと、前記バックアップデータが前記バックアップ記憶部に書込まれた後、前記主記憶部の前記書込み先アドレスによって指定される記憶領域へ、前記書込み対象のデータを書込む第２の書込ステップと、前記シーケンス番号記憶部に記憶されたシーケンス番号を変更する変更ステップと、前記シーケンス番号が前回変更された時点における前記主記憶部の記憶内容へ、前記主記憶部の記憶内容を書戻す旨を指示された場合に、前記バックアップ記憶部に格納された前記バックアップデータの中から、前記シーケンス番号記憶部に記憶されたシーケンス番号を含み、かつ正常な書込みが行われたことを示す完全性検証用データを含むバックアップデータを選択する選択ステップと、選択された前記バックアップデータに含まれる前記元データおよび前記書込み先アドレスを抽出する抽出ステップと、前記バックアップデータから抽出された前記元データおよび前記書込みアドレスごとに、当該元データを当該書込み先アドレスが示す前記主記憶部上の記憶領域へ書込む第３の書込ステップと、を含み、前記完全性検証用データは、前記バックアップデータに含まれる、前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかと同一の値であり、前記第１の書込ステップでは、前記バックアップデータを前記バックアップ記憶部へ書込む際に、前記バックアップデータに含まれる前記元データ、前記書込み先アドレス、前記シーケンス番号、および前記完全性検証用データのうち、前記完全性検証用データと同一の値となった前記元データ、前記書込み先アドレス、前記シーケンス番号のいずれかを最初に書込み、前記完全性検証用データを最後に書込むこと、を特徴とする。
【発明の効果】
【００１１】
本発明によれば、不揮発性主記憶部を備えた情報処理装置において、追加の電源を用いることなく、不意の電源断が起きた場合でも、その後の電源復旧時に不揮発性主記憶部に格納されたデータの状態を復元することができるという効果を奏する。
【発明を実施するための最良の形態】
【００１２】
以下に添付図面を参照して、この発明にかかる情報処理装置およびデータ復旧方法の最良な実施の形態を詳細に説明する。本発明にかかる情報処理装置をパーソナルコンピュータ（以下、ＰＣと示す）に適用した例を示すが、これに限定されるものではなく、主記憶部を備える装置であれば、サーバ装置、ゲーム機等の様々な装置に適用することができる。
【００１３】
本実施の形態について、添付図面を参照して説明する。まず、本発明が適用されるＰＣの構成例について説明する。図１は、本実施の形態にかかるＰＣの構成を示すブロック図である。
【００１４】
本実施の形態にかかるＰＣ１００は、バックアップ部１１０と、不揮発性主記憶部１２０と、不揮発性バックアップメモリ１３０と、コミット部１４０と、ロールバック部１５０と、プロセッサ部１６０と、制御ソフトウェア１７０と、バス１８０とを備えている。また、ＰＣ１００は、電源線１０を介して電源２００から電力を供給されている。
【００１５】
不揮発性主記憶部１２０は、ＭＲＡＭやＦｅＲＡＭ等の不揮発性メモリである。不揮発性主記憶部１２０には、プロセッサ部１６０上で動作するソフトウェアのプログラムやそのソフトウェアが使用するデータが格納される。なお、プロセッサ部１６０は、不揮発性主記憶部１２０へ書込みを行う際に、書込みアクセスを主記憶アクセス制御部１１１へ送出する。主記憶アクセス制御部１１１は、プロセッサ部１６０から受信した書込みアクセスに応じて、不揮発性主記憶部１２０への書込みを行う。ここで、書込みアクセスとは、プロセッサ部１６０が不揮発性主記憶部１２０へ書込むデータと、そのデータの書込み先を指定する不揮発性主記憶部１２０のアドレス（以下、書込み先アドレスという）とを含む情報である。
【００１６】
不揮発性バックアップメモリ１３０は、不揮発性主記憶部１２０と同様に不揮発性メモリである。不揮発性バックアップメモリ１３０は、バックアップデータを記録する。ここで、バックアップデータとは、不意の電源断後の電源復旧時に不揮発性主記憶部１２０に格納されていたデータを復旧するために用いるデータであり、具体的には少なくとも不揮発性主記憶部１２０における更新されるデータのアドレスである書込み先アドレスと、そのアドレスに格納されていた更新前のデータ（以下、元データという）と、シーケンス番号と、完全性検証用データとを含む。
【００１７】
ここで、シーケンス番号とは、不揮発性バックアップメモリ１３０に格納されている一連のバックアップデータを識別する情報である。すなわち、不揮発性主記憶部１２０へのデータの書戻しを行う際に、不揮発性バックアップメモリ１３０に格納されたバックアップデータのうち、不揮発性主記憶部１２０へ書戻しが必要か否かを識別するために用いられる。例えば、連続した整数などを使用することが考えられる。そして、シーケンス番号は後述するシーケンス番号保持部１１８に記憶される。また、完全性検証用データとは、不揮発性バックアップメモリ１３０に格納されたバックアップデータが正常に書かれたものであるか否かを判断するためのデータである。
【００１８】
次に、不揮発性バックアップメモリ１３０に格納されるバックアップデータのデータ構成について説明する。図２は、不揮発性バックアップメモリ１３０に格納されるバックアップデータのデータ構成の一例を示す説明図である。バックアップデータ２０は、シーケンス番号２１、書込み先アドレス２２、元データ２３、完全性検証用データ２４の順に、不揮発性バックアップメモリ１３０に格納され、これら４つのデータの組で１つのバックアップデータを構成している。
【００１９】
また、他のバックアップデータのデータ構成について説明する。図３は、不揮発性バックアップメモリ１３０に格納されるバックアップデータのデータ構成の一例を示す説明図である。バックアップデータ３０は、完全性検証用データ３１、書込み先アドレス３２、シーケンス番号３３、元データ３４の順に、不揮発性バックアップメモリ１３０に格納され、これら４つのデータの組で１つのバックアップデータを構成している。
【００２０】
なお、完全性検証用データの内容は、シーケンス番号を用いてもよい。また、完全性検証用データの内容として、元データをそのまま用いてもよい。この場合、バックアップデータ全体が正しく書込まれたか否かの検証は、完全性検証用データとシーケンス番号とが一致するか否か、または完全性検証用データと元データとが一致するか否かによって判断できる。二つのデータが一致する場合は、バックアップデータ全体が正常に書込まれたと判断される。一方、二つのデータが一致しない場合は、バックアップデータ全体が正常に書込まれていないと判断されるため、そのバックアップデータはデータ復旧には用いない。
【００２１】
このような判断方法は、バックアップデータを構成するデータが不揮発性バックアップメモリ１３０に書かれる順番を考慮したものある。例えば、図２のデータ構造で完全性検証用データにシーケンス番号をそのまま用いた場合、不揮発性バックアップメモリ１３０でのバックアップデータの両端の記憶領域に格納された二つのデータが正しく書かれていると判断されれば、データ構造上でシーケンス番号の記憶領域と完全性検証用データの記憶領域の間の記憶領域に格納されている書込み先アドレスと元データも正しく書かれていると判断できる。
【００２２】
同様に、図３の場合は、完全性検証用データと元データが正しく書かれていることが判断できれば、完全性検証用データの記憶領域と元データの記憶領域との間の記憶領域に格納されている書込み先アドレスとシーケンス番号も正しく書かれていると判断することができる。
【００２３】
なお、完全性検証用データは、完全性の検証によって、バックアップデータを構成する各データが全て正しく書かれているか、もしくはいずれかのデータが間違っている可能性があるかを判断できるデータであればよい。よって、完全性検証用データには、元データ、書込み先アドレス、シーケンス番号のいずれかを利用して排他的論理和を計算したパリティデータや、誤り訂正符号を利用したデータでもよく、データの内容や作成方法に関して特定の方法を強いるものではない。
【００２４】
バックアップ部１１０は、不揮発性主記憶部１２０への書込み時にバックアップデータを作成して不揮発性バックアップメモリ１３０に書込む。具体的には、バックアップ部１１０は、主記憶アクセス制御部１１へ送出された不揮発性主記憶部１２０への書込みアクセスを検出した場合に、書込みアクセスに含まれた書込み先アドレスに格納されている元データを不揮発性主記憶部１２０から読み出す。次に、バックアップ部１１０は、書込み先アドレスと元データとシーケンス番号と完全性検証用データの組からバックアップデータを生成し、不揮発性バックアップメモリ１３０に格納する。その後、バックアップ部１１０は、書込みアクセスに含まれる不揮発性主記憶部１２０に書込みを指示されたデータを、実際に不揮発性主記憶部１２０の書込み先アドレスによって指定された記憶領域に書込む。
【００２５】
バックアップ部１１０は、さらに主記憶アクセス制御部１１１と、バックアップ制御部１１２と、バックアップメモリアクセス制御部１１３と、バックアップデータ生成部１１４と、完全性検証用データ生成部１１５と、バックアップメモリ先頭アドレス保持部１１６と、書込ポインタ保持部１１７と、シーケンス番号保持部１１８とを備えている。
【００２６】
主記憶アクセス制御部１１１は、バス１８０を介して受信した不揮発性主記憶部１２０への読み書きアクセスに応じ、不揮発性主記憶部１２０に格納されたデータを読み出し、不揮発性主記憶部１２０にデータを書込む。ただし、主記憶アクセス制御部１１１は、バス１８０を介した不揮発性主記憶部１２０への書込みアクセスが検出された場合に、すぐに不揮発性主記憶部１２０にデータを書込まず、一旦バックアップ制御部１１２に書込み先アドレスを送出する。
【００２７】
また、主記憶アクセス制御部１１１は、バックアップ制御部１１２からの不揮発性主記憶部１２０へのアクセスに応じ、不揮発性主記憶部１２０に格納されたデータを読み書きする。主記憶アクセス制御部１１１は、バス１８０を介した不揮発性バックアップメモリ１３０へのアクセスをバックアップ制御部１１２に送出する。また、主記憶アクセス制御部１１１は、書込ポインタ保持部１１７およびシーケンス番号保持部１１８へのアクセスをバックアップ制御部１１２に送出する。
【００２８】
バックアップ制御部１１２は、主記憶アクセス制御部１１１から不揮発性記憶部１２０への書込みアクセスを受信した場合、データをバックアップするために、主記憶アクセス制御部１１１を経由して不揮発性主記憶部１２０から不揮発性主記憶部１２０の書込み先アドレスが示す記憶領域に格納されているデータを読み出す。また、バックアップ制御部１１２は、バックアップデータ生成部１１４に書込み先アドレスおよび不揮発性主記憶部１２０から読み出したデータを送出する。
【００２９】
また、バックアップ制御部１１２は、バックアップメモリアクセス制御部１１３を経由して不揮発性バックアップメモリ１３０に格納されたデータを読み書きする。また、バックアップ制御部１１２は、書込ポインタ保持部１１７に格納された書込ポインタ、バックアップメモリ先頭アドレス保持部１１６に格納されたバックアップメモリ先頭アドレス、およびシーケンス番号保持部１１８に格納されたシーケンス番号を読み書きする。バックアップ制御部１１２は、シーケンス番号保持部１１８から読み出したシーケンス番号をバックアップデータ生成部１１４に送る。
【００３０】
バックアップメモリアクセス制御部１１３は、バックアップ制御部１１２からのアクセスに応じて不揮発性バックアップメモリ１３０に格納されたデータを読み書きする。
【００３１】
バックアップデータ生成部１１４は、バックアップ制御部１１２から送信された不揮発性主記憶部１２０の書込み先アドレス、不揮発性主記憶部１２０の書込み先アドレスが示す記憶領域から読み出した元データおよびシーケンス番号からバックアップデータを生成する。
【００３２】
完全性検証用データ生成部１１５は、バックアップデータ生成部１１４から受け取ったデータをもとに、ロールバック時に不揮発性バックアップメモリ１３０から読み出したバックアップデータが書込みに成功したデータか否かを検証するために利用する完全性検証用データを作成する。
【００３３】
バックアップメモリ先頭アドレス保持部１１６は、不揮発性バックアップメモリ１３０の先頭アドレスを保持する。バックアップメモリ先頭アドレス保持部１１６は、バックアップ制御部１１２からの要求に応じてその内容を更新する、またはその内容をバックアップ制御部１１２に送出する。
【００３４】
書込ポインタ保持部１１７は、書込ポインタを保持する。ここで、書込ポインタは、バックアップデータを書込む不揮発性バックアップメモリ１３０上のアドレスである。書込ポインタ保持部１１７は、バックアップ制御部１１２からの要求に応じてその内容を更新し、またはその内容をバックアップ制御部１１２に送出する。
【００３５】
シーケンス番号保持部１１８は、バックアップデータの生成に使用するシーケンス番号を保持する。シーケンス番号保持部１１８は、後述するコミット部１４０のシーケンス番号更新部１４５からの要求に応じて保持しているシーケンス番号を更新する。また、シーケンス番号保持部１１８は、バックアップ制御部１１２からの要求に応じて保持しているシーケンス番号を送出する。なお、このシーケンス番号保持部１１８は揮発性であっても不揮発性であっても構わない。
【００３６】
また、バックアップ部１１０は、バックアップ処理そのものを行うか否かのスイッチを備え、不揮発性主記憶部１２０への書込みに対するバックアップ処理全体を有効にしたり無効にしたりする機能もあわせ持つ。なお、不揮発性主記憶部１２０に対する書込みアクセスを検出した場合にバックアップ処理を行うか否かを示すこのスイッチは、物理的なスイッチでも、メモリ上に保持した情報であってもよい。
【００３７】
コミット部１４０は、コミット処理を行う。コミット処理とは、突然の電源断を経て電源が復旧した場合であって、不揮発性主記憶部１２０の状態を復元する必要が生じた場合に、復元目標となる不揮発性主記憶部１２０の状態（以下、チェックポイントという）を作成する一連の処理のことである。
【００３８】
コミット部１４０がコミット処理を行うことにより新しいチェックポイントが作成されると、不揮発性バックアップメモリ１３０に格納されている、不揮発性主記憶部１２０の状態を一つ前のチェックポイントの状態に復元するためのバックアップデータは不要になる。このため、コミット処理では、一番最近のコミット処理以降に不揮発性バックアップメモリ１３０に格納したバックアップデータを無効化することが必要となる。
【００３９】
本実施の形態にかかるバックアップデータには、不揮発性主記憶部１２０に書戻すために使用する一連のバックアップデータを識別する情報であるシーケンス番号が含まれている。これにより、不揮発性バックアップメモリ１３０への１回または複数回のバックアップ処理を行った後にこのシーケンス番号を新しいものに変更することで、変更前のシーケンス番号を含むバックアップデータを不揮発性バックアップメモリ１３０上から物理的に削除することなく無効化することができる。つまり、本実施の形態においてはシーケンス番号を更新することがコミット処理の一部となっている。本実施の形態においては、シーケンス番号保持部１１８が保持しているものと同じシーケンス番号を持つ一つもしくは複数のバックアップデータのことを最新シーケンスと呼ぶ。
【００４０】
コミット部１４０は、さらにコミット制御部１４１と、書込ポインタアクセス部１４２と、コミットデータ書込部１４３と、コミットデータ書込アドレス保持部１４４と、シーケンス番号更新部１４５とを備えている。
【００４１】
コミット制御部１４１は、制御ソフトウェア１７０からの指示により、書込ポインタアクセス部１４２と、コミットデータ書込部１４３と、シーケンス番号更新部１４５と、コミットデータ書込アドレス保持部１４４によってコミット処理全体を制御して、チェックポイントを作成する。
【００４２】
書込ポインタアクセス部１４２は、バックアップ部１１０が備える書込ポインタ保持部１１７の内容を読み書きする要求をバス１８０に送出する。コミットデータ書込アドレス保持部１４４は、コミット処理の最後で不揮発性主記憶部１２０への書込み処理を行う場合に指定する不揮発性主記憶部１２０上の記憶領域を示す書込み先アドレスの値を保持する。コミットデータ書込アドレス保持部１４４の内容は、コミット制御部１４１の指示により読み書きされる。シーケンス番号更新部１４５は、バス１８０を介して、バックアップ部１１０のシーケンス番号保持部１１８が保持しているシーケンス番号を読み書きする。
【００４３】
コミットデータ書込部１４３は、コミット処理において、コミットデータ書込アドレス保持部１４４に保持されている不揮発性主記憶部１２０のアドレスに、書込ポインタアクセス部１４２が読み出した書込ポインタ保持部１１７の内容を書込む場合に、その書込み要求をバス１８０に送出する。シーケンス番号更新部１４５は、バックアップ部１１０に備えるシーケンス番号保持部１１８の内容を更新する要求をバス１８０に送出する。
【００４４】
ロールバック部１５０は、不揮発性バックアップメモリ１３０に格納されているバックアップデータから不揮発性主記憶部１２０の内容復元に必要な最新シーケンスを探し出して読み出し、不揮発性主記憶部１２０にバックアップデータから抽出した元データを書き戻す。この操作により不揮発性主記憶部１２０の状態として一番最近に作成したチェックポイントの状態を復元する。
【００４５】
ロールバック部１５０は、さらにロールバック制御部１５１と、ロールバックデータ特定部１５２と、ロールバックデータ読出部１５３と、ロールバックデータ書戻部１５４とを備えている。
【００４６】
ロールバック制御部１５１は、制御ソフトウェア１７０からの指示によって、ロールバックデータ特定部１５２と、ロールバックデータ読出部１５３と、ロールバックデータ書戻部１５４とで実現されるロールバック処理を制御する。
【００４７】
ロールバックデータ特定部１５２は、不揮発性バックアップメモリ１３０からロールバック時に必要なデータを特定する。ロールバックデータ特定部１５２は、上述したとおり、不揮発性バックアップメモリ１３０へのバックアップデータの書込み処理中に不意の電源断が発生し、当該書込み処理が不完全に終わった場合でも、バックアップデータが持つ完全性検証用データを使用し、バックアップデータの完全性検証を行うことにより、ロールバックに必要なバックアップデータを正しく特定する。このために、特定の計算装置を備えてもよい。
【００４８】
ロールバックデータ読出部１５３は、ロールバックデータ特定部１５２によって特定されたロールバックに必要なバックアップデータを不揮発性バックアップメモリ１３０から読み出す。
【００４９】
ロールバックデータ書戻部１５４は、ロールバックデータ読出部１５３が読み出したバックアップデータから、元データと、その元データを書き戻す不揮発性主記憶部１２０内の書込み先アドレスを取得する。ロールバックデータ書戻部１５４は、元データを不揮発性主記憶部１２０の書込み先アドレスで指定された記憶領域に書込む。
【００５０】
プロセッサ部１６０は、制御ソフトウェア１７０を動作させる。制御ソフトウェア１７０は、通常の処理においては不揮発性主記憶部１２０のデータを操作してシステム固有の機能を提供する。また、制御ソフトウェア１７０は、適切なタイミング（例えば、一定時間ごとに）でコミット部１４０に要求を出し、不揮発性主記憶部１２０のチェックポイントを作成する。制御ソフトウェア１７０は、電源復帰時にはロールバック部１５０に要求を出し、前回のチェックポイントまで不揮発性主記憶部１２０の状態を戻す処理を行う。
【００５１】
バス１８０は、コミット部１４０、ロールバック部１５０、プロセッサ部１６０およびバックアップ部１１０を接続する。不揮発性主記憶部１２０は、バス１８０に直接接続されず、バックアップ部１１０を介してバス１８０と接続する。これにより、不揮発性主記憶部１２０へのアクセスは、すべてバックアップ部１１０を介するため、バックアップ部１１０において不揮発性主記憶部１２０へのアクセスに応じたバックアップ処理を行うことができる。なお、バックアップ部１１０の配置位置は、バス１８０と不揮発性主記憶部１２０の間に限らず、不揮発性主記憶部１２０へのアクセスを不揮発性主記憶部１２０が受け取る前に受け取ることができる位置であれば、どの位置に配置されていてもよい。また、バックアップ部１１０には、不揮発性主記憶部１２０に加え、不揮発性バックアップメモリ１３０が接続される。
【００５２】
次に、以上のように構成されているバックアップ部１１０によるバックアップ処理、コミット部１４０によるコミット処理およびロールバック部１５０によるロールバック処理について説明する。
【００５３】
図４−１、図４−２は、バックアップ部１１０が行うバックアップ処理手順を示すフローチャートである。なお、バックアップ部１１０は、バス１８０からのアクセスを受け取って動作する。
【００５４】
まず、主記憶アクセス制御部１１１は、バス１８０からのアクセスを検出する（ステップＳ４０１）。主記憶アクセス制御部１１１は、検出したアクセスが不揮発性主記憶部１２０への読出しアクセスであるか否かを判断する（ステップＳ４０２）。具体的には、アクセスに含まれる命令から不揮発性主記憶部１２０への読出しアクセスであるか否かを判断する。なお、主記憶アクセス制御部１１１は、読出しアクセスに限らず、書込みアクセス等の他のアクセスについても同様に、アクセスに含まれる命令からアクセスの種類やアクセスする記憶媒体を判断する。
【００５５】
検出したアクセスが不揮発性主記憶部１２０への読出しアクセスであると判断した場合は（ステップＳ４０２：Ｙｅｓ）、主記憶アクセス制御部１１１は不揮発性主記憶部１２０からデータを読み出し（ステップＳ４０３）、バス１８０へ読み出したデータを返す。
【００５６】
検出したアクセスが不揮発性主記憶部１２０への読出しアクセスでないと判断した場合は（ステップＳ４０２：Ｎｏ）、主記憶アクセス制御部１１１がバックアップ制御部１１２にアクセスを送出し、バックアップ制御部１１２がアクセスを受け取る（ステップＳ４０４）。バックアップ制御部１１２は、受け取ったアクセスが不揮発性主記憶部１２０への書込みアクセスであるか否かを判断する（ステップＳ４０５）。
【００５７】
受け取ったアクセスが不揮発性主記憶部１２０への書込みアクセスであると判断した場合は（ステップＳ４０５：Ｙｅｓ）、バックアップ制御部１１２はバックアップ処理が有効であるか否かを判断する（ステップＳ４０６）。バックアップ処理が有効でないと判断した場合は（ステップＳ４０６：Ｎｏ）、バックアップ処理は行わず、ステップＳ４１２に進む。バックアップ処理が有効であると判断した場合は（ステップＳ４０６：Ｙｅｓ）、バックアップ制御部１１２は主記憶アクセス制御部１１１に読出し要求を送出し、主記憶アクセス制御部１１１が不揮発性主記憶部１２０から書込み先アドレスに示す記憶領域に格納されている元データを読み出す（ステップＳ４０７）。次に、バックアップ部１１０はバックアップデータ生成処理を行う（ステップＳ４０８）。このバックアップデータ生成処理の詳細は後述する。
【００５８】
バックアップ制御部１１２は、生成したバックアップデータを書込む不揮発性バックアップメモリ１３０上のアドレスを書込ポインタ保持部１１７から読み出す（ステップＳ４０９）。バックアップメモリアクセス制御部１１３は、読み出した不揮発性バックアップメモリ１３０上のアドレスにバックアップデータを書込む（ステップＳ４１０）。バックアップ制御部１１２は、書込ポインタ保持部１１７に保持しているポインタの値を更新する（ステップＳ４１１）。主記憶アクセス制御部１１１は、不揮発性主記憶部１２０の書込み先アドレスにデータを書込む（ステップＳ４１２）。
【００５９】
ステップＳ４０５において、受け取ったアクセスが不揮発性主記憶部１２０への書込みアクセスでないと判断した場合は（ステップＳ４０５：Ｎｏ）、バックアップ制御部１１２は不揮発性バックアップメモリ１３０へのアクセスであるか否かを判断する（ステップＳ４１３）。不揮発性バックアップメモリ１３０へのアクセスであると判断した場合は（ステップＳ４１３：Ｙｅｓ）、バックアップメモリアクセス制御部１１３は不揮発性バックアップメモリ１３０のデータを読出す、または不揮発性バックアップメモリ１３０にデータを書込む（ステップＳ４１４）。
【００６０】
不揮発性バックアップメモリ１３０へのアクセスでないと判断した場合は（ステップＳ４１３：Ｎｏ）、バックアップ制御部１１２は書込ポインタ保持部１１７へのアクセスであるか否かを判断する（ステップＳ４１５）。書込ポインタ保持部１１７へのアクセスであると判断した場合は（ステップＳ４１５：Ｙｅｓ）、バックアップ制御部１１２は書込ポインタ保持部１１７の値を読み出す、または更新する（ステップＳ４１６）。
【００６１】
書込ポインタ保持部１１７へのアクセスでないと判断した場合は（ステップＳ４１５：Ｎｏ）、バックアップ制御部１１２はシーケンス番号保持部１１８へのアクセスであるか否かを判断する（ステップＳ４１７）。シーケンス番号保持部１１８へのアクセスでないと判断した場合は（ステップＳ４１７：Ｎｏ）、処理を終了する。
【００６２】
シーケンス番号保持部１１８へのアクセスであると判断した場合は（ステップＳ４１７：Ｙｅｓ）、バックアップ制御部１１２はシーケンス番号保持部１１８に保持されたシーケンス番号を読み出す、または更新する（ステップＳ４１８）。その後、バックアップ制御部１１２は、アクセスがシーケンス番号保持部１１８へのアクセスであった場合、そのアクセスが書込みだったか否かを判断する（ステップＳ４１９）。アクセスが書込みであると判断した場合は（ステップＳ４１９：Ｙｅｓ）、すなわちコミット処理の一部であると判断した場合は、書込ポインタ保持部１１７に保持された書込ポインタを再設定する（ステップＳ４２０）。ここで、不揮発性バックアップメモリ１３０をスタックとして使用している場合は、書込ポインタを不揮発性バックアップメモリ１３０の先頭アドレスに設定する。また、不揮発性バックアップメモリ１３０をリングバッファとして使用している場合は、書込ポインタを動かす必要はないのでなにも処理しない。アクセスが書込みでないと判断した場合は（ステップＳ４１９：Ｎｏ）、処理を終了する。このように、バックアップ制御部１１２がシーケンス番号を書込む際に書込ポインタ保持部１１７が保持している書込ポインタを再設定することにより、コミット処理の一部を実現している。このコミット処理時に行われるシーケンス番号設定処理と書込ポインタの再設定処理は、一括して行う必要がある。これは新しいシーケンス番号を使用したバックアップデータが間違った場所に書込まれることを防ぐためである。
【００６３】
次に、図４−１のステップＳ４０８で実行するバックアップデータ生成処理について説明する。図５は、バックアップ部１１０が行うバックアップデータ生成処理手順を示すフローチャートである。
【００６４】
まず、バックアップ制御部１１２は、シーケンス番号保持部１１８からシーケンス番号を読み出す（ステップＳ５０１）。バックアップ制御部１１２は、不揮発性主記憶部１２０の元データと書込み先アドレスとシーケンス番号とをバックアップデータ生成部１１４に送出する（ステップＳ５０２）。バックアップデータ生成部１１４は、元データと書込み先アドレスとシーケンス番号からバックアップデータを生成し、完全性検証用データ生成部１１５に送出する（ステップＳ５０３）。
【００６５】
完全性検証用データ生成部１１５は、受け取ったバックアップデータから完全性検証用データを生成する（ステップＳ５０４）。完全性検証用データ生成部１１５は、完全性検証用データを加えたバックアップデータを生成し、生成したバックアップデータをバックアップデータ生成部１１４に送出する（ステップＳ５０５）。なお、バックアップデータ内での完全性検証用データは、バックアップデータ全体が正常に書込まれたことを判断できる位置に格納される。バックアップデータは、例えば上述した図２または図３のようなデータ構成となる。バックアップデータ生成部１１４は、完全性検証用データを含むバックアップデータをバックアップ制御部１１２に送出する（ステップＳ５０６）。
【００６６】
次に、コミット部１４０によるコミット処理について説明する。図６は、コミット部１４０によるコミット処理手順を示すフローチャートである。
【００６７】
まず、コミット部１４０において、シーケンス番号更新部１４５が、バックアップ部１１０のシーケンス番号保持部１１８からシーケンス番号を読み出す（ステップＳ６０１）。シーケンス番号更新部１４５は、読み出したシーケンス番号に１を加算して新シーケンス番号とする（ステップＳ６０２）。シーケンス番号更新部１４５は、バックアップ部１１０のバックアップ制御部１１２にシーケンス番号保持部１１８への新シーケンス番号の設定を要求する（ステップＳ６０３）。
【００６８】
バックアップ制御部１１２は、シーケンス番号保持部１１８に新シーケンス番号を設定する（ステップＳ６０４）。バックアップ制御部１１２は、不揮発性バックアップメモリ１３０の使用方法（スタックかリングバッファか等）にしたがって書込ポインタ保持部１１７の書込ポインタを再設定する（ステップＳ６０５）。なお、ステップＳ６０４およびステップＳ６０５の処理は、上述したバックアップ部１１０での図４−２のステップＳ４１７〜ステップＳ４２０の処理である。
【００６９】
なお、もしシーケンス番号保持部１１８が不揮発性であった場合は、以下で説明するステップＳ６０６以降の処理を行わなくてもよい。これは、シーケンス番号保持部１１８が不揮発性であれば、突然の電源断が起きてもシーケンス番号保持部１１８が保持しているシーケンス番号が失われないからである。逆にいえば、ステップＳ６０６以降の処理は、シーケンス番号保持部１１８が揮発性であった場合には必須の処理である。この処理は、突然の電源断によってシーケンス番号保持部１１８が保持しているシーケンス番号を失っても処理が継続できるように、コミット処理の際に不揮発性バックアップメモリ１３０に同じシーケンス番号のバックアップデータを残すことが目的である。
【００７０】
書込ポインタアクセス部１４２は、バックアップ部１１０の書込ポインタ保持部１１７から書込ポインタを読み出す（ステップＳ６０６）。コミットデータ書込部１４３は、コミットデータ書込アドレス保持部１４４からコミットデータを書込む不揮発性主記憶部１２０のアドレスを取得する（ステップＳ６０７）。コミットデータ書込部１４３は、書込ポインタの値を今取得した不揮発性記憶部１２０のアドレスが示す記憶領域に書込む要求をする（ステップＳ６０８）。これに応じて、図４−１、図４−２に示すバックアップ処理が実行される。これにより、バックアップ部１１０が再設定した書込ポインタの位置に新シーケンス番号を含むバックアップデータが書込まれるため、不揮発性バックアップメモリ１３０上に格納されていた最新シーケンスが無効化され、新たに格納されたバックアップデータが最新シーケンスとなる。
【００７１】
次に、コミット処理時に不揮発性バックアップメモリ１３０に格納されているデータの遷移について説明する。図７−１〜図７−３は、コミット処理時の不揮発性バックアップメモリ（スタック）の状態の一例を示す説明図である。図７−１は、コミット部１４０がコミット処理を開始する前の不揮発性バックアップメモリ１３０の状態を示している。バックアップデータ７３は、１つのバックアップデータを示し、図７−１の不揮発性バックアップメモリ１３０には、複数のバックアップデータが格納されている。このとき、シーケンス番号保持部１１８が保持しているシーケンス番号が“９９”であることから、不揮発性バックアップメモリ１３０に格納されているシーケンス番号“９９”のバックアップデータすべてが最新シーケンス７４である。また、バックアップメモリ先頭アドレスが指す位置７１は、不揮発性バックアップメモリ１３０の先頭アドレスである。また、書込ポインタの指す位置７２は、最新シーケンス７４において次のバックアップデータが書込まれる位置を示している。また、データは、Ａ→Ａ’の方向に書込んでいく。
【００７２】
図７−２は、シーケンス番号および書込みポインタが更新された状態を示している。まず、コミット部１４０は、制御ソフトウェア１７０からのコミット要求に応じて、シーケンス番号を更新する。図７−１の時点でバックアップ部１１０のシーケンス番号保持部１１８が保持しているシーケンス番号は“９９”であるから、コミット部１４０は９９に１を加算した値、つまり“１００”を新シーケンス番号として設定する。次に、バックアップ部１１０は、書込ポインタを再設定する。すなわち、バックアップ部１１０は、書込ポインタ保持部１１７にバックアップメモリ先頭アドレス保持部１１６が保持している値を設定する。この２つの処理を行うことにより、書込ポインタの指す位置７２が不揮発性バックアップメモリ１３０の先頭アドレスとなる。シーケンス番号保持部１１８が不揮発性の場合は、ここまででコミット処理を終了しても構わない。
【００７３】
図７−３は、新しいシーケンス番号を使用したバックアップデータを書込んだ状態を示している。コミット部１４０は、コミットデータ書込アドレス保持部１４４に格納されている不揮発性主記憶部１２０内のアドレスを読み出し、読み出したアドレスの領域に書込ポインタの値を書込む。その書込み処理に対してバックアップ処理が行われ、新シーケンス番号つまりシーケンス番号“１００”のバックアップデータが、不揮発性バックアップメモリ１３０に格納される。これらの処理を行うことにより、図７−３に示すように、シーケンス番号“９９”のバックアップデータにシーケンス番号“１００”のバックアップデータが上書きされる。シーケンス番号“９９”のバックアップデータは古いシーケンスとなり、シーケンス番号“１００”のバックアップデータが最新のシーケンスとなる。つまり、コミット部１４０によって前シーケンスの無効化が行われた。
【００７４】
次に、不揮発性バックアップメモリ１３０をリングバッファとして使用した場合のコミット処理のメモリの状態について説明する。図８−１〜図８−３は、コミット処理時の不揮発性バックアップメモリ（リングバッファ）の状態の一例を示す説明図である。図８−１は、コミット部１４０がコミット処理を開始する前の不揮発性バックアップメモリ１３０の状態を示している。バックアップデータ８３は、１つのバックアップデータを示し、図８−１の不揮発性バックアップメモリ１３０には、複数のバックアップデータが格納されている。図８−１では、シーケンス番号保持部１１８が保持しているシーケンス番号が“９９”であり、不揮発性バックアップメモリ１３０に格納されているシーケンス番号“９９”のバックアップデータが最新シーケンス８４である。また、バックアップメモリ先頭アドレスが指す位置８１は、不揮発性バックアップメモリ１３０の先頭アドレスである。書込ポインタの指す位置８２は、最新シーケンス８４での次のバックアップデータが書込まれる位置を示している。また、データは、Ａ→Ａ’の方向に書込んでいく。
【００７５】
図８−２は、シーケンス番号および書込みポインタが更新された状態を示している。まず、コミット部１４０は、制御ソフトウェア１７０からのコミット要求に応じて、シーケンス番号を更新する。図８−１の時点でバックアップ部１１０のシーケンス番号保持部１１８が保持しているシーケンス番号は“９９”であるから、コミット部１４０は９９に１を加算した値、つまり“１００”を新シーケンス番号として設定する。次に、バックアップ部１１０は、書込ポインタを再設定する。ただし、この例では、不揮発性バックアップメモリ１３０をリングバッファとして使用しているので、スタックの場合と異なり常にバックアップメモリ先頭アドレス保持部１１６が保持している不揮発性バックアップメモリ１３０の先頭アドレスを設定しなくても、新しいシーケンスは古いシーケンスを上書きしていくため、実際には何も行わない。シーケンス番号保持部１１８が不揮発性の場合は、ここまででコミット処理を終了しても構わない。
【００７６】
図８−３は、新しいシーケンス番号を使用したバックアップデータを書込んだ状態を示している。コミット部１４０は、コミットデータ書込アドレス保持部１４４に格納されている不揮発性主記憶部１２０内のアドレスを読み出し、読み出したアドレスの領域に書込ポインタの値を書込む。その書込み処理に対してバックアップ処理が行われ、新シーケンス番号つまりシーケンス番号“１００”のバックアップデータが、不揮発性バックアップメモリ１３０に格納される。これらの処理を行うことにより、図８−３に示すように、不揮発性バックアップメモリ１３０には、シーケンス番号“９９”のバックアップデータの次にシーケンス番号“１００”のバックアップデータが書込まれる。これにより、シーケンス番号“９９”のバックアップデータは古いシーケンスとなり、シーケンス番号“１００”のバックアップデータが最新のシーケンスとなる。つまり、コミット部１４０によって前シーケンスの無効化が行われた。
【００７７】
このように、本実施の形態におけるコミット部１４０は、新しいシーケンス番号のバックアップデータを一つ作成することにより、チェックポイント作成時のコミット処理における最新シーケンスの無効化処理を行うことができる。
【００７８】
次に、ロールバック部１５０によるロールバック処理について説明する。図９は、ロールバック部１５０によるロールバック処理手順を示すフローチャートである。なお、ロールバック部１５０は、プロセッサ部１６０上で動作する制御ソフトウェア１７０からの指示で起動する。
【００７９】
まず、ロールバック制御部１５１は、バックアップ部１１０へバックアップ処理を無効にする要求を送出する（ステップＳ９０１）。バックアップ部１１０は、バックアップ処理を無効にする（ステップＳ９０２）。これは、不揮発性主記憶部１２０にバックアップデータを書戻す際に、不意の電源断で不定となっている不揮発性主記憶部１２０のデータを不揮発性バックアップメモリ１３０にバックアップデータとして格納しないようにするためである。
【００８０】
次に、ロールバックデータ特定部１５２は、最新シーケンス特定処理を行う（ステップＳ９０３）。詳細は後述する。ロールバックデータ読出部１５３は、読み出された最新シーケンス内の最新バックアップデータをＥに格納する（ステップＳ９０４）。ロールバックデータ読出部１５３は、Ｅが空であるか否かを判断する（ステップＳ９０５）。
【００８１】
Ｅが空でないと判断した場合は（ステップＳ９０５：Ｎｏ）、ロールバックデータ読出部１５３はＥの読み出し要求をバックアップ部１１０に送出する（ステップＳ９０６）。バックアップ部１１０は、不揮発性バックアップメモリ１３０からバックアップデータを読み出す（ステップＳ９０７）。ロールバックデータ書戻部１５４は、Ｅに含まれる書込み先アドレスへ元データを書戻す要求をバックアップ部１１０に送出する（ステップＳ９０８）。バックアップ部１１０は、不揮発性主記憶部１２０の指定されたアドレスに元データを書込む（ステップＳ９０９）。ロールバックデータ読出部１５３は、次の最新シーケンス内の次のバックアップデータをＥに格納する（ステップＳ９１０）。これにより、最新シーケンス内で記録された時刻の逆順、すなわち新しく格納された順にバックアップデータを読み出すことができる。ステップＳ９０５に戻り、最新シーケンス内の全てのバックアップデータに対して繰り返す。
【００８２】
ステップＳ９０５において、Ｅが空であると判断した場合は（ステップＳ９０５：Ｙｅｓ）、ロールバック制御部１５１はバックアップ部１１０にバックアップ処理を有効にする要求を送出する（ステップＳ９１１）。バックアップ部１１０は、バックアップ処理を有効にする（ステップＳ９１２）。ロールバック制御部１５１は、コミット部１４０にコミット要求を送出する（ステップＳ９１３）。コミット部１４０は、コミット処理を行う（ステップＳ９１４）。これにより、ロールバック処理が完了した時点でのチェックポイントが生成される。
【００８３】
次に、ロールバックデータ特定部１５２による最新シーケンス特定処理について説明する。図１０は、ロールバックデータ特定部１５２による最新シーケンス特定処理手順を示すフローチャートである。
【００８４】
まず、ロールバックデータ特定部１５２は、不揮発性バックアップメモリ１３０からバックアップデータの１つを選択し、選択されたバックアップデータをデータＡに格納する（ステップＳ１００１）。なお、バックアップデータは、任意のバックアップデータを選択してよい。ロールバックデータ特定部１５２は、データＡが正常なデータか否かを、完全性検証用データを用いて検証する（ステップＳ１００２）。検証方法は、完全性検証用データとしてどのようなデータを使用したかに依存する。例えば、バックアップデータを図２のように構成し、完全性検証用データとしてシーケンス番号のコピーを使用した場合、完全性検証用データとシーケンス番号を比較して一致した場合は検証結果ＯＫと判断し、不一致なら検証結果ＮＧと判断する。
【００８５】
ロールバックデータ特定部１５２は、データＡの完全性検証結果がＯＫであるか否かを判断する（ステップＳ１００３）。データＡの完全性検証結果がＯＫでないと判断した場合は（ステップＳ１００３：Ｎｏ）、現在のデータＡの直前のバックアップデータをデータＡに格納し（ステップＳ１００４）、ステップＳ１００２に戻る。
【００８６】
データＡの完全性検証結果がＯＫであると判断した場合は（ステップＳ１００３：Ｙｅｓ）、データＡの直前のバックアップデータをデータＢに格納する（ステップＳ１００５）。ロールバックデータ特定部１５２は、データＢが正常なデータか否かを、完全性検証用データを用いて検証する（ステップＳ１００６）。ロールバックデータ特定部１５２は、データＢの完全性検証結果がＯＫであるか否かを判断する（ステップＳ１００７）。データＢの完全性検証結果がＯＫでないと判断した場合は（ステップＳ１００７：Ｎｏ）、ステップＳ１０１０に進む。
【００８７】
データＢの完全性検証結果がＯＫであると判断した場合は（ステップＳ１００７：Ｙｅｓ）、データＢのシーケンス番号がデータＡのシーケンス番号より小さいか否かを判断する（ステップＳ１００８）。データＢのシーケンス番号がデータＡのシーケンス番号より小さくない、すなわちデータＢのシーケンス番号がデータＡのシーケンス番号以上であると判断した場合は（ステップＳ１００８：Ｎｏ）、ロールバックデータ特定部１５２はデータＢの内容をデータＡに格納し（ステップＳ１００９）、ステップＳ１００２に戻る。
【００８８】
データＢのシーケンス番号がデータＡのシーケンス番号より小さいと判断した場合は（ステップＳ１００８：Ｙｅｓ）、ロールバックデータ特定部１５２は、データＡより後方に格納され、データＡとシーケンス番号が異なるバックアップデータ、もしくは、データＡより後方に格納され、完全性検証結果がＮＧである最初のバックアップデータを、データＣに格納する（ステップＳ１０１０）。ロールバックデータ特定部１５２は、データＣの完全性検証結果がＯＫであるか否かを判断する（ステップＳ１０１１）。データＣの完全性検証結果がＯＫであると判断した場合は（ステップＳ１０１１：Ｙｅｓ）、ロールバックデータ特定部１５２は、データＡのシーケンス番号がデータＣのシーケンス番号より小さいか否かを判断する（ステップＳ１０１２）。データＡのシーケンス番号がデータＣのシーケンス番号より小さいと判断した場合は（ステップＳ１０１２：Ｙｅｓ）、ロールバックデータ特定部１５２はデータＣの内容をデータＡに格納し（ステップＳ１０１３）、ステップＳ１００２に戻る。
【００８９】
ステップＳ１０１１において、データＣの完全性検証結果がＯＫでないと判断した場合は（ステップＳ１０１１：Ｎｏ）、または、ステップＳ１０１２において、データＡのシーケンス番号がデータＣのシーケンス番号より小さくないと判断した場合は（ステップＳ１０１２：Ｎｏ）、ロールバックデータ特定部１５２はロールバックデータの先頭をデータＡとし、ロールバックデータの最後尾をデータＣの直前のデータとする（ステップＳ１０１４）。なお、データＡのシーケンス番号がデータＣのシーケンス番号より小さくないと判断した場合とは、ステップＳ１０１０、ステップＳ１０１１での判断により、データＡのシーケンス番号がデータＣのシーケンス番号と同一になることはないため、データＡのシーケンス番号がデータＣのシーケンス番号より大きいと判断した場合となる。
【００９０】
このように、不揮発性バックアップメモリ１３０にバックアップデータを書込む最中に電源が切断された場合であっても、完全性検証用データによって検証された正常に書込まれた最新のチェックポイントにおける不揮発性主記憶部１２０の状態を復元するために必要なバックアップデータを正しく発見することができる。また、正しく発見したバックアップデータのみを用いて、元データに書き戻すため、チェックポイント時の不揮発性主記憶部１２０のデータに正確に再現することができる。
【００９１】
また、不揮発性主記憶部１２０に対する書込みアクセスが検出された場合に、すぐに不揮発性主記憶部１２０にデータを書込まず、不揮発性バックアップメモリ１３０にバックアップデータを格納した後に、不揮発性主記憶部１２０にデータを書込むため、バックアップデータを書込む最中に電源が切断され、正常でないバックアップデータが不揮発バックアップメモリ１３０に書込まれたとしても、まだ不揮発性主記憶部１２０にデータが書込まれていないため、正常でないバックアップデータをロールバック時に用いないことにより、整合性のとれた不揮発性主記憶部１２０の状態を再現することができる。
【００９２】
なお、もしシーケンス番号保持部１１８が不揮発性だった場合には、ロールバックデータ特定部１５２は、図１０の処理の代わりに、不揮発性バックアップメモリ１３０に格納されたバックアップデータの中から、完全性検証用データによる完全性検証結果がＯＫであり、かつシーケンス番号保持部１１８が保持しているシーケンス番号と同じシーケンス番号を持つバックアップデータを探すことで、ロールバックに使用するデータを発見することもできる。ただし、図９の処理は、シーケンス番号保持部１１８が揮発性でも不揮発性でも同じである。
【００９３】
次に、最新シーケンス特定処理を、具体的に不揮発性バックアップメモリの状態を参照し、図１０に示したフローチャートを用いて説明する。なお、以下の図１１および図１２の説明においては、最も処理が複雑になる、シーケンス番号保持部１１８が揮発性であった場合を説明する。ただし、以下で説明する処理は、シーケンス番号保持部１１８が不揮発性であった場合でも適用することができる。
【００９４】
図１１は、不揮発性バックアップメモリ１３０の状態の一例を示す説明図である。図１１には、不揮発性バックアップメモリ１３０の一部が示されている。不揮発性バックアップメモリ１３０には、完全性がＯＫであるバックアップデータ１〜９が格納されている。
【００９５】
まず、ロールバックデータ特定部１５２は、不揮発性バックアップメモリ１３０から例えばバックアップデータ４を選択し、選択されたバックアップデータ４をデータＡに格納する（ステップＳ１００１）。ロールバックデータ特定部１５２は、データＡが正常なデータか否かを、完全性検証用データを用いて検証する（ステップＳ１００２）。
【００９６】
ロールバックデータ特定部１５２は、データＡの完全性検証結果がＯＫであると判断し（ステップＳ１００３：Ｙｅｓ）、データＡの直前のバックアップデータ３をデータＢに格納する（ステップＳ１００５）。ロールバックデータ特定部１５２は、データＢが正常なデータか否かを、完全性検証用データを用いて検証する（ステップＳ１００６）。
【００９７】
ロールバックデータ特定部１５２は、データＢの完全性検証結果がＯＫであると判断し（ステップＳ１００７：Ｙｅｓ）、データＢのシーケンス番号“１００”がデータＡのシーケンス番号“１００”より小さいか否かを判断する（ステップＳ１００８）。データＢのシーケンス番号がデータＡのシーケンス番号より小さくない、すなわちデータＢのシーケンス番号はデータＡのシーケンス番号以上であると判断し（ステップＳ１００８：Ｎｏ）、ロールバックデータ特定部１５２はデータＢの内容をデータＡに格納し（ステップＳ１００９）、ステップＳ１００２に戻る。この時点で、データＡにバックアップデータ３が格納されている。
【００９８】
次に、ロールバックデータ特定部１５２は、データＡが正常なデータか否かを、完全性検証用データを用いて検証する（ステップＳ１００２）。ロールバックデータ特定部１５２は、データＡの完全性検証結果がＯＫであると判断し（ステップＳ１００３：Ｙｅｓ）、データＡの直前のバックアップデータ２をデータＢに格納する（ステップＳ１００５）。ロールバックデータ特定部１５２は、データＢが正常なデータか否かを、完全性検証用データを用いて検証する（ステップＳ１００６）。ロールバックデータ特定部１５２は、データＢの完全性検証結果がＯＫであると判断し（ステップＳ１００７：Ｙｅｓ）、データＢのシーケンス番号がデータＡのシーケンス番号より小さいか否かを判断する（ステップＳ１００８）。
【００９９】
データＢのシーケンス番号“９９”がデータＡのシーケンス番号“１００”より小さいと判断し（ステップＳ１００８：Ｙｅｓ）、ロールバックデータ特定部１５２はデータＡより後方に格納され、データＡとシーケンス番号が異なるバックアップデータ９を、データＣに格納する（ステップＳ１０１０）。ロールバックデータ特定部１５２は、データＣの完全性検証結果がＯＫであると判断し（ステップＳ１０１１：Ｙｅｓ）、ロールバックデータ特定部１５２はデータＡのシーケンス番号“１００”がデータＣのシーケンス番号“５７”より小さいか否かを判断する（ステップＳ１０１２）。データＡのシーケンス番号がデータＣのシーケンス番号より小さくないと判断し（ステップＳ１０１２：Ｎｏ）、ロールバックデータ特定部１５２はロールバックデータの先頭をデータＡ、すなわちバックアップデータ３とし、ロールバックデータの最後尾をデータＣの直前のデータ、すなわちバックアップデータ８とする（ステップＳ１０１４）。
【０１００】
これにより、最新シーケンスは、先頭がバックアップデータ３で最後尾がバックアップデータ８であることを特定することができる。その後、図９のＳ９０４に戻り、特定された最新シーケンスのバックアップデータを用いてロールバックを行う。
【０１０１】
他の場合として、バックアップデータに正常でないデータを含む場合の最新シーケンス特定処理について説明する。図１２は、不揮発性バックアップメモリ１３０の状態の一例を示す説明図である。図１２には、不揮発性バックアップメモリ１３０の一部が示されている。不揮発性バックアップメモリ１３０には、完全性がＯＫであるバックアップデータ１１〜１８と、完全性がＮＧであるバックアップデータ１９が格納されている。バックアップデータ１９は、バックアップデータ１９を不揮発性バックアップメモリ１３０に書込む途中で電源が切断されたため、正しく書込まれなかったものである。
【０１０２】
まず、ロールバックデータ特定部１５２は、不揮発性バックアップメモリ１３０から例えばバックアップデータ１３を選択し、選択されたバックアップデータ１３をデータＡに格納する（ステップＳ１００１）。ロールバックデータ特定部１５２は、データＡが正常なデータか否かを、完全性検証用データを用いて検証する（ステップＳ１００２）。データＡの完全性検証結果がＯＫであると判断し（ステップＳ１００３：Ｙｅｓ）、データＡの直前のバックアップデータ１２をデータＢに格納する（ステップＳ１００５）。ロールバックデータ特定部１５２は、データＢが正常なデータか否かを、完全性検証用データを用いて検証する（ステップＳ１００６）。
【０１０３】
ロールバックデータ特定部１５２は、データＢの完全性検証結果がＯＫであると判断し（ステップＳ１００７：Ｙｅｓ）、データＢのシーケンス番号“９９”がデータＡのシーケンス番号“１００”より小さいか否かを判断する（ステップＳ１００８）。データＢのシーケンス番号がデータＡのシーケンス番号より小さいと判断し（ステップＳ１００８：Ｙｅｓ）、ロールバックデータ特定部１５２はデータＡより後方に格納され、完全性検証結果がＮＧである最初のバックアップデータ１９を、データＣに格納する（ステップＳ１０１０）。
【０１０４】
ロールバックデータ特定部１５２は、データＣの完全性検証結果がＮＧであると判断し（ステップＳ１０１１：Ｎｏ）、ロールバックデータ特定部１５２はロールバックデータの先頭をデータＡ、すなわちバックアップデータ１３とし、ロールバックデータの最後尾をデータＣの直前のデータ、すなわちバックアップデータ１８とする（ステップＳ１０１４）。
【０１０５】
これにより、最新シーケンスは、先頭がバックアップデータ１３で最後尾がバックアップデータ１８であることを特定することができる。この最新シーケンスを用いて、ロールバックを行う。
【０１０６】
このように、仮にバックアップ部１１０による不揮発性バックアップメモリ１３０へのバックアップデータ書込み中に不意の電源断が生じて、バックアップデータが不完全な形で不揮発性バックアップメモリ１３０に書かれたとしても、シーケンス番号と完全性検証用データとロールバックデータ特定部１５２の処理によって、正しくロールバックに必要なデータを特定することができる。
【０１０７】
次に、ＰＣ１００全体として、バックアップ処理、コミット処理およびロールバック処理を説明する。図１３は、各部によるバックアップ処理を示すシーケンス図である。また、各部ごとの処理を縦方向に示し、各部間を結ぶ矢印は、各部間を接続している信号線を介した制御およびデータ信号のやり取りを示す。ＡからＡ’への向きに時間が経過している。
【０１０８】
まず、バックアップ部１１０は、バス１８０を介した不揮発性主記憶部１２０への書込みアクセスを検出する（ステップＳ１３０１）。バックアップ部１１０は、不揮発性主記憶部１２０への書込みアクセスを検出し、不揮発性主記憶部１２０の書込み先アドレスを取得する（ステップＳ１３０２）。また、バックアップ部１１０は、バックアップ処理が有効になっているか否かをチェックする（ステップＳ１３０３）。バックアップ処理が有効な場合は、バックアップ部１１０は、書込みアクセスに含まれた書込み先アドレスに格納されている元データを不揮発性主記憶部１２０から読み出す（ステップＳ１３０４、ステップＳ１３０５）。バックアップ部１１０は、元データと不揮発性主記憶部１２０の書込み先アドレスとシーケンス番号と完全性検証用データからバックアップデータを生成する（ステップＳ１３０６）。なお、生成するバックアップデータのデータ長を、不揮発性バックアップメモリ１３０のデータ幅の整数倍とするように配慮することで、バックアップデータの不揮発性バックアップメモリ１３０への書込みをスムーズに行うことができる。
【０１０９】
バックアップ部１１０は、生成したバックアップデータを不揮発性バックアップメモリ１３０に書込む（ステップＳ１３０７）。バックアップデータは、不揮発性バックアップメモリ１３０の書込ポインタ保持部１１７に保持された書込みポインタが示す記憶領域に書込まれる。バックアップ部１１０は、書込みアクセスに含まれる不揮発性主記憶部１２０の書込み先アドレスに、書込みアクセスに含まれるデータを書込む（ステップＳ１３０８）。バックアップ部１１０は、不揮発性バックアップメモリ１３０の書込みポインタを更新する（ステップＳ１３０９）。
【０１１０】
次に、コミット処理について説明する。図１４は、各部によるコミット処理を示すシーケンス図である。
【０１１１】
まず、制御ソフトウェア１７０は、コミット部１４０にコミットを指示する（ステップＳ１４０１）。コミット部１４０は、シーケンス番号を読み出し（ステップＳ１４０２、ステップＳ１４０３）、新たなシーケンス番号を計算する（ステップＳ１４０４）。具体的には、シーケンス番号保持部１１８から読み出したシーケンス番号に１を加算した値を新たなシーケンス番号とする。コミット部１４０は、バックアップ部１１０に新シーケンス番号を送出する（ステップＳ１４０５）。バックアップ部１１０は、新シーケンス番号をシーケンス番号保持部１１８に設定する（ステップＳ１４０６）。バックアップ部１１０は、書込ポインタ保持部１１７に保持された書込みポインタを再設定する（ステップＳ１４０７）。なお、書込みポインタの再設定は、不揮発性バックアップメモリ１３０をスタックとして使用している場合であり、リングバッファとして使用している場合は再設定を行わない。シーケンス番号保持部１１８が不揮発性の場合は、コミット処理をここで終了しても構わない。
【０１１２】
コミット部１４０は、バックアップ部１１０の書込ポインタ保持部１１７から書込ポインタを読み出す（ステップＳ１４０８、ステップＳ１４０９）。コミット部１４０は、書込みポインタの不揮発性主記憶部１２０への書込みアクセスを送出する（ステップＳ１４１０）。この書込みアクセスは、不揮発性主記憶部１２０のコミットデータ書込アドレス保持部１４４に保持されたアドレスに書込みポインタの値を書込むものである。以下、この書込みアクセスを検出したことに応じて、バックアップ部１１０でバックアップ処理（ステップＳ１４１１〜ステップＳ１４１８）が行われる。この処理は、図１３で説明したバックアップ処理のステップＳ１３０２〜ステップＳ１３０９の処理と同様であるため、上述した説明を参照し、ここでの説明を省略する。この処理により、コミット部１４０が設定した新しいシーケンス番号のバックアップデータが一つ作成され、不揮発性バックアップメモリ１３０内でそれまで最新だった最新シーケンスの無効化が行われる。
【０１１３】
次に、ロールバック処理について説明する。図１５は、各部によるロールバック処理を示すシーケンス図である。
【０１１４】
まず、制御ソフトウェア１７０は、ロールバック部１５０にロールバックを要求する（ステップＳ１５０１）。ロールバック部１５０は、バックアップ部１１０のバックアップ処理を無効にする（ステップＳ１５０２）。ロールバック部１５０は、不揮発性バックアップメモリ１３０から最新シーケンスのバックアップデータを特定する（ステップＳ１５０３）。ロールバック部１５０は、不揮発性バックアップメモリ１３０から最新シーケンスのバックアップデータを読み出す（ステップＳ１５０４、ステップＳ１５０５）。ロールバック部１５０は、最新シーケンスのバックアップデータを用いて不揮発性主記憶部１２０に元データを書き戻す（ステップＳ１５０６）。
【０１１５】
ロールバック部１５０は、ロールバックに使用したシーケンスのシーケンス番号を、バックアップ部１１０のシーケンス番号保持部１１８に設定する（ステップＳ１５０７）。例えば、シーケンス番号“９９”のバックアップデータを用いて、ロールバックした場合は、シーケンス番号に“９９”を設定する。ロールバック部１５０は、ロールバックに使用したバックアップデータのうち、最後尾のバックアップデータ、すなわち最後にバックアップされたデータ（最初に不揮発性主記憶部１２０に元データを書戻したバックアップデータ）の次のアドレスを、バックアップ部１１０の書込ポインタ保持部１１７に設定する（ステップＳ１５０８）。例えば、ロールバックに使用したバックアップデータのアドレスが“１２”であった場合は、書込みポインタとして“１３”を設定する。
【０１１６】
ロールバック部１５０は、バックアップ部１１０のバックアップ処理を有効にする（ステップＳ１５０９）。ロールバック部１５０は、コミット部１４０にコミット処理を要求する（ステップＳ１５１０）。
【０１１７】
それ以降の処理は、図１４で説明したコミット処理のステップＳ１４０２〜ステップＳ１４１８の処理と同様であるため、上述した図１４および説明を参照し、ここでの説明を省略する。なお、コミット処理において、シーケンス番号は、新シーケンス番号が設定される。例えばロールバックに使用したシーケンスのシーケンス番号“９９”であれば、新シーケンス番号として“１００”が設定される。また、書込みポインタは、不揮発性バックアップメモリ１３０がスタックとして使用されている場合は、不揮発性バックアップメモリ１３０の先頭アドレスが設定され、不揮発性バックアップメモリ１３０がリングバッファとして使用されている場合は、既に設定されているロールバックで使用したバックアップデータの次のアドレスとなる。
【０１１８】
このように、バックアップ処理、コミット処理およびロールバック処理において、バックアップ部１１０、コミット部１４０、そしてロールバック部１５０は連携して動作する。本実施の形態では、シーケンス番号および完全性検証用データを用いることにより、ロールバック部１５０がロールバックに必要なデータを特定することができるため、チェックポイント時点の不揮発性主記憶部１２０の状態を正確に復元できる。これにより、バックアップデータを様々な構成にする場合や、不揮発性バックアップメモリ１３０に対して様々なデータの格納の仕方、取り出し方をする場合であっても、不揮発性主記憶部１２０の内容をロールバックすることができる。ひいては、不意の電源断後の電源復旧時において、コンピュータの動作を保証することが可能となる。
【０１１９】
なお、本発明は、上記実施の形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化することができる。また、上記実施の形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成することができる。例えば、実施の形態に示される全構成要素からいくつかの構成要素を削除してもよい。さらに、異なる実施の形態にわたる構成要素を適宜組み合わせてもよい。
【図面の簡単な説明】
【０１２０】
【図１】本実施の形態にかかるＰＣの構成を示すブロック図である。
【図２】不揮発性バックアップメモリに格納されるバックアップデータのデータ構成の一例を示す説明図である。
【図３】不揮発性バックアップメモリに格納されるバックアップデータのデータ構成の一例を示す説明図である。
【図４−１】バックアップ部が行うバックアップ処理手順を示すフローチャートである。
【図４−２】バックアップ部が行うバックアップ処理手順を示すフローチャートである。
【図５】バックアップ部が行うバックアップデータ生成処理手順を示すフローチャートである。
【図６】コミット部によるコミット処理手順を示すフローチャートである。
【図７−１】コミット処理時の不揮発性バックアップメモリ（スタック）の状態の一例を示す説明図である。
【図７−２】コミット処理時の不揮発性バックアップメモリ（スタック）の状態の一例を示す説明図である。
【図７−３】コミット処理時の不揮発性バックアップメモリ（スタック）の状態の一例を示す説明図である。
【図８−１】コミット処理時の不揮発性バックアップメモリ（リングバッファ）の状態の一例を示す説明図である。
【図８−２】コミット処理時の不揮発性バックアップメモリ（リングバッファ）の状態の一例を示す説明図である。
【図８−３】コミット処理時の不揮発性バックアップメモリ（リングバッファ）の状態の一例を示す説明図である。
【図９】ロールバック部によるロールバック処理手順を示すフローチャートである。
【図１０】ロールバックデータ特定部による最新シーケンス特定処理手順を示すフローチャートである。
【図１１】不揮発性バックアップメモリの状態の一例を示す説明図である。
【図１２】不揮発性バックアップメモリの状態の一例を示す説明図である。
【図１３】各部によるバックアップ処理を示すシーケンス図である。
【図１４】各部によるコミット処理を示すシーケンス図である。
【図１５】各部によるロールバック処理を示すシーケンス図である。
【符号の説明】
【０１２１】
１００  パーソナルコンピュータ（ＰＣ）
１１０  バックアップ部
１１１  主記憶アクセス制御部
１１２  バックアップ制御部
１１３  バックアップメモリアクセス制御部
１１４  バックアップデータ生成部
１１５  完全性検証用データ生成部
１１６  バックアップメモリ先頭アドレス保持部
１１７  書込ポインタ保持部
１１８  シーケンス番号保持部
１２０  不揮発性主記憶部
１３０  不揮発性バックアップメモリ
１４０  コミット部
１４１  コミット制御部
１４２  書込ポインタアクセス部
１４３  コミットデータ書込部
１４４  コミットデータ書込アドレス保持部
１４５  シーケンス番号更新部
１５０  ロールバック部
１５１  ロールバック制御部
１５２  ロールバックデータ特定部
１５３  ロールバックデータ読出部
１５４  ロールバックデータ書戻部
１６０  プロセッサ部
１７０  制御ソフトウェア
１８０  バス
２００  電源
【図１】
0005224800.tif 000002
【図２】
0005224800.tif 000003
【図３】
0005224800.tif 000004
【図４−１】
0005224800.tif 000005
【図４−２】
0005224800.tif 000006
【図５】
0005224800.tif 000007
【図６】
0005224800.tif 000008
【図７−１】
0005224800.tif 000009
【図７−２】
0005224800.tif 000010
【図７−３】
0005224800.tif 000011
【図８−１】
0005224800.tif 000012
【図８−２】
0005224800.tif 000013
【図８−３】
0005224800.tif 000014
【図９】
0005224800.tif 000015
【図１０】
0005224800.tif 000016
【図１１】
0005224800.tif 000017
【図１２】
0005224800.tif 000018
【図１３】
0005224800.tif 000019
【図１４】
0005224800.tif 000020
【図１５】
0005224800.tif 000021