(57)【特許請求の範囲】
【請求項１】
外部のストレージ装置である外部ストレージに接続された記憶制御装置であって、
前記外部ストレージのキャッシュとして利用されるストレージ装置であるキャッシュストレージと、
前記キャッシュストレージに接続されたプロセッサである制御プロセッサと
を有し、
前記制御プロセッサは、第１のプログラムを実行することにより、前記キャッシュストレージにアクセスする機能である内部アクセス機能を有し、
前記制御プロセッサは、第２のプログラムを実行することにより、前記外部ストレージにアクセスする機能である外部アクセス機能を有し、
前記キャッシュストレージは、
物理的な記憶デバイスと、
前記物理的な記憶デバイスに接続されたプロセッサであるキャッシュプロセッサと
を有し、
前記物理的な記憶デバイスに基づく論理ボリュームである内部ＶＯＬが前記内部アクセス機能に認識され、
前記内部ＶＯＬに、前記外部ストレージが提供する論理ボリュームである外部ＶＯＬが対応付けられており、
前記内部ＶＯＬが、複数の論理領域で構成されており、
前記内部アクセス機能が、リードコマンドを前記キャッシュストレージに送信し、
前記キャッシュプロセッサが、前記リードコマンドに従うリード対象のデータが前記物理的な記憶デバイスに格納されているか否かの判定であるキャッシュヒットミス判定を行い、
前記キャッシュヒットミス判定の結果が否定的の場合、前記外部ストレージへのリードの依頼を前記キャッシュプロセッサが前記外部アクセス機能に送信することにより、前記外部アクセス機能が実行されるが、前記キャッシュヒットミス判定の結果が肯定的の場合、前記キャッシュプロセッサが前記外部アクセス機能に依頼を出すことなく前記物理的な記憶デバイス内のリード対象のデータを前記内部アクセス機能に送信するので、前記外部アクセス機能が実行されず、
前記内部アクセス機能が、前記内部ＶＯＬを指定したライトコマンドを前記キャッシュストレージに送信し、
前記キャッシュプロセッサが、前記ライトコマンドに応答して、前記ライトコマンドに従うライト対象のデータを前記内部ＶＯＬに書き込み、前記ライト対象のデータを前記内部ＶＯＬに書き込んだときに、前記ライトコマンドに対する応答を前記内部アクセス機能に送信し、
前記ライトコマンドに対する応答を前記内部アクセス機能に送信した後に、前記キャッシュプロセッサが、前記内部ＶＯＬ内のライト対象のデータを前記外部ＶＯＬに書き込むことのライト依頼を前記外部アクセス機能に送信し、前記キャッシュプロセッサは、論理領域毎に前記ライト依頼に対する応答を前記外部アクセス機能から受けたか否かを表す応答ステータスを管理し、
前記外部アクセス機能が起動した場合、前記外部アクセス機能は、外部反映処理を行い、
前記外部反映処理では、論理領域毎に応答ステータスを基に、応答が無いことを意味する応答ステータスに対応した論理領域内のライト対象のデータが、前記外部ＶＯＬに書き込まれ、前記外部アクセス機能は、前記ライト対象のデータが前記外部ＶＯＬに書き込まれた後、前記内部ＶＯＬを有効にすることの要求である有効要求を前記キャッシュストレージに送信し、
前記内部アクセス機能が、内部ＶＯＬの存在の問合せを、前記キャッシュストレージに送信し、
前記キャッシュプロセッサは、前記問合せを受けた場合、前記有効要求を受信済みであれば、前記内部ＶＯＬの存在を前記内部アクセス機能に知らせるが、前記有効要求を受信していなければ、前記内部ＶＯＬの存在を前記内部アクセス機能に知らせない、
記憶制御装置。
【請求項２】
請求項１記載の記憶制御装置であって、
前記キャッシュヒットミス判定の結果が否定的の場合、前記外部アクセス機能が、前記リードの依頼に応答して、前記リードコマンドで指定されている内部ＶＯＬに対応する外部ＶＯＬからリード対象のデータを読み出し、そのデータを前記内部ＶＯＬに書き込み、前記キャッシュプロセッサが、前記内部ＶＯＬ内のリード対象のデータを前記内部アクセス機能に提供する、
記憶制御装置。
【請求項３】
請求項２記載の記憶制御装置であって、
前記内部アクセス機能が、内部ＶＯＬの存在の問合せを、前記キャッシュストレージに送信し、
前記キャッシュプロセッサは、前記問合せを受けた場合、前記外部アクセス機能が起動済みであれば、前記内部ＶＯＬの存在を前記内部アクセス機能に知らせるが、前記外部アクセス機能が起動していなければ、前記内部ＶＯＬの存在を前記内部アクセス機能に知らせない、
記憶制御装置。
【請求項４】
請求項２記載の記憶制御装置であって、
１つの外部ＶＯＬに複数の内部ＶＯＬが対応付けられており、且つ、その１つの外部ＶＯＬの記憶容量が、それら複数の内部ＶＯＬの実容量の合計と同じであり、
内部ＶＯＬの実容量は、前記物理的な記憶デバイスのうちの前記内部ＶＯＬの基になっている物理的な記憶領域の記憶容量である、
記憶制御装置。
【請求項５】
請求項１記載の記憶制御装置であって、
各論理領域が、複数のサブ論理領域で構成されており、
前記キャッシュストレージが、サブ論理領域毎に、内部ＶＯＬにデータが書き込まれているか否かを管理しており、
前記サブ論理領域のサイズは、前記内部アクセス機能からの１つのライトコマンド及びリードコマンドで書き込み又は読み出しされるデータの最小サイズと同じサイズである、
記憶制御装置。
【請求項６】
請求項１記載の記憶制御装置であって、
前記キャッシュプロセッサは、前記ライトコマンドを受けた場合、前記ライト依頼に対する応答を受けたことを表す応答ステータスに対応する論理領域を特定し、その論理領域に対応する物理領域に、前記ライト対象のデータを書き込む、
記憶制御装置。
【請求項７】
請求項１記載の記憶制御装置であって、
前記物理的な記憶デバイスが、複数の物理領域で構成されており、
前記内部ＶＯＬとして、プライマリの内部ＶＯＬとセカンダリの内部ＶＯＬとがあり、
前記外部アクセス機能又は前記キャッシュプロセッサが、前記プライマリの内部ＶＯＬのどの論理領域が差分論理領域かを管理し、
前記差分論理領域は、プライマリの内部ＶＯＬとセカンダリの内部ＶＯＬとの間で不一致のデータが格納されている論理領域であり、
前記外部アクセス機能又は前記キャッシュプロセッサが、前記セカンダリの内部ＶＯＬから前記プライマリの内部ＶＯＬへのデータコピーを、前記差分論理領域についてのみ行い、そのデータコピーでは、前記差分論理領域に対応する、前記セカンダリの内部ＶＯＬ内の論理領域から、前記差分論理領域にデータがコピーされ、
前記外部アクセス機能又は前記キャッシュプロセッサが、前記データコピーを開始するときに、前記プライマリの内部ＶＯＬのうち全ての割当て済み論理領域に対応した物理領域を、仮解放と管理し、
前記割当て済み論理領域は、いずれかの物理領域が割り当てられている論理領域であり、
前記外部アクセス機能又は前記キャッシュプロセッサが、前記データコピーに従ってデータが前記差分論理領域に書き込まれた場合、その差分論理領域に対応した物理領域を、非解放と管理し、
前記キャッシュプロセッサは、前記内部アクセス機能からのリードコマンドに従うリード元の論理領域に対応した物理領域が非解放と管理されていれば、その物理領域内のデータを前記内部アクセス機能に提供し、
前記外部アクセス機能又は前記キャッシュプロセッサが、前記データコピーを完了するときに、前記プライマリの内部ＶＯＬのうち仮解放と管理した物理領域を、非解放と管理する、
記憶制御装置。
【請求項８】
請求項１記載の記憶制御装置であって、
前記内部アクセス機能が複数個あり、
前記外部アクセス機能は、終了要求を受けた場合、前記内部ＶＯＬを認識している内部アクセス機能の数がゼロになっていなければ、終了しない、
記憶制御装置。
【請求項９】
請求項１記載の記憶制御装置であって、
前記キャッシュストレージが、通信のための記憶領域である通信領域を有し、
前記外部アクセス機能と前記キャッシュプロセッサ間の通信が、前記通信領域を介して行われる、
記憶制御装置。
【請求項１０】
請求項１記載の記憶制御装置であって、
前記制御プロセッサは、第３のプログラムを実行することにより、前記内部アクセス機能及び前記外部アクセス機能を管理する機能である管理機能を有し、
前記内部アクセス機能が、アプリケーションを実行する第１の仮想マシンであり、
前記外部アクセス機能が、前記第１の仮想マシンを制御する第２の仮想マシンであり、
前記管理機能は、前記第１の仮想マシンの起動及び終了と、前記第２の仮想マシンの起動及び終了とを制御するハイパバイザである、
記憶制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データへのアクセスの制御に関する。
【背景技術】
【０００２】
ストレージ装置として、例えば、多数の物理記憶デバイス（例えばＨＤＤ（Hard Disk Drive）を有する装置（例えばディスクアレイ装置）が知られている。この種のストレージ装置は、一般に、ホスト装置に論理ボリュームを提供する。ホスト装置は、論理ボリュームを指定したアクセス要求（ライト要求又はリード要求）を送信することにより、論理ボリュームに対してデータの書込み及び読み出しを行うことができる。
【０００３】
特許文献１には、次のような計算機が開示されている。すなわち、計算機内のディスクを基に論理ボリューム（以下、内部ボリューム）が作成され、その内部ボリュームがアプリケーションプログラムに提供される。アプリケーションプログラムから内部ボリュームに書き込まれたデータは、計算機の外部のストレージ装置に転送される。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００８−３０５２８８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１では、アプリケーションプログラムから内部ボリュームへのアクセスは、管理プログラムが実行されることにより監視される。アプリケーションプログラムは、ホスト装置が有するＣＰＵで実行されるが、管理プログラムも、計算機内のＣＰＵで実行される。それ故、計算機内のＣＰＵで管理プログラムが実行されることにより行われるアクセス監視は、計算機の性能低下の原因となる。
【０００６】
このような問題は、計算機に限らず、外部のストレージ装置のキャッシュとして利用される記憶デバイスを有する他種の記憶制御装置についても存在し得る。
【０００７】
そこで、本発明の目的は、外部のストレージ装置のキャッシュとして利用される記憶デバイスを有する記憶制御装置の性能の低下を軽減することにある。
【課題を解決するための手段】
【０００８】
記憶制御装置が、外部ストレージのキャッシュとして利用されるストレージ装置（キャッシュストレージ）と、キャッシュストレージに接続されたプロセッサである制御プロセッサとを有する。制御プロセッサは、第１のプログラムを実行することにより内部アクセス機能（キャッシュストレージにアクセスする機能）を有し、第２のプログラムを実行することにより外部アクセス機能（外部ストレージにアクセスする機能）を有する。キャッシュストレージは、物理的な記憶デバイスと、物理的な記憶デバイスに接続されたプロセッサ（キャッシュプロセッサ）とを有する。内部アクセス機能が、リードコマンドをキャッシュストレージに送信する。キャッシュプロセッサが、そのリードコマンドに従うリード対象のデータが物理的な記憶デバイスに格納されているか否かの判定であるキャッシュヒットミス判定を行う。キャッシュヒットミス判定の結果が否定的の場合、外部ストレージへのリードの依頼をキャッシュプロセッサが外部アクセス機能に送信することにより、外部アクセス機能が実行される。しかし、キャッシュヒットミス判定の結果が肯定的の場合、キャッシュプロセッサが外部アクセス機能に依頼を出すことなく物理的な記憶デバイス内のリード対象のデータを内部アクセス機能に送信するので、外部アクセス機能が実行されない。
【０００９】
外部ストレージ及び記憶制御装置の組合せとしては、種々の組合せが考えられる。例えば、外部ストレージが、複数の物理記憶デバイスを有するストレージ装置（例えば、ディスクアレイ装置）であって、記憶制御装置が、外部ストレージにアクセスするホスト装置（例えば、サーバ装置、外部ストレージをリモートコピーのコピー先とするコピー元のストレージ装置、或いは、インテリジェントなスイッチ装置（例えば、ファイバチャネルスイッチ））であっても良い。また、外部ストレージが、外付け式の可搬型のストレージ装置であって、記憶制御装置が、パーソナルコンピュータ等の計算機であっても良い。また、外部ストレージ装置が、複数の物理的な記憶デバイスであって、記憶制御装置が、それらへのアクセスを制御するコントローラであっても良い（すなわち、外部ストレージ装置と記憶制御装置とで、ホスト装置からアクセスされるストレージ装置が構成されていても良い）。
【発明の効果】
【００１０】
本発明によれば、ホスト装置のプロセッサによって実行される内部アクセス機能からのリード要求を外部アクセス機能が監視する必要が無い。それ故、記憶制御装置の性能低下を軽減することができる。
【図面の簡単な説明】
【００１１】
【図１】実施例１に係る計算機システムの全体構成を示す。
【図２】実施例１に係るＳＳＤキャッシュ情報２５０を示す。
【図３】実施例１に係るＳＳＤキャッシュ情報３５０を示す。
【図４】実施例１に係るキャッシュＳＳＤ２００内のアクセス処理プログラム２４１が行う処理のフローチャートである。
【図５】実施例１に係るキャッシュＳＳＤ２００でのリード処理（図４のＳ１０５）を示すフローチャートである。
【図６】実施例１に係るヒットミス判定処理を示すフローチャートである。
【図７】実施例１に係る外部リード依頼処理を示すフローチャートである。
【図８】実施例１に係るＳＳＤ書込みを示すフローチャートである。
【図９】実施例１に係るキャッシュＳＳＤ２００でのライト処理（図４のＳ１０７）を示すフローチャートである。
【図１０】実施例１に係る外部ライト依頼処理を示すフローチャートである。
【図１１】実施例１に係るストレージ制御ＶＭ３３０内のアクセス処理プログラム３３３が行う処理を示すフローチャートである。
【図１２】実施例１に係るストレージ制御ＶＭ３３０が行うリード処理（図１１のＳ３０６）を示すフローチャートである。
【図１３】実施例１に係るストレージ制御ＶＭ３３０が行うライト処理（図１１のＳ３０８）を示すフローチャートである。
【図１４】実施例１に係る初期設定処理を示すラダーチャートである。
【図１５】実施例１に係るホスト１００での起動処理を示すラダーチャートである。
【図１６】実施例１に係るホスト１００での終了処理を示すラダーチャートである。
【図１７】実施例１に係る起動／終了制御プログラム３３２が行う処理を示すフローチャートである。
【図１８】実施例２に係るヒットミス判定処理を示すフローチャートである。
【図１９】実施例３に係るＳＳＤキャッシュ情報２５０を示す。
【図２０】実施例３に係るＳＳＤキャッシュ情報３５０を示す。
【図２１】実施例３に係るキャッシュＳＳＤ２００でのリード処理を示すフローチャートである。
【図２２】実施例３に係るＳＳＤ書込みを示すフローチャートである。
【図２３】実施例３に係るキャッシュＳＳＤ２００でのライト処理を示すフローチャートである。
【図２４】実施例４に係るＳＳＤキャッシュ情報２５０を示す。
【図２５】実施例４に係るＳＳＤキャッシュ情報３５０を示す。
【図２６】実施例４に係るヒットミス判定処理を示すフローチャートである。
【図２７】実施例４に係るキャッシュＳＳＤ２００でのリード処理を示すフローチャートである。
【図２８】実施例４に係るキャッシュＳＳＤ２００でのライト処理を示すフローチャートである。
【図２９】実施例４に係る外部ライト依頼処理を示すフローチャートである。
【図３０】実施例４に係るホスト１００での起動処理を示すラダーチャートである。
【図３１】実施例４に係る起動／終了制御プログラム３３２が行う処理を示すフローチャートである。
【図３２】実施例５に係る逆内部コピーの説明図である。
【図３３】実施例５に係るＳＳＤキャッシュ情報２５０を示す。
【図３４】実施例５に係るＳＳＤキャッシュ情報３５０を示す。
【図３５】実施例５に係るヒットミス判定処理を示すフローチャートである。
【図３６】実施例６に係る計算機システムの全体構成を示す。
【図３７】実施例６に係るＳＳＤキャッシュ情報３５０を示す。
【図３８】実施例６に係るホスト１００での起動処理を示すラダーチャートである。
【図３９】実施例６に係るホスト１００での終了処理を示すラダーチャートである。
【図４０】実施例６に係る異常終了処理（アプリケーションＶＭ３２０からアンマウント通知がない場合に行われる異常終了処理）を示すラダーチャートである。
【図４１】実施例６に係る終了処理（アプリケーションＶＭ３２０が異常終了したホスト１００での終了処理）を示すラダーチャートである。
【図４２】実施例６に係る起動／終了制御プログラム３３２が行う処理を示すフローチャートである。
【図４３】実施例７に係る通信方法（キャッシュＳＳＤ２００とストレージ制御ＶＭ３３０との間の通信方法）の説明図である。
【発明を実施するための最良の形態】
【００１２】
以下、外部のストレージ装置が、複数の物理記憶デバイスを有する大容量ストレージ装置（例えばディスクアレイ装置）であり、且つ、記憶制御装置が、ディスクアレイ装置にアクセスするホスト装置であることを例に採り、本発明の幾つかの実施例を説明する。
【００１３】
なお、以後の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサ（例えばＣＰＵ（Central Processing Unit））によって実行されることで、定められた処理を、適宜に記憶資源（例えばメモリ）及び／又は通信インタフェース装置（例えば通信ポート）を用いながら行うため、処理の主語がプロセッサとされてもよい。プロセッサは、ＣＰＵの他に専用ハードウェアを有していても良い。コンピュータプログラムは、プログラムソースから各計算機にインストールされても良い。プログラムソースは、例えば、プログラム配布サーバ又は記憶メディアであっても良い。
【００１４】
以下、図１から図２０を用いて、本発明の実施例１を説明する。
【実施例１】
【００１５】
まず、図１から図３を用いてシステム構成について説明する。次に、図４から図１０を用いて、キャッシュＳＳＤ２００のアクセス処理を説明する。次に、図１１から図１３を用いて、ストレージ制御プログラムＶＭのアクセス処理を説明する。次に、図１４を用いて、初期設定を説明する。最後に、図１５から図２０を用いて、起動及び終了の処理を説明する。
【００１６】
図１は、実施例１に係る計算機システムの全体構成を示す。
【００１７】
計算機システムは、外部のストレージ装置（以下、外部ストレージ）４００と、外部ストレージ４００に接続されたホスト装置（以下、ホスト）１００とを有する。
【００１８】
外部ストレージ４００は、１以上の論理ボリュームを管理している。外部ストレージ４００が管理する論理ボリュームを、以下、「外部ＶＯＬ」と言う。
【００１９】
ホスト１００は、データベース管理システムなどの後述するアプリケーションプログラム３２１を実行することでデータ処理（例えば業務処理）を行う装置である。ホスト１００は、例えば、メモリ３００と、キャッシュＳＳＤ（Ｓolid State Drive）２００と、ＦＣ−ＨＢＡ（Fibre Channel-Host Bus Adapter）１０２とを有する。
【００２０】
ＦＣ−ＨＢＡ１０２は、ファイバチャネルプロトコルに従う通信を行うための通信インタフェース装置である。ＦＣ−ＨＢＡ１０２に外部ストレージ４００が接続されている。ＦＣ−ＨＢＡ１０２に代えて他種の通信インタフェース装置が採用されても良い。
【００２１】
キャッシュＳＳＤ２００は、キャッシュとして利用されるＳＳＤである。具体的には、データ処理に必要なデータは、外部ストレージ４００に格納されるが、そのデータのうち高速にアクセスしたい一部のデータが、キャッシュＳＳＤ２００にも格納される。より具体的には、キャッシュＳＳＤ２００に基づく論理ボリュームが用意されており、その論理ボリュームに、アクセス対象のデータが格納される。以下、キャッシュＳＳＤ２００に基づく論理ボリュームを「内部ＶＯＬ」と言う。内部ＶＯＬは、キャッシュ領域であり、外部ＶＯＬに対応付けられている。従って、内部ＶＯＬに格納されたデータは、適宜、ＦＣ−ＨＢＡ１０２を通じて外部ＶＯＬに書き込まれ、また、外部ＶＯＬから読み出されたデータは、その外部ＶＯＬに対応付けられている内部ＶＯＬに書き込まれる。本実施例では、内部ＶＯＬの容量と、その内部ＶＯＬが対応する外部ＶＯＬの容量は、同じである。なお、１つの内部ＶＯＬが複数の外部ＶＯＬに対応していても良いし、複数の内部ＶＯＬが１つの外部ＶＯＬに対応していても良い。また、キャッシュＳＳＤ２００は、内蔵されることに代えて、ホスト１００の外に存在しても良い。その場合、例えば、キャッシュＳＳＤ２００は、ホスト１００と外部ストレージ４００との間の通信よりも通信速度の速い通信方式で通信が行われるように設けられても良い（例えば、ホスト１００と外部ストレージ４００との接続がファイバチャネルであるのに対し、ＣＰＵ１０１と外部のキャッシュＳＳＤ２００との接続はＰＣＩ−Ｅｘｐｒｅｓｓ）。また、キャッシュ機能を有する物理記憶デバイスとして、ＳＳＤに代えて又は加えて、外部ストレージ４００との通信よりも高速な通信が可能な種類の物理記憶デバイスが採用されても良い。
【００２２】
キャッシュＳＳＤ２００は、例えば、通常のＳＳＤが有する機能に代えて又は加えて、本実施例に従うキャッシュ機能を有する。キャッシュＳＳＤ２００は、例えば、メモリ２３０と、フラッシュメモリ（以下、ＦＭ）２１０と、それらに接続されたＣＰＵ２１５とを有する。キャッシュＳＳＤ２００が有する機能は、通常機能とキャッシュ機能とに大別することができる。通常機能は、通常制御プログラム２３１に相当する。キャッシュ機能は、アクセス処理プログラム２４１、構成／保守制御プログラム２４２、リスト管理プログラム２４３及びＳＳＤキャッシュ情報２５０に相当する。
【００２３】
メモリ３００は、例えば、ＶＭ（Virtual Machine）制御モジュール３１０、ストレージ制御ＶＭ３３０及びアプリケーションＶＭ３２０を記憶する。これらはＣＰＵ１０１で実行される。
【００２４】
ストレージ制御ＶＭ３３０及びアプリケーションＶＭ３２０は、仮想マシンイメージであり、ＶＭ制御モジュール３１０は、仮想マシンを管理するモジュール（例えば、ハイパバイザ）である。モジュール３１０内のＶＭ制御プログラム３１１が実行されることにより、それぞれの仮想マシンイメージに内蔵したプログラムをあたかも独立した計算機が実行するように、ＶＭ３３０及び３２０が並列に実行することができる。なお、以下の説明では、それぞれの仮想マシンイメージを、独立した計算機として説明する。ＣＰＵ１０１がアプリケーションＶＭ３２０を読み込んでＶＭ制御プログラム３１１を実行した場合、ＣＰＵ１０１は、アプリケーションプログラム（例えば、データベース管理システム）３２１を実行することができる。ＣＰＵ１０１がストレージ制御ＶＭ３３０を読み込んでＶＭ制御プログラム３１１を実行した場合、ＣＰＵ１０１は、アクセス処理プログラム３３３を実行して、内部ＶＯＬと外部ＶＯＬとの間でのデータ転送を実行することができる。なお、ストレージ制御ＶＭ３３０は、キャッシュＳＳＤ２００の通常領域（キャッシュとは別の用途に用いられる記憶領域）に格納されていて、起動時に、その通常領域からメモリ３００に展開されてもよい。内部ＶＯＬは、通常領域及びキャッシュ領域のうちのキャッシュ領域に基づいている。
【００２５】
アプリケーションＶＭ３２０の数は、１以上である。アプリケーションＶＭ３２０は、アプリケーションプログラム３２１及びパス制御プログラム３２２を有する。
【００２６】
アプリケーションプログラム３２１は、所定の業務を実行する。
【００２７】
パス制御プログラム３２２は、内部ＶＯＬを認識するためのデバイス問合せを送信し、検出した内部ＶＯＬにアプリケーションプログラム３２１がアクセスするための識別子を付与する。
【００２８】
ストレージ制御ＶＭ３３０は、１以上のアプリケーションＶＭ３２０を管理する。ストレージ制御ＶＭ３３０は、構成／保守制御プログラム３３１、起動／終了制御プログラム３３２及びアクセス処理プログラム３３３を有し、ＳＳＤキャッシュ情報３５０を管理する。
【００２９】
構成／保守制御プログラム３３１は、ストレージ制御ＶＭ３３０の構成変更を行ったり保守処理を行ったりする。
【００３０】
起動／終了制御プログラム３３２は、ストレージ制御ＶＭ３３０の起動及び終了の際に必要な処理を行う。
【００３１】
アクセス処理プログラム３３３は、内部ＶＯＬに無いデータを、その内部ＶＯＬに対応する外部ＶＯＬから読み出したり、アプリケーションプログラム３２１から内部ＶＯＬに書き込まれたデータを、その内部ＶＯＬに対応する外部ＶＯＬに書き込んだりする。
【００３２】
ＳＳＤキャッシュ情報３５０は、内部ＶＯＬに対するアクセスの制御に必要な情報を有する。ＳＳＤキャッシュ情報３５０の数は、ＳＳＤキャッシュ情報２５０の数と、キャッシュＳＳＤ２００の数との積である。ＳＳＤキャッシュ情報２５０の数、及び／又は、キャッシュＳＳＤ２００の数は、２以上であって良い。例えば、１つのホスト１００につき、複数のキャッシュＳＳＤ２００があっても良いし、複数の内部ＶＯＬがあっても良い。
【００３３】
キャッシュＳＳＤ２００は、前述したように、ＣＰＵ２１５、メモリ２３０及びＦＭ２１０を有する。
【００３４】
ＦＭ２１０は、複数の物理ブロックで構成されている。内部ＶＯＬを構成する複数の論理ブロックと、ＦＭ２１０を構成する複数の物理ブロックとの対応関係が、キャッシュＳＳＤ２００において管理されている。論理ブロックと物理ブロックの対応関係は、動的に変更される。論理ブロックは、１個の物理ブロックに割り当てられてもよいし、複数個の物理ブロックに割り当てられてもよい。論理ブロックの容量は、１個の物理ブロックの容量と同じであっても良いし、複数個の物理ブロックの総容量と同じであっても良い。
【００３５】
メモリ２３０は、通常制御プログラム２３１、アクセス処理プログラム２４１、構成／保守制御プログラム２４２、リスト管理プログラム２４３及びＳＳＤキャッシュ情報２５０を記憶する。これらのプログラム２３１、２４１、２４２及び２４３は、ＣＰＵ２１５で実行される。
【００３６】
通常制御プログラム２３１は、ＦＭ２１０の一部を通常領域（通常のＳＳＤ）としてアプリケーションプログラム３２１に提供し、通常領域の提供のために必要な情報を管理する。従って、ＦＭ２１０は、キャッシュ領域として使用される内部ＶＯＬの他に、通常のＳＳＤとして使用される記憶領域を有する。
【００３７】
アクセス処理プログラム２４１は、内部ＶＯＬに対するアクセス処理を行う。
【００３８】
構成／保守制御プログラム２４２は、キャッシュＳＳＤ２００に関する初期設定、保守制御、起動及び終了に必要な処理を行う。
【００３９】
リスト管理プログラム２４３は、要求されたＳＳＤキャッシュ情報２５０が有する情報を提供する。
【００４０】
ＳＳＤキャッシュ情報２５０は、内部ＶＯＬの制御に必要な情報を有する。１つのキャッシュＳＳＤ２００を基に複数の内部ＶＯＬが用意されている場合、内部ＶＯＬ毎に１つのＳＳＤキャッシュ情報２５０が存在する。
【００４１】
図２は、ＳＳＤキャッシュ情報２５０を示す。
【００４２】
ＳＳＤキャッシュ情報２５０は、内部ＶＯＬと外部ＶＯＬとの関係を表す。以下、この図の情報２５０に対応する内部ＶＯＬを、図２の説明において、「対象内部ＶＯＬ」と言う。また、図２の説明において、ＦＭ２１０全体のうちの、対象内部ＶＯＬに割当て可能な物理ブロック群（１以上の物理ブロック）を、「対象物理領域」と言う。また、図２の説明において、対象内部ＶＯＬに対応した外部ＶＯＬを「対象外部ＶＯＬ」と言う。
【００４３】
ＳＳＤキャッシュ情報２５０は、ＯＮ／ＯＦＦフラグ２５１、実容量２５２ａ、ＬＵＮ２５３、仮容量２５２ｂ、リード元識別子２５５、ライト先識別子２５６、マップテーブル２６０、及び、ジョブ固有情報２８０を有する。
【００４４】
ＯＮ／ＯＦＦフラグ２５１は、対象内部ＶＯＬをアプリケーションＶＭ３２０に見せるかどうかを制御するためのフラグである。フラグ２５１がＯＮを表していれば、対象内部ＶＯＬがアプリケーションＶＭ３２０から見え、フラグ２５１がＯＦＦを表していれば、対象内部ＶＯＬがアプリケーションＶＭ３２０から見えない。
【００４５】
実容量２５２ａは、対象物理領域の記憶容量を表す情報である。本実施例では、対象物理記憶領域の記憶容量は、固定であるが、対象内部ＶＯＬに対する物理ブロックの割当てに応じて動的に変わってもよい。
【００４６】
ＬＵＮ２５３は、対象内部ＶＯＬのＬＵＮ（Logical Unit Number）である。対象内部ＶＯＬのＬＵＮが、アプリケーションＶＭ３２０からのアクセスコマンドにおいて指定され得る。なお、ＬＵＮに代えて、他種の情報が、対象内部ＶＯＬの識別情報として採用されて良い。
【００４７】
仮容量２５２ｂは、対象内部ＶＯＬの記憶容量を表す情報、すなわち、アプリケーションＶＭ３２０が認識する記憶容量を表す情報である。アプリケーションＶＭ３２０からの容量問い合わせに対して、仮容量２５２ｂがアプリケーションＶＭ３２０に回答される。実容量２５２ａが表す容量と仮容量２５２ｂが表す容量は同じでも良いし異なっていても良い。また、仮容量２５２ｂは、対象外部ＶＯＬの記憶容量と同じかそれより大きくて良い。
【００４８】
リード元識別子２５５は、リード元の外部ＶＯＬの識別子である。
【００４９】
ライト先識別子２５６は、ライト先の外部ＶＯＬの識別子である。本実施例では、対象内部ＶＯＬに対応した外部ＶＯＬ（以下、対象外部ＶＯＬ）が、リード元の外部ＶＯＬでもあり、ライト先の外部ＶＯＬでもある。しかし、リード元の外部ＶＯＬとライト先の外部ＶＯＬは異なっていても良い。
【００５０】
マップテーブル２６０は、対象内部ＶＯＬに対応した複数の論理アドレスと、対象物理領域に対応した複数の物理アドレスとの対応関係を表すテーブルである。具体的には、例えば、マップテーブル２６０は、複数のエントリを有する。各エントリは、タグ２６１、キューポインタ２６２、及びブロック番号２６３を有する。タグ２６１は、対象内部ＶＯＬに対応した複数の論理アドレス（例えばＬＢＡ（Logical Block Address））のうちの１つの論理アドレスに関する値（例えば、論理アドレスのハッシュ値、又は、論理アドレスの一部分）を有する。タグ２６１は、論理アドレスそれ自体であっても良い。キューポインタ２６２は、エントリの解放管理をするための情報である。ブロック番号２６３は、対象物理領域を構成する複数の物理ブロックのうちの１つの物理ブロックを表す番号である。従って、このテーブル２６０では、タグ２６１とブロック番号２６３との対応付けで、対象内部ＶＯＬに関する論理アドレスと対象物理領域に関する物理アドレスとの対応付けが管理される。なお、エントリに複数のブロック番号２６３を格納して、１個の論理ブロックの容量を複数個の物理ブロックの容量に拡張できるようにしてもよいし、仮容量２５２ｂを、対象外部ＶＯＬの記憶容量より大きくする、すなわち内部ＶＯＬの論理アドレスと対応する外部ＶＯＬの論理アドレスとの対応付けを任意とするために、エントリに外部ＶＯＬの論理アドレスを格納してもよい。論理アドレスと物理アドレスとの対応関係は、テーブル以外の情報（例えばキュー）で管理されても良い。
【００５１】
本実施例では、アクセス処理プログラム２４１が、「ジョブ」と呼ばれる単位で多重実行されるが、ジョブ固有情報２８０は、ジョブの処理に必要な情報である。１つのジョブにつき１つのジョブ固有情報２８０がある。ジョブ固有情報２８０は、例えば、リード元外部ＶＯＬ（対象外部ＶＯＬ）の識別子であるリード元識別子２８５と、ライト先外部ＶＯＬ（対象外部ＶＯＬ）の識別子であるライト先識別子２８６と、ジョブの終了ステータス（例えば、正常終了か異常終了）を表す情報である終了ステータス情報２９１とを有する。識別子２８５は、例えば、識別子２５５のコピーであり、識別子２８６は、例えば、識別子２８６のコピーである。
【００５２】
図３は、ＳＳＤキャッシュ情報３５０を示す。
【００５３】
ＳＳＤキャッシュ情報３５０とＳＳＤキャッシュ情報２５０が１対１で対応する。ＳＳＤキャッシュ情報３５０は、内部ＶＯＬと外部ＶＯＬとの関係を表す。以下、この図の情報３５０に対応する内部ＶＯＬを、図３の説明において、「対象内部ＶＯＬ」と言う。また、図３の説明において、対象内部ＶＯＬに対応した外部ＶＯＬを「対象外部ＶＯＬ」と言う。
【００５４】
ＳＳＤキャッシュ情報３５０は、キャッシュ識別子３５１、外部ＶＯＬ識別子３５５、容量３５２ｂ、オフセット３５９及びマップテーブル３６０を有する。
【００５５】
キャッシュ識別子３５１は、対象内部ＶＯＬをアプリケーションＶＭ３２０が識別するための識別子（対象内部ＶＯＬの識別子）である。
【００５６】
外部ＶＯＬ識別子３５５は、対象外部ＶＯＬの識別子（例えば、ＷＷＮ（World Wide Name）、ＬＵＮ及びポート番号を含んだ情報）である。
【００５７】
容量３５２ｂは、対象外部ＶＯＬの記憶容量を表す情報である。
【００５８】
オフセット３５９は、対象内部ＶＯＬの論理アドレス（例えばＬＢＡ）と対象外部ＶＯＬの論理アドレスとの差分を表す情報である。本実施例では、その差分はゼロである。なぜなら、本実施例では、内部ＶＯＬの記憶容量とそれに対応する外部ＶＯＬの記憶容量は同じであるからである。
【００５９】
マップテーブル３６０は、この情報３５０に対応したＳＳＤキャッシュ情報２５０内のマップテーブル３６０のコピーである。
【００６０】
以下、本実施例で行われる処理を説明する。なお、以下、アクセス処理に関する説明では、混同を防ぐために、アプリケーションＶＭ３２０からキャッシュＳＳＤ２００への要求を、「コマンド」と呼び、キャッシュＳＳＤ２００からストレージ制御ＶＭ３３０への要求を、「依頼」と呼び、ホスト１００から外部ＶＯＬにアクセスするための要求を、「要求」と呼ぶことにする。
【００６１】
図４は、キャッシュＳＳＤ２００内のアクセス処理プログラム２４１が行う処理のフローチャートである。
【００６２】
アクセス処理プログラム２４１が、各ＳＳＤキャッシュ情報２５０について、ＯＮ／ＯＦＦフラグ２５１を参照する。フラグ２５１がＯＦＦであるＳＳＤキャッシュ情報２５０については、プログラム２４１は、そのフラグ２５１がＯＮになるまで（Ｓ１０１：Ｙ）、処理を続行しない。すなわち、プログラム２４１は、フラグ２５１がＯＦＦの場合、アプリケーションＶＭ３２０からデバイス存在の問合せを受けても、そのフラグ２５１を有する情報２５０に対応した内部ＶＯＬがあることを応答しない。このため、アプリケーションＶＭ３２０は、フラグ２５１を有する情報２５０に対応した内部ＶＯＬの存在を認識しない。
【００６３】
プログラム２４１が、アプリケーションＶＭ３２０からコマンドを待つ（Ｓ１０２）。コマンドがあれば、プログラム２４１は、ジョブを生成して（Ｓ１０３）、ジョブ処理へ遷移する。その際、プログラム２４１は、リード元識別子２５５、ライト先識別子２５６を、その生成されたジョブに対応するジョブ固有情報２８０内に、リード元識別子２８５及びライト先識別子２８６としてそれぞれコピーする。
【００６４】
ジョブ処理において、プログラム２４１は、受け付けたコマンドを解析する（Ｓ１０４）。具体的には、例えば、プログラム２４１は、下記の処理を行う。
＊プログラム２４１は、コマンドの種別を特定する。
＊コマンドの種別がリード又はライトの場合、コマンドには、アクセス先情報が含まれている。アクセス先情報は、アクセス先内部ＶＯＬを表すＬＵＮと、内部ＶＯＬにおけるアクセス先の領域を表すアドレス（以下、アクセス先アドレス）とを有する。コマンドの種別がリード又はライトであった場合、プログラム２４１は、アクセス先内部ＶＯＬに対応したＳＳＤキャッシュ情報２５０（コマンドで指定されているＬＵＮを表すＬＵＮ２５３を含んだＳＳＤキャッシュ情報２５０）を特定する。
【００６５】
コマンドの種別がリードであった場合（Ｓ１０５：Ｙ）、プログラム２４１は、リード処理（Ｓ１０６）を行う。
【００６６】
コマンドの種別がライトであった場合（Ｓ１０７：Ｙ）、プログラム２１４は、ライト処理（Ｓ１０８）を行う。
【００６７】
コマンドの種別がリードとライトのどちらでもなかった場合（Ｓ１０７：Ｎ）、プログラム２１４は、そのコマンドに従う処理（Ｓ１０９）を行う。
【００６８】
図５は、キャッシュＳＳＤ２００でのリード処理（図４のＳ１０５）を示すフローチャートである。
【００６９】
プログラム２４１は、図４のＳ１０４で特定したＳＳＤキャッシュ情報２５０内のマップテーブル２６０を基に、ヒットミス判定処理（Ｓ１１０）を行う。具体的には、ヒットミス判定処理がコールされる。
【００７０】
Ｓ１１０の結果、対応するエントリがマップテーブル２６０から見つかった場合（Ｓ１１１：Ｙ）、リード対象のデータは既にＦＭ２１０にあるということである。このため、プログラム２４１は、見つかったエントリ内のブロック番号２６３から同定される物理ブロックからデータを読み出し、読み出したデータを、アクセス元（コマンドの送信元であるアプリケーションＶＭ３２０）に転送する（Ｓ１１２）。プログラム２４１は、このリード処理（ジョブ）に対応するジョブ固有情報２８０に、終了ステータス２９１として、正常終了を表す情報をセットする（Ｓ１１３）。プログラム２４１は、正常終了を表すステータスを、アクセス元に送信する（Ｓ１１４）。
【００７１】
Ｓ１１０の結果、新エントリの割り当てとなった場合（Ｓ１１５：Ｙ）、リード対象のデータが、ＦＭ２１０に無いということである。このため、プログラム２４１は、外部リード依頼処理を行う（Ｓ１１６）。具体的には、プログラム２４１は、外部リード依頼処理を呼び出す。これにより、外部ストレージ４００にリード要求を出すことの依頼（リード依頼）が、ストレージ制御ＶＭ３３０に送信される。
【００７２】
Ｓ１１６での戻り値が正常を表している場合（Ｓ１１７：Ｙ）、ストレージ制御ＶＭ３３０からの応答は、ストレージ制御ＶＭ３３０によって外部ストレージ４００（具体的には、アクセス先内部ＶＯＬに対応した外部ＶＯＬ）から読み出されたデータを有する。プログラム２４１は、ＳＳＤ書込みを行う（Ｓ１１８）。具体的には、プログラム２４１は、そのデータをＦＭ２１０（アクセス先内部ＶＯＬ）に書き込む。その後、プログラム２４１は、前述したＳ１１２〜Ｓ１１４を実行する。
【００７３】
Ｓ１１６での戻り値が異常を表している場合（Ｓ１１７：Ｎ）、プログラム２４１は、このリード処理（ジョブ）に対応するジョブ固有情報２８０に、終了ステータス２９１として、異常終了を表す情報をセットする（Ｓ１１９）。プログラム２４１は、異常終了を表すステータスを、アクセス元に送信する（Ｓ１１４）。
【００７４】
Ｓ１１０の結果、新エントリの割り当てでもない場合（Ｓ１１５：Ｎ）、Ｓ１０４で特定されたアクセス先アドレス（例えばＬＢＡ）が不正であるということである。このため、プログラム２４１は、このリード処理（ジョブ）に対応するジョブ固有情報２８０に、終了ステータス２９１として、アクセス先アドレスが不正であることを意味する情報をセットする（Ｓ１２０）。プログラム２４１は、アドレス不正を表すステータスを、アクセス元に送信する（Ｓ１１４）。
【００７５】
図６は、ヒットミス判定処理を示すフローチャートである。
【００７６】
アクセス処理プログラム２４１は、アクセス先アドレスに対応するエントリがマップテーブル２６０にあるか否かを判断する（Ｓ１２５）。具体的には、例えば、プログラム２４１は、下記の処理を行う。
（処理１）プログラム２４１は、Ｓ１０４で特定したアクセス先アドレス（例えばＬＢＡ）のハッシュ値を生成する。
（処理２）プログラム２４１は、（処理１）で生成したハッシュ値をインデクスとしてエントリを特定する。
（処理３）プログラム２４１は、上記インデクスの上位部分がタグ２６１の上位部分と一致するか調べる。
（処理４）（処理３）の結果、不一致ならば、プログラム２４１は、タグ２６１の下位のリンクビットを参照する。そのリンクビットがＯＦＦを表していれば、プログラム２４１は、検索を終了する。そのリンクビットがＯＮを表していれば、プログラム２４１は、上記（処理１）を行う。その際、生成されるハッシュ値は、直前の（処理３）で参照されたインデクスのハッシュ値である。
【００７７】
Ｓ１２５で、対応するエントリが見つかった場合（Ｓ１２６：Ｙ）、プログラム２４１は、エントリ有りを意味する値を、ヒットミス判定処理の呼出し元に返す（Ｓ１２８）。
【００７８】
Ｓ１２５で、対応するエントリが見つからなかった場合（Ｓ１２６：Ｎ）、プログラム２４１は、アクセス先アドレスが正常な範囲に属するアドレスであり、かつ、ＦＭ２１０に空きの物理ブロック（内部ＶＯＬの論理ブロックに割り当て可能な物理ブロック）があるかどうかを判断する（Ｓ１２９ａ）。
【００７９】
Ｓ１２９ａの判断の結果が肯定的の場合（Ｓ１２９ａ：Ｙ）、プログラム２４１は、マップテーブル２６０から空きのエントリを確保し、アクセス先アドレスに対応した論理ブロックに、空きの物理ブロックを割り当てる（Ｓ１３０ａ）。プログラム２４１は、Ｓ１３０ａで確保したエントリを初期化する（Ｓ１３１）。Ｓ１３１では、例えば、確保したエントリに、タグ２６１として、アクセス先アドレスに関する値がセットされ、ブロック番号２６３として、Ｓ１３０ａで割り当てられた物理ブロックの番号がセットされる。プログラム２４１は、新エントリを表す値を、ヒットミス判定処理の呼び出し元に返す。
【００８０】
Ｓ１２９ａの判断の結果が否定的の場合（Ｓ１２９ａ：Ｎ）、プログラム２４１は、空きの物理ブロックの有無を表す値を、ヒットミス判定処理の呼び出し元に返す。ただし、本実施例では、内部ＶＯＬの記憶容量と、その内部ＶＯＬに対応する外部ＶＯＬの記憶容量は一致するため、空きの物理ブロックがなくなることはない。
【００８１】
図７は、外部リード依頼処理を示すフローチャートである。
【００８２】
アクセス処理プログラム２４１は、Ｓ１０４で特定したアクセス先アドレスと、リード元識別子２５５（Ｓ１０４で特定したＳＳＤキャッシュ情報２５０内の識別子２５５）とを有するリード依頼を作成し、そのリード依頼を、ストレージ制御ＶＭ３３０へ送信する（Ｓ１３５）。
【００８３】
プログラム２４１は、リード依頼を送信してから所定の時間内にストレージ制御ＶＭ３３０から応答を受けた場合（Ｓ１３６：Ｎ、Ｓ１３７）その応答が正常か否かを判断する（Ｓ１３８）。
【００８４】
Ｓ１３８の判断の結果が肯定的である場合（Ｓ１３８：Ｙ）、プログラム２４１は、外部リード依頼処理の呼出し元に返す値として、正常を表す値を生成し（Ｓ１３９）、その呼び出し元に制御を返す。
【００８５】
Ｓ１３８の判断の結果が否定的である場合（Ｓ１３８：Ｎ）、プログラム２４１は、外部リード依頼処理の呼出し元に返す値として、異常を表す値を生成し（Ｓ１４０）、呼び出し元に制御を返す。
【００８６】
プログラム２４１は、リード依頼を送信してから所定の時間内にストレージ制御ＶＭ３３０から応答を受けなかった場合（Ｓ１３６：Ｙ）、外部リード依頼処理の呼出し元に返す値として、異常を表す値を生成し（Ｓ１４０）、呼び出し元に制御を返す。
【００８７】
図８は、ＳＳＤ書込みを示すフローチャートである。
【００８８】
プログラム２４１は、マップテーブル２６０内のエントリから特定された物理ブロック（ＦＭ２１０における物理ブロック）に、データを書き込む（Ｓ１４５）。その後、処理が、ＳＳＤ書込みの呼び出し元に戻る。
【００８９】
図９は、キャッシュＳＳＤ２００でのライト処理（図４のＳ１０７）を示すフローチャートである。
【００９０】
プログラム２４１は、図４のＳ１０４で特定したＳＳＤキャッシュ情報２５０内のマップテーブル２６０を基に、ヒットミス判定処理（Ｓ１５０）、すなわち、図６に示した処理を行う。
【００９１】
Ｓ１５０の結果、対応するエントリがマップテーブル２６０から見つかった場合（Ｓ１５１：Ｙ）、プログラム２４１は、ＳＳＤ書込みを行う（Ｓ１５２）。これにより、図８の処理が行われる。この処理での書込み先は、アクセス先内部ＶＯＬ内の論理ブロック（アクセス先アドレスに対応する論理ブロック）、具体的には、その論理ブロックが割り当てられた物理ブロックである。
【００９２】
Ｓ１５０の結果、新エントリの割り当てとなった場合（Ｓ１６０：Ｙ）、プログラム２４１は、外部リード依頼処理を行う（Ｓ１６１）。これにより、図７の処理が行われる。なお、ここでは、ライト処理によって書き換えられる部分を含んだデータが外部ＶＯＬから読み出される。その後、Ｓ１５２で、読み出されたデータの一部（又は全部）に、ライト対象のデータが上書きされる。
【００９３】
Ｓ１６１での戻り値が正常を表している場合（Ｓ１６２：Ｙ）、プログラム２４１は、Ｓ１５２以降の処理を続行する。Ｓ１６１での戻り値が異常の場合（Ｓ１６２：Ｎ）は、プログラム２４１は、後述するＳ１６３以降の処理を続行する。
【００９４】
次に、プログラム２４１は、ライト先識別子２８６（アクセス先内部ＶＯＬに対応したＳＳＤキャッシュ情報２５０内の識別子２８６）を指定した外部ライト依頼処理を行う（Ｓ１５４）。
【００９５】
Ｓ１５４での戻り値が正常を表している場合（Ｓ１５５：Ｙ）、プログラム２４１は、このライト処理（ジョブ）に対応するジョブ固有情報２８０に、終了ステータス２９１として、正常終了を表す情報をセットする（Ｓ１５６）。プログラム２４１は、正常終了を表すステータスを、アクセス元（アプリケーションＶＭ３２０）に送信する（Ｓ１５７）。
【００９６】
Ｓ１５４での戻り値が異常を表している場合（Ｓ１５５：Ｙ）、プログラム２４１は、このライト処理（ジョブ）に対応するジョブ固有情報２８０に、終了ステータス２９１として、異常終了を表す情報をセットする（Ｓ１６３）。プログラム２４１は、異常終了を表すステータスを、アクセス元（アプリケーションＶＭ３２０）に送信する（Ｓ１６４）。
【００９７】
このように、本実施例では、プログラム２４１は、アクセス先内部ＶＯＬとそれに対応する外部ＶＯＬとの両方にライト対象のデータが書き込まれた後に、アクセス元に応答（ステータス）を返す。
【００９８】
Ｓ１５０の結果、新エントリの割り当てでもない場合（Ｓ１６０：Ｎ）は、Ｓ１０４で特定されたアクセス先アドレス（例えばＬＢＡ）が不正であるということである。このため、プログラム２４１は、このライト処理（ジョブ）に対応するジョブ固有情報２８０に、終了ステータス２９１として、アクセス先アドレスが不正であること（例えば、空き物理ブロックが無いこと）を意味する情報をセットする（Ｓ１６５）。プログラム２４１は、アドレス不正を表すステータスを、アクセス元に送信する（Ｓ１６４）。
【００９９】
図１０は、外部ライト依頼処理を示すフローチャートである。
【０１００】
プログラム２４１は、ライト先識別子２５６（外部ＶＯＬの識別子）とＳ１０４で特定されたアクセス先アドレスとを有するライト依頼を作成し、そのライト依頼及びライト対象データを、ストレージ制御ＶＭ３３０へ送信する（Ｓ１７５）。
【０１０１】
プログラム２４１は、ライト依頼及ライト対象データを送信してから所定の時間内にストレージ制御ＶＭ３３０から応答を受けた場合（Ｓ１７６：Ｎ、Ｓ１７７）その応答が正常か否かを判断する（Ｓ１７７）。
【０１０２】
Ｓ１７７の判断の結果が肯定的である場合（Ｓ１７７：Ｙ）、プログラム２４１は、外部ライト依頼処理の呼出し元に返す値として、正常を表す値を生成し（Ｓ１７９）、その呼び出し元に制御を返す。
【０１０３】
Ｓ１７７の判断の結果が否定的である場合（Ｓ１７７：Ｎ）、プログラム２４１は、外部ライト依頼処理の呼出し元に返す値として、異常を表す値を生成し（Ｓ１８１）、呼び出し元に制御を返す。
【０１０４】
プログラム２４１は、ライト依頼を送信してから所定の時間内にストレージ制御ＶＭ３３０から応答を受けなかった場合（Ｓ１７６：Ｙ）、外部ライト依頼処理の呼出し元に返す値として、異常を表す値を生成し（Ｓ１８０）、呼び出し元に制御を返す。
【０１０５】
図１１は、ストレージ制御ＶＭ３３０内のアクセス処理プログラム３３３が行う処理を示すフローチャートである。
【０１０６】
プログラム３３３は、キャッシュＳＳＤ２００からの依頼を待つ（Ｓ３０２）。プログラム３３３は、依頼があれば、ジョブを生成して（Ｓ３０３）、Ｓ３０２に戻る。
【０１０７】
ジョブ処理において、プログラム３３３は、受け付けた依頼の解析を行う（Ｓ３０４）。受け付けた依頼の種別がリードの場合（Ｓ３０５：Ｙ）、プログラム３３３は、リード処理を行う（Ｓ３０６）。受け付けた依頼の種別がライトの場合（Ｓ３０７：Ｙ）、プログラム３３３は、ライト処理を行う（Ｓ３０８）。受け付けた依頼の種別が、リード及びライト以外の場合（Ｓ３０７：Ｎ）、プログラム３３３は、その依頼に従う処理を行う（Ｓ３０９）。
【０１０８】
図１２は、ストレージ制御ＶＭ３３０が行うリード処理（図１１のＳ３０６）を示すフローチャートである。
【０１０９】
アクセス処理プログラム３３３は、アドレス変換を行う（Ｓ３１０）。具体的には、プログラム３３３は、下記の処理を行う。
＊プログラム３３３は、キャッシュＳＳＤ２００から受領したリード依頼が有するリード元識別子２５５から特定される外部ＶＯＬ識別子３５５を含んだＳＳＤキャッシュ情報３５０内のオフセット３５９を特定する。
＊プログラム３３３は、そのリード依頼が有するアクセス先アドレスを、特定されたオフセット３５９分ずらす。
【０１１０】
プログラム３３３は、変換後のアドレス（外部ＶＯＬについてのアドレス）と上記特定された外部ＶＯＬ識別子３５５とを有するリード要求を外部ストレージ４００に送信する（Ｓ３１１）。
【０１１１】
Ｓ３１１の結果が正常であれば（Ｓ３１２：Ｙ）、すなわち、Ｓ３１１で送信されたリード要求に応答して、外部ストレージ４００からデータが読み出されたならば、プログラム３３３は、そのデータを、リード依頼の送信元（キャッシュＳＳＤ２００）に転送する（Ｓ３１３）。そして、プログラム３３３は、正常を表すステータスを、リード依頼の送信元（キャッシュＳＳＤ２００）に返す（Ｓ３２０、Ｓ３２１）。
【０１１２】
Ｓ３１１の結果が失敗であれば（Ｓ３１２：Ｎ）、プログラム３３３は、異常を表すステータスを、リード依頼の送信元（キャッシュＳＳＤ２００）に返す（Ｓ３２２、Ｓ３２１）。
【０１１３】
図１３は、ストレージ制御ＶＭ３３０が行うライト処理（図１１のＳ３０８）を示すフローチャートである。
【０１１４】
アクセス処理プログラム３３３は、キャッシュＳＳＤ２００からライト依頼及びライト対象データを受信する（Ｓ３４０）。
【０１１５】
プログラム３３３は、アドレス変換を行う（Ｓ３４１）。具体的には、プログラム３３３は、下記の処理を行う。
＊プログラム３３３は、キャッシュＳＳＤ２００から受領したライト依頼が有するライト識別子２５６から特定される外部ＶＯＬ識別子３５５を含んだＳＳＤキャッシュ情報３５０内のオフセット３５９を特定する。
＊プログラム３３３は、そのライト依頼が有するアクセス先アドレスを、特定されたオフセット３５９分ずらす。
【０１１６】
プログラム３３３は、変換後のアドレス（外部ＶＯＬについてのアドレス）と上記特定された外部ＶＯＬ識別子３５５とを有するライト要求と、ライト対象データとを、外部ストレージ４００に送信する（Ｓ３４２）。
【０１１７】
Ｓ３４２の結果が正常であれば（Ｓ３４３：Ｙ）、すなわち、Ｓ３４２で送信されたライト要求に応答して、外部ストレージ４００から完了応答を受信したならば、プログラム３３３は、正常を表すステータスを、ライト依頼の送信元（キャッシュＳＳＤ２００）に返す（Ｓ３５０、Ｓ３５１）。
【０１１８】
Ｓ３４２の結果が失敗であれば（Ｓ３４３：Ｎ）、プログラム３３３は、異常を表すステータスを、ライト依頼の送信元（キャッシュＳＳＤ２００）に返す（Ｓ３５２、Ｓ３５１）。
【０１１９】
以上が、アクセス処理に関する説明である。次に、初期設定、起動及び終了に関する各処理を説明する。なお、その説明では、アクセス処理に関する説明と違い、「コマンド」、「依頼」及び「要求」という言葉を使い分けず、それらを「要求」という言葉に統一することにする。
【０１２０】
図１４は、初期設定処理を示すラダーチャートである。
【０１２１】
キャッシュＳＳＤ２００内の構成／保守制御プログラム２４２が、キャッシュＳＳＤ２００に設定すべき情報（以下、キャッシュ定義情報）を、管理者から受ける（Ｓ４０１）。キャッシュ定義情報は、ホスト１００に設定される情報を含んだ情報、例えば、内部ＶＯＬのＬＵＮ及び実容量２５２ａと、通常領域（ＦＭ２１０のうち、キャッシュとは別の用途に利用される記憶領域）の記憶容量を表す情報とを含んだ情報である。例えば、プログラム２４２が、設定情報が有するＬＵＮから特定される内部ＶＯＬ（以下、図１４の説明において「対象内部ＶＯＬ」と言う）に対応したＳＳＤキャッシュ情報２５０に、その内部ＶＯＬの実容量２５２ａを設定する。また、プログラム２４２は、上記設定情報が有する、通常領域の記憶容量を表す情報を設定する。
【０１２２】
次に、プログラム２４２は、キャッシュＳＳＤ２００のキャッシュの初期設定を行う（Ｓ４０５）。具体的には、例えば、プログラム２４２は、対象内部ＶＯＬに対応したＳＳＤキャッシュ情報２５０に、ＯＮ／ＯＦＦフラグ２５１としてＯＦＦを設定し、マップテーブル２６０の全エントリに、タグ２６１、キューポインタ２６２及びブロック番号２６３として、無効な値を書き込む。
【０１２３】
一方、ストレージ制御ＶＭ３３０内の構成／保守制御プログラム３３１が、管理者から、ストレージ制御ＶＭ３３０から外部ＶＯＬへのアクセスのための情報（以下、外部ＶＯＬ定義情報）を受ける（Ｓ４１１）。外部ＶＯＬ定義情報は、例えば、ＳＳＤキャッシュ情報３５０に設定される情報３５１、３５６、３５９及び３５２ｂを有する。プログラム３３１は、その外部ＶＯＬ定義情報を用いて、対象内部ＶＯＬ（アドレス０〜９９９）に対応したＳＳＤキャッシュ情報３５０に、種々の情報を設定する（Ｓ４１５）。たとえば、外部ＶＯＬの前半１/２を第１の内部ＶＯＬに対応付け外部ＶＯＬの後半１/２を第２の内部ＶＯＬにそれぞれ対応付けたい場合、第１の内部ＶＯＬについてのオフセット３５９として「０」が設定され、第２の内部ＶＯＬについてのオフセット３５９として「４９９」が設定されれば良い。
【０１２４】
その後、プログラム３３１は、設定情報を、キャッシュＳＳＤ２００に送信する（Ｓ４２１ａ）。設定情報は、例えば、ライト先識別子２５６、リード元識別子２５５及び仮容量２５２ｂを含む。識別子２５６及び２５５は、外部ＶＯＬ識別子３５５又はそれに一意に対応した識別子（ストレージ制御ＶＭ３３０上での識別子）である。仮容量２５２ｂは、容量３５２ｂとオフセット３５９とを基に算出された値である。設定情報の送信先は、対象内部ＶＯＬの基になっているキャッシュＳＳＤ２００である。
【０１２５】
キャッシュＳＳＤ２００において、プログラム２４２は、受信したライト先識別子２５６、リード元識別子２５５及び仮容量２５２ｂを、対象内部ＶＯＬに対応するＳＳＤキャッシュ情報２５０に設定して（Ｓ４２２ａ）、応答を返す（Ｓ４３１）。
【０１２６】
ストレージ制御ＶＭ３３０内のプログラム３３１が、キャッシュＳＳＤ２００からの応答を受信して、初期設定が終了する。
【０１２７】
図１５は、ホスト１００での起動処理を示すラダーチャートである。
【０１２８】
まず、ＣＰＵ１０１が、ＶＭ制御モジュール３１０を起動する（Ｓ５０１）。一方、キャッシュＳＳＤ２００も、電源投入に伴い起動する（Ｓ５０２）。さらに、ＣＰＵ１０１は、ストレージ制御ＶＭ３３０及びアプリケーションＶＭ３２０のそれぞれに起動要求を送信する（Ｓ５０３、Ｓ５０４）。ストレージ制御ＶＭ３３０がキャッシュＳＳＤ２００の通常領域に格納されている場合は、この時点で、ＣＰＵ１０１がキャッシュＳＳＤ２００からＶＭ３３０を読み出してメモリ３００に展開し、ＶＭ３３０に起動要求を送信する。次に、ＣＰＵ１０１は、ストレージ制御ＶＭ３３０内の起動／終了プログラム３３２を起動し（Ｓ５１０）、且つ、アプリケーションＶＭ３２０内のパス制御プログラム３２２を起動する（Ｓ５０５）。
【０１２９】
さらに、パス制御プログラム３２２は、デバイス問合せ（内部ＶＯＬが存在するかどうかの問合せ）を、キャッシュＳＳＤ２００に送信する（Ｓ５０７）。ただし、この時点では、全てのＳＳＤキャッシュ情報２５０内のＯＮ／ＯＦＦフラグ２５１がＯＦＦになっているため、デバイス問合せに対して、内部ＶＯＬの存在を表す応答は返ってこない。以降、パス制御プログラム３２２は、定期的に（又は不定期的に）、Ｓ５０７を繰り返す。
【０１３０】
一方、起動／終了プログラム３３２は、キャッシュＳＳＤ２００に、内部ＶＯＬを有効にすることの要求である有効要求を送信する（Ｓ５１６）。
【０１３１】
キャッシュＳＳＤ２００内の構成／保守制御プログラム２４２が、内部ＶＯＬの有効要求を受け、その要求に応答して、ＳＳＤキャッシュ情報２５０内のＯＮ／ＯＦＦフラグ２５１をＯＮにする（Ｓ５１７）。すなわち、この起動処理によれば、ストレージ制御ＶＭ３３０が起動していなければ、内部ＶＯＬが存在することがアプリケーションＶＭ３２０に開示されず、ストレージ制御ＶＭ３３０が起動した後に、内部ＶＯＬが存在することがアプリケーションＶＭ３２０に開示される。これにより、ストレージ制御ＶＭ３３０が起動していないなど、対応する外部ＶＯＬにアクセスできない内部ＶＯＬをアプリケーションＶＭ３２０が参照するということが生じないようにすることができる。なお、内部ＶＯＬの有効要求は全ての内部ＶＯＬに対して行ってもよいし、適宜一部の内部ＶＯＬに対して行ってもよい。
【０１３２】
以降、内部ＶＯＬへのアクセスが可能になるので、アクセス処理プログラム２４１が、アプリケーションＶＭ３２０からのデバイス問合せに応答する（Ｓ５１８）。さらに、プログラム２４１は、内部ＶＯＬが存在することを意味する応答（以下、存在応答）を、ストレージ制御ＶＭ３３０に返す（Ｓ５１９）。
【０１３３】
アプリケーションＶＭ３２０は、存在応答を受信することで、内部ＶＯＬへのアクセスが可能になったことを知り、内部ＶＯＬをマウントする（内部ＶＯＬを認識する）（Ｓ５２５）。
【０１３４】
図１６は、ホスト１００での終了処理を示すラダーチャートである。
【０１３５】
ＶＭ制御モジュール３１０が、システムを終了することの要求である終了要求を受け付ける（Ｓ５３１）。終了要求は、管理者から入力されても良いし、所定のスケジュールに従って別のプログラムから入力されても良い。モジュール３１０は、その終了要求をアプリケーションＶＭ３２０に送信する（Ｓ５３２）。
【０１３６】
アプリケーションＶＭ３２０が、終了要求に応答して、内部ＶＯＬをアンマウントし（Ｓ５３３）、処理を終了する（Ｓ５３５）。
【０１３７】
ＶＭ制御モジュール３１０は、アプリケーションＶＭ３２０の終了を確認し（Ｓ５３９）、その後で、ストレージ制御ＶＭ３３０に終了要求を送信する（Ｓ５４０）。
【０１３８】
ストレージ制御ＶＭ３３０内の起動／終了制御プログラム３３２が、その終了要求に応答して、全てのジョブが終了するのを待つ。全てのジョブが終了した後（Ｓ５４５）、プログラム３３２が、内部ＶＯＬを無効にすることの要求である無効要求を、キャッシュＳＳＤ２００に送信する（Ｓ５４６）。
【０１３９】
無効要求を受けたキャッシュＳＳＤ２００内の構成／保守制御プログラム２４２が、全てのＳＳＤキャッシュ情報２５０内のＯＮ／ＯＦＦフラグ２５１をＯＦＦにし（Ｓ５４７）、応答をストレージ制御ＶＭ３３０に返す（Ｓ５４８）。
【０１４０】
ストレージ制御ＶＭ３３０内のプログラム３３２が、その応答を受けて、終了する（Ｓ５４９）。ＶＭ制御モジュール３１０が、ストレージ制御ＶＭ３３０の終了を確認する（Ｓ５５０）。
【０１４１】
図１７は、起動／終了制御プログラム３３２が行う処理を示すフローチャートである。
【０１４２】
起動／終了制御プログラム３３２は、受けた要求の種別を判断する（Ｓ６０１、Ｓ６０４）。
【０１４３】
要求が起動要求の場合（Ｓ６０１：Ｙ）、プログラム３３２は、Ｓ５１６及びＳ５１９を実行する。Ｓ５１６及びＳ５１９は、図１５のＳ５１６及びＳ５１９と同じなので、説明を省略する。
【０１４４】
要求が終了要求だった場合（Ｓ６０４：Ｙ）、プログラム３３２は、Ｓ５４５、Ｓ５４６、Ｓ５４８及びＳ５４９を実行する。Ｓ５４５、Ｓ５４６、Ｓ５４８及びＳ５４９は、図１６のＳ５４５、Ｓ５４６、Ｓ５４８及びＳ５４９と同じなので、説明を省略する。
【０１４５】
以上、実施例１によれば、アプリケーションＶＭ３２０からのリードコマンドに従うリード対象のデータが内部ＶＯＬ（ＦＭ２１０）に記憶されている場合、図５のＳ１１１：Ｙ以降の処理のとおり、ストレージ制御ＶＭ３３０を必要とせずに、リード処理を終了することができる。このため、リード性能の低下を抑えることができる。
【０１４６】
なお、実施例１では、ストレージ制御ＶＭ３３０内のアクセス処理プログラム３３３（又は、キャッシュＳＳＤ２００内のアクセス処理プログラム２４１）が、下記の処理を行ってもよい。
＊プログラム３３３が、プライマリの内部ＶＯＬからセカンダリの内部ＶＯＬにデータをコピーする内部コピーを行ってよい。この場合、プライマリ内部ＶＯＬの容量とセカンダリ内部ＶＯＬの容量は同じであり、プライマリ内部ＶＯＬ内のブロックとセカンダリ内部ＶＯＬ内のブロックとが１対１で対応して良い。内部コピーでは、プライマリ内部ＶＯＬの或るブロックに書き込まれたデータが、セカンダリ内部ＶＯＬ内の、その或るブロックに対応するブロックに、コピーされる。セカンダリ内部ＶＯＬはアプリケーションＶＭ３２０に認識されないで良い。また、プログラム３３３は、セカンダリ内部ＶＯＬのどのブロックにプライマリ内部ＶＯＬ内のデータが書き込まれていないか、どこに差分が生じているかを管理して良い。プライマリ内部ＶＯＬの基になっているキャッシュＳＳＤ２００とセカンダリ内部ＶＯＬの基になっているキャッシュＳＳＤ２００は、同一であっても良いし異なっていても良い。
＊プログラム３３３が、セカンダリ内部ＶＯＬ内のデータをプライマリ内部ＶＯＬにコピーする逆内部コピー（リストア）を行ってよい。プログラム３３３は、逆内部コピーを行う場合、両ＶＯＬの基になっている１以上のキャッシュＳＳＤ２００に、そのＶＯＬに対応したＳＳＤキャッシュ情報２５０内のマップテーブル２６０を初期化させて良い。
【実施例２】
【０１４７】
図１８を用いて、実施例２を説明する。図１８以外は、実施例１と同様なので、説明を省略又は簡略する。
【０１４８】
実施例２では、内部ＶＯＬの実容量２５２ａ（ＦＭ２１０における、内部ＶＯＬに割り当て可能な物理ブロック群の記憶容量）は、その内部ＶＯＬに対応する外部ＶＯＬの記憶容量より少なくて良い（内部ＶＯＬの仮容量２５２ｂは、外部ＶＯＬの記憶容量と同じかそれより大きくても良い）。
【０１４９】
図１８は、実施例２に係るヒットミス判定処理を示すフローチャートである。
【０１５０】
このヒットミス判定処理は、図６に示したヒットミス判定処理と異なり、アクセス処理プログラム２４１が、Ｓ１２９ｂにおいて、Ｓ１０４で特定したアクセス先アドレスが正常かどうかの判定のみ行い、ＦＭ２１０に空き物理ブロックがあるかどうかは判定しない。そして、Ｓ１３０ｂにおいて、プログラム２４１は、空き物理ブロックがない場合には、いずれかの割り当て済みの物理ブロックを空きの物理ブロックとし、その物理ブロックに、アクセス先アドレスに対応する論理ブロックを割り当てる。このため、その物理ブロックに対応したエントリ（マップテーブル２６０内のエントリ）は、更新される。この場合、その物理ブロックに記憶されているデータが破棄され、別の論理ブロックの新たなデータが上書きされることになる。しかし、本実施例では、それは問題とならない。なぜなら、本実施例では、内部ＶＯＬに書き込まれているデータが外部ＶＯＬにも書き込まれていることが実質的に保証されているからである。具体的には、図９のＳ１５４〜Ｓ１５７によれば、内部ＶＯＬに書き込まれたデータは、その内部ＶＯＬに対応した外部ＶＯＬに書き込まれ、その後で、ライトコマンドに対する応答（ステータス）がアクセス元（アプリケーションＶＭ３２０）に送信されるからである。
【０１５１】
実施例２によれば、内部ＶＯＬには、その内部ＶＯＬの記憶容量より大きな記憶容量の外部ＶＯＬを対応付けることができるため、内部ＶＯＬに対応した物理記憶領域の範囲より広い範囲のリードについて、性能低下を防ぐことが期待できる。
【実施例３】
【０１５２】
次に、図１９から図２３を用いて、実施例３を説明する。図１９から図２３以外は、実施例２と同様なので、説明を省略する。なお、実施例３は、実施例１及び２のうちの少なくとも１つの特徴を含まなくても良い。
【０１５３】
実施例２（及び実施例１）では、内部ＶＯＬは、ＦＭ２１０の物理ブロックの記憶容量と同じ記憶容量の記憶領域単位（例えば論理ブロック単位）で管理される。しかし、実施例３では、内部ＶＯＬは、より小さい記憶領域の単位で内部ＶＯＬが管理される。
【０１５４】
図１９は、実施例３に係るＳＳＤキャッシュ情報２５０を示す。
【０１５５】
この図によれば、実施例２（図２）と異なり、マップテーブル２６０を構成する各エントリが、ステージングビットマップ２６５を含む。ステージングビットマップ２６５は、ＦＭ２１０上の物理ブロックのどの範囲に有効なデータが置かれているかを示すビットマップである。つまり、ビットマップ２６５を構成する各ビットは、物理ブロックを構成する記憶領域に対応しており、その記憶領域に有効なデータがあるか否かを表す。
【０１５６】
なお、物理ブロックのどの範囲に有効なデータが置かれているかを示す情報は、ビットマップ形式以外の形式（例えばテーブル）であっても良い。
【０１５７】
また、ビットに対応する記憶領域の容量は、ホスト１００内で１つのアクセスコマンドに従って書き込み又は読み出しされるデータの最小サイズと同じであって良い。例えば、物理ブロックは２５６ＫＢ（キロバイト）であって、ビットに対応する記憶領域の容量（ホスト１００内での１アクセスに従うデータの最小サイズ）は、５１２Ｂ（バイト）又は４ＫＢであって良い。
【０１５８】
図２０は、実施例３に係るＳＳＤキャッシュ情報３５０を示す。
【０１５９】
この図によれば、実施例２（図３）と異なり、マップテーブル３６０の各エントリが、ステージングビットマップ３６５を含む。このビットマップ３６５は、前述のビットマップ２６５と同じである。マップテーブル３６０はマップテーブル２６０のコピーであるからである。
【０１６０】
図２１は、実施例３に係るキャッシュＳＳＤ２００でのリード処理を示すフローチャートである。
【０１６１】
このリード処理は、実施例２（図５）と異なり、Ｓ１１１：Ｙの後に、Ｓ１２３を含む。
【０１６２】
Ｓ１２３で、アクセス処理プログラム２４１は、アクセス元からのリードコマンドに従うリード対象データがアクセス先内部ＶＯＬに存在するか否かを判断する。具体的には、プログラム２４１は、下記の処理を行う。プログラム２４１は、アクセス先アドレスに対応したエントリ（マップテーブル２６０のエントリ）が有するステージングビットマップ２６５を参照する。そして、プログラム２４１は、アクセス先アドレスが表すアクセス範囲に対応する全ての記憶領域（ＦＭ２１０内の記憶領域）に対応した全てのビットがＯＮであるか否かを判断する。
【０１６３】
Ｓ１２３の判断の結果が肯定的である場合（Ｓ１２３：Ｙ）、Ｓ１１２で、アクセス先内部ＶＯＬからリード対象のデータが読み出される。
【０１６４】
Ｓ１２３の判断の結果が否定的である場合（Ｓ１２３：Ｎ）、つまり、少なくとも１つのビットがＯＦＦの場合、Ｓ１１６以降の処理が行われる。すなわち、リード対象データのうち、アクセス先内部ＶＯＬに無いデータ（ＯＦＦのビットに対応したデータ）が外部ＶＯＬから読み出されて、そのデータが、アクセス先内部ＶＯＬに書き込まれる。これにより、アクセス先内部ＶＯＬで、リード対象データが存在する（完成する）こととなる。
【０１６５】
図２２は、実施例３に係るＳＳＤ書込みを示すフローチャートである。
【０１６６】
この図によれば、実施例２（図８）と異なり、プログラム２４１は、外部ＶＯＬから読み出されたデータを物理ブロックに書き込んだ後に（Ｓ１４５）、その物理ブロックにおいてデータが書き込まれた範囲を構成する各記憶領域に対応したビット（その物理ブロックに対応したステージングビットマップ３６５におけるビット）をＯＮにする（Ｓ１４６）。
【０１６７】
図２３は、実施例３に係るキャッシュＳＳＤ２００でのライト処理を示すフローチャートである。
【０１６８】
この図によれば、実施例２（図９）と異なり、プログラム２４１は、新エントリの割り当てとなった場合（Ｓ１６０：Ｙ）、外部ＶＯＬからの読み出し（図９のＳ１６１及びＳ１６２）を行わない。本実施例では、物理ブロック全体にデータを置く必要がない、言い換えれば、物理ブロックよりも小さい記憶領域の単位で、データの入出力ができるためである。
【０１６９】
実施例３によれば、内部ＶＯＬ内でのデータの有無を、ブロックよりも小さい記憶領域単位で管理することができる。このため、容量効率を向上することが可能になる。また、ライト処理では、図９に示したＳ１６１及びＳ１６２が不要になるので、ライト処理の性能が向上するケースがある。
【実施例４】
【０１７０】
次に、図２４から図３２を用いて、実施例４を説明する。図２４から図３２以外は、実施例３と同様なので、説明を省略する。なお、実施例４は、実施例１〜３のうちの少なくとも１つの特徴を含まなくても良い。
【０１７１】
実施例４では、外部ＶＯＬへの書込みは、内部ＶＯＬへの書込みと非同期に行われる。具体的には、実施例４では、アクセス元（アプリケーションＶＭ３２０）からのライトコマンドに従うライト対象データがアクセス先内部ＶＯＬに書き込まれたときに、アクセス元に応答が返され、その後で、アクセス先内部ＶＯＬ内のライト対象データが、アクセス先内部ＶＯＬに対応する外部ＶＯＬに書き込まれる。これにより、キャッシュＳＳＤ２００でのライト処理において、アクセス元がライトコマンドを送信してからそのライトコマンドに対する応答を受けるまでの時間長を、実施例３でのライト処理に比べて短くすることができる。
【０１７２】
図２４は、実施例４に係るＳＳＤキャッシュ情報２５０を示す。
【０１７３】
この図によれば、実施例３（図１９）と異なり、マップテーブル２６０の各エントリが、ｇｏｏｄＥＶフラグ２６６を有する。ｇｏｏｄＥＶフラグ２６６は、そのフラグ２６６に対応する記憶領域内のデータが外部ＶＯＬに書込み済みか否かを表す。フラグ２６６は、内部ＶＯＬにデータが書き込まれた時点ではＯＦＦである。フラグ２６６は、そのデータを外部ＶＯＬに書き込むことのライト要求が送信されそのライト要求に対して正常を意味する応答（ステータス）が戻って来たときに、ＯＮにされる。
【０１７４】
なお、実施例４では、各エントリに、ビットマップ２６５が無くてもよい。すなわち、実施例４では、ブロックよりも小さな記憶領域単位で内部ＶＯＬが管理されることに代えて、実施例１及び２のように、ブロック単位で内部ＶＯＬが管理されても良い。
【０１７５】
図２５は、実施例４に係るＳＳＤキャッシュ情報３５０を示す。
【０１７６】
この図によれば、実施例３（図２５）と異なり、マップテーブル３６０の各エントリが、図２４におけるテーブル２６０と同様、ｇｏｏｄＥＶフラグ３６６を有する。
【０１７７】
図２６は、実施例４に係るヒットミス判定処理を示すフローチャートである。
【０１７８】
この図によれば、図１８のＳ１２９ｂ（又は、図６のＳ１２９ａ）に代えて、Ｓ１２９ｃが行われる。Ｓ１２９ｃで、プログラム２４１は、アクセス先アドレス（例えばＬＢＡ）が正常かどうかの判定と、空きエントリ、又は、ｇｏｏｄＥＶフラグ２６６がＯＮになっている使用済みエントリがあるかどうかの判定を行う。
【０１７９】
ｇｏｏｄＥＶフラグ２６６がＯＦＦになっている使用済みエントリに対応した物理ブロック内のデータ（アクセス元から書き込まれたデータ）は、未だ外部ＶＯＬに書き込まれない。このため、その物理ブロック内のデータは消されてはならない。つまり、Ｓ１３０ｂが行われてはならない。それ故、この場合、Ｓ１２９ｃの結果は否定的となる。
【０１８０】
図２７は、実施例４に係るキャッシュＳＳＤ２００でのリード処理を示すフローチャートである。
【０１８１】
この図によれば、実施例３（図２１）と異なり、リード処理では、Ｓ１１５：Ｎの後に、Ｓ１２１とＳ１２２が行われる。
【０１８２】
すなわち、Ｓ１１５：Ｎの原因は、アクセス先アドレスが不正であることに代えて又は加えて、アクセス先アドレスに対応した論理ブロックに割り当て可能な物理ブロックが無い（空きエントリ、及び、ｇｏｏｄＥＶフラグ２６６がＯＮの使用済エントリが無い）ことがあり得る。そのため、プログラム２４１は、Ｓ１２１で、割当て可能な物理ブロックがあるかどうか判定する。割当て可能な物理ブロックが無い場合（Ｓ１２１：Ｎ）、プログラム２４１は、このリード処理（ジョブ）に対応した終了ステータス２９１として、空きブロック無しを意味する情報をセットする（Ｓ１２２）。そして、プログラム２４１は、異常を表すステータスを、アクセス元に送信する（Ｓ１１４）。
【０１８３】
図２８は、実施例４に係るキャッシュＳＳＤ２００でのライト処理を示すフローチャートである。
【０１８４】
この図によれば、実施例４に係るライト処理は、実施例３（図２３）に係るライト処理に比べて、下記の相違点がある。
【０１８５】
すなわち、Ｓ１６０：Ｎの後に、Ｓ１６４とＳ１６５が行われる。その理由は、図２７に示したリード処理において、Ｓ１１５：Ｎの後にＳ１２１とＳ１２２が行われる理由と同じである。
【０１８６】
Ｓ１５２の後に、Ｓ１５３ａが行われる。Ｓ１５３ａで、プログラム２４１は、Ｓ１５０で検出したエントリ内のｇｏｏｄＥＶフラグ２６６をＯＦＦにする。これにより、そのエントリは、このエントリに対応するブロック内のデータが外部ＶＯＬに未だ書き込まれていないことを表す。
【０１８７】
図２３のＳ１５５及びＳ１６３が行われない。
【０１８８】
Ｓ１５４（外部ライト依頼処理）が、Ｓ１５６の前ではなくＳ１５７の後に行われる。すなわち、アクセス元（アプリケーションＶＭ３２０）にライトコマンドに対する終了ステータスが返された後に、そのライトコマンドに従うデータの、内部ＶＯＬから外部ＶＯＬへの書き込みが行われる。つまり、外部ＶＯＬへのデータの書き込みは、内部ＶＯＬへのそのデータの書き込みとは非同期で行われる。
【０１８９】
図２９は、実施例４に係る外部ライト依頼処理を示すフローチャートである。
【０１９０】
この図によれば、実施例３（図２９）と異なり、Ｓ１７８：Ｙの後に、Ｓ１８５が行われる。Ｓ１８５において、プログラム２４１は、図２８のＳ１５３ａでＯＦＦにしたｇｏｏｄＥＶフラグ２６６をＯＮにする。Ｓ１８５は、プログラム２４１がストレージ制御ＶＭ３３０から正常を表す応答を受信した場合（つまり、内部ＶＯＬ内のデータが外部ＶＯＬに書き込まれた場合）に行われる。
【０１９１】
図３０は、実施例４に係るホスト１００での起動処理を示すラダーチャートである。
【０１９２】
この図によれば、実施例３（図１５）と異なり、Ｓ５０７とＳ５１６との間で、内部ＶＯＬにあるが外部ＶＯＬに無いデータが、外部ＶＯＬに書きこまれる。具体的には、Ｓ５１１、Ｓ５１２、Ｓ５１３ｃ、Ｓ５１４及びＳ５１５が行われる。
【０１９３】
Ｓ５１１で、ストレージ制御ＶＭ３３０内のプログラム３３２が、マップテーブル２６０をキャッシュＳＳＤ２００に要求する。
【０１９４】
Ｓ５１２で、キャッシュＳＳＤ２００内のプログラム２４２が、マップテーブル２６０をストレージ制御ＶＭ３３０に返す。ＶＭ３３０内のプログラム３３２が、返されたテーブル２６０のコピー（マップテーブル３６０）を生成する。
【０１９５】
Ｓ５１３ｃで、プログラム３３２は、ｇｏｏｄＥＶフラグ３６６がＯＦＦになっているエントリ（テーブル３６０内のエントリ）に対応したブロック内のデータを、キャッシュＳＳＤ２００に要求する。ここでは、例えば、タグ３６１が指定される。
【０１９６】
Ｓ５１４で、キャッシュＳＳＤ２００内のプログラム２４１が、要求されたデータをＶＭ３３０に返す。具体的には、例えば、プログラム２４１は、要求で指定されたタグをキーに特定されるブロック（特に、例えば、ビットマップ２６５におけるＯＮビットに対応した領域）からデータを取得し、取得したデータを返す。
【０１９７】
Ｓ５１５で、プログラム２４１は、キャッシュＳＳＤ２００からのデータを、Ｓ５１３ｃで参照したマップテーブル３６０を含んだＳＳＤキャッシュ情報３５０内の外部ＶＯＬ識別子３５５が示す外部ＶＯＬに書き込む。
【０１９８】
なお、Ｓ５１１〜Ｓ５１５は、転送効率を向上するために複数回に分割して行われてもよい。
【０１９９】
Ｓ５１１〜Ｓ５１５により、ストレージ制御ＶＭ３３０の障害等が原因で外部ＶＯＬへの書き込まれなかったデータ（内部ＶＯＬ内のデータ）を、ストレージ制御ＶＭ３３０の再起動を契機に、外部ＶＯＬへ書き込むことができる。
【０２００】
なお、Ｓ５１１〜Ｓ５１５は、起動のときに代えて又は加えて、ストレージ制御ＶＭ３３０が動作している期間における任意の時点で行われても良い。
【０２０１】
図３１は、実施例４に係る起動／終了制御プログラム３３２が行う処理を示すフローチャートである。
【０２０２】
この図によれば、実施例３（図１７）と異なり、前述したＳ５１１〜Ｓ５１５が行われる。ただし、Ｓ５１１〜Ｓ５１５については、既に説明した通りなので、説明を省略する。
【０２０３】
実施例４によれば、外部ＶＯＬへの書込みは、内部ＶＯＬへの書込みと非同期に行われる。これにより、キャッシュＳＳＤ２００でのライト処理において、アクセス元がライトコマンドを送信してからそのライトコマンドに対する応答を受けるまでの時間長を、実施例３でのライト処理に比べて短くすることができる。
【実施例５】
【０２０４】
次に、図３２から図３５を用いて、実施例５を説明する。図３２から図３５以外は、実施例４と同様なので、説明を省略する。なお、実施例５は、実施例１〜４のうちの少なくとも１つの特徴を含まなくても良い。
【０２０５】
実施例５では、逆内部コピーは、差分コピーのみが行われる。具体的には、図３２に示すように、実施例５に係る逆内部コピーでは、セカンダリの差分ブロック（セカンダリ内部ＶＯＬ内の差分ブロック）１１Ｓからその差分ブロックに対応するプライマリの差分ブロック（プライマリ内部ＶＯＬ内の差分ブロック）１１Ｐへのデータのコピーのみが行われ、セカンダリの非差分ブロック１２Ｓからその非差分ブロックに対応するプライマリの非差分ブロック１２Ｐへのデータのコピーは行われない。「差分ブロック」とは、内部コピー（プライマリのブロックからセカンダリのブロックへのデータのコピー）が済んでいないブロック（すなわち、プライマリとセカンダリ間で不一致のデータが格納されているブロック）である。「非差分ブロック」とは、内部コピーが済んだブロック（すなわち、プライマリとセカンダリ間で一致しているデータが格納されているブロック）である。
【０２０６】
図３３は、実施例５に係るＳＳＤキャッシュ情報２５０を示す。
【０２０７】
この図によれば、実施例４（図２４）と異なり、マップテーブル２６０の各エントリが、仮解放フラグ２６４を有する。仮解放フラグ２６４は、そのフラグ２６４を有するエントリが解放されているか否かを表す。フラグ２６４がＯＮであれば、エントリが解放されているということであり、フラグ２６４がＯＦＦであれば、エントリが解放されていないということである。
【０２０８】
実施例５では、逆内部コピーの際、プライマリ内部ＶＯＬ（逆内部コピーでのコピー先の内部ＶＯＬ）に対応したマップテーブル２６０を初期化することに代えて、ＶＭ３３０内のプログラム３３３が、プライマリ内部ＶＯＬに割り当て済みの全てのブロックに対応したエントリ内の仮解放フラグ２６４（プライマリ内部ＶＯＬに対応したマップテーブル２６０のうちの全ての使用済エントリ内のフラグ２６４）をＯＮにする。
【０２０９】
その後、ＶＭ３３０内のプログラム３３３は、逆内部コピーにおいて、セカンダリの差分ブロックからプライマリの差分ブロックへのデータのコピーが終わる都度に、そのプライマリの差分ブロックに対応したエントリ内の仮解放フラグ２６４をＯＦＦにする。つまり、差分ブロック間のリストアが済む都度に、プライマリの差分ブロックに対応した物理ブロックは、解放されている状態から非解放の状態とされる。さらに、逆内部コピーが終了したとき、プライマリ内部ＶＯＬに割り当て済みの全てのブロックに対応したエントリ内の仮解放フラグ２６４をＯＦＦにする。したがって、プライマリ内部ＶＯＬに割り当て済みの全ての物理ブロックのうち、アプリケーションＶＭ３２０がアクセスしなかった非差分ブロックについては、逆内部コピー中に（仮解放のまま）解放されない。
【０２１０】
図３４は、実施例５に係るＳＳＤキャッシュ情報３５０を示す。
【０２１１】
この図によれば、実施例４（図２５）と異なり、マップテーブル３６０の各エントリが、仮解放フラグ３６４を有する。テーブル３６０は、前述した通り、マップテーブル２６０のコピーである。
【０２１２】
図３５は、実施例５に係るヒットミス判定処理を示すフローチャートである。
【０２１３】
実施例５では、逆内部コピーの最中であっても、キャッシュＳＳＤ２００が、アプリケーションＶＭ３２０からアクセスコマンドを受け付ける。従って、実施例５に係るヒットミス判定処理は、下記のようになっている。
【０２１４】
すなわち、この図によれば、実施例４（図１８）と異なり、Ｓ１２６：Ｙの後に、Ｓ１２７が行われる。Ｓ１２７では、プログラム２４１が、Ｓ１２５で検出されたエントリ内の仮解放フラグ２６４がＯＮか否かを判断する。
【０２１５】
仮解放フラグ２６４がＯＦＦの場合（Ｓ１２７：Ｎ）、プログラム２４１は、Ｓ１２８を行う。そのフラグ２６４に対応した物理ブロックは非解放状態であるためである。
【０２１６】
仮解放フラグ２６４がＯＮの場合（Ｓ１２７：Ｙ）、プログラム２４１は、そのフラグ２６４を有するエントリについて、Ｓ１３１を行う。そのフラグ２６４に対応した物理ブロックは解放状態であるためである。
【０２１７】
以上の説明によれば、プログラム２４１は、例えば下記を行う。
＊プログラム２４１は、アプリケーションＶＭ３２０からリードコマンドを受け、アクセス先アドレスに対応したブロックについての仮解放フラグ２６４がＯＮである場合、リード依頼をストレージ制御ＶＭ３３０に送信する。つまり、この場合、外部ＶＯＬからデータが読み出される。
＊プログラム２４１は、アプリケーションＶＭ３２０からリードコマンドを受け、アクセス先アドレスに対応したブロックについての仮解放フラグ２６４がＯＦＦである場合、リード依頼をストレージ制御ＶＭ３３０に送信せず、そのブロックからデータを読み出す。なぜなら、仮解放フラグ２６４がＯＦＦになっていれば、そのブロック内にリード対象のデータが保証されているからである。
＊プログラム２４１は、アプリケーションＶＭ３２０からライトコマンドを受け、アクセス先アドレスに対応したブロックについての仮解放フラグ２６４がＯＮである場合、そのブロックのデータを一旦破棄してそのフラグ２６４をＯＦＦにし、且つ、ライト対象のデータを、そのブロックに書き込む。また、ライト対象のデータは、外部ＶＯＬにも書き込まれる。
＊プログラム２４１は、アプリケーションＶＭ３２０からライトコマンドを受け、アクセス先アドレスに対応したブロックについての仮解放フラグ２６４がＯＦＦである場合、ライト対象のデータを、そのブロックに書き込む。また、そのデータは、外部ＶＯＬにも書き込まれる。
【０２１８】
なお、プログラム３３３（又はプログラム２４１）は、プライマリ内部ＶＯＬ内のどのブロックが差分ブロックであるかを管理している。具体的には、例えば、プログラム３３３（又はプログラム２４１）は、プライマリ内部ＶＯＬの第１のブロックにデータを書き込んだ場合に、その第１のブロックを差分ブロックとして管理する。また、例えば、プログラム３３３（又はプログラム２４１）は、そのデータを、第１のブロックに対応する、セカンダリ内部ＶＯＬ内の第２のブロックにコピーした場合、第１のブロックを非差分ブロックとして管理する。プログラム３３３（又はプログラム２４１）は、差分ブロックとして管理されている第１のブロックに対してアプリケーションＶＭ３２０からの書き込みがあった場合には、第１のブロックに対応した仮解放フラグ２６４をＯＦＦにし、且つ、第１のブロックを非差分ブロックとして管理する。これにより、書き込みがあった第１のブロックに逆内部コピーによってデータが上書きされることを防ぐことができる。
【０２１９】
実施例５によれば、非差分ブロックに対応した物理ブロックの解放を回避し、差分ブロックについてのみプライマリ内部ＶＯＬへのデータ転送が行われるので、逆内部コピーに伴う性能低下を軽減することができる。
【実施例６】
【０２２０】
次に、図３６から図４２を用いて、実施例６を説明する。図３６から図４２以外は、実施例５と同様なので、説明を省略する。なお、実施例６は、実施例１〜５のうちの少なくとも１つの特徴を含まなくても良い。
【０２２１】
実施例６では、ストレージ制御ＶＭ３３０の誤った終了による障害を回避することができる。例えば、キャッシュＳＳＤ２００に基づく内部ＶＯＬがアプリケーションＶＭ３２０に認識されている間にストレージ制御ＶＭ３３０が手動で終了されることを回避することができる。
【０２２２】
図３６は、実施例６に係る計算機システムの全体構成を示す。
【０２２３】
この図によれば、実施例５（図１）と異なり、ＶＭ制御モジュール３１０が、マウントテーブル３１２を管理する。マウントテーブル３１２は、アプリケーションＶＭ３２０の識別子と、そのアプリケーションＶＭ３２０がマウントしている内部ＶＯＬの識別子との対応関係を表す。
【０２２４】
図３７は、実施例６に係るＳＳＤキャッシュ情報３５０を示す。
【０２２５】
この図によれば、実施例５（図２５）と異なり、情報３５０が、マウントカウンタ３９４を有する。マウントカウンタ３９４は、この情報３５０が対応する内部ＶＯＬを認識しているアプリケーションＶＭ３２０の数を表す。
【０２２６】
図３８は、実施例６に係るホスト１００での起動処理を示すラダーチャートである。
【０２２７】
この図によれば、実施例５（図３０）と異なり、Ｓ５２５の後に、Ｓ５２６〜Ｓ５２９が行われる。
【０２２８】
Ｓ５２６で、アプリケーションＶＭ３２０が、そのＶＭ３２０の識別子（アプリケーションＶＭ識別子）とマウントした内部ＶＯＬの識別子とを含むマウント通知をＶＭ制御モジュール３１０に送信する（Ｓ５２６）。
【０２２９】
Ｓ５２７で、ＶＭ制御モジュール３１０が、マウント通知を受信し、そのマウント通知が有するアプリケーションＶＭ識別子と内部ＶＯＬ識別子とをマウントテーブル３１２に追記する。
【０２３０】
Ｓ５２８で、ＶＭ制御モジュール３１０が、マウントされた内部ＶＯＬの識別子（上記マウント通知が有する内部ＶＯＬ識別子）を含んだ通知を、ストレージ制御ＶＭ３３０に送信する。
【０２３１】
Ｓ５２９で、ストレージ制御ＶＭ３３０内のプログラム３３２が、Ｓ５２８で送信された通知を受信する。プログラム３３２は、その通知が有する内部ＶＯＬ識別子と一致する識別子３５１を有するＳＳＤキャッシュ情報３５０を特定する。プログラム３３２は、特定されたＳＳＤキャッシュ情報３５０内のマウントカウンタ３９４を更新する（例えば１インクリメントする）。
【０２３２】
図３９は、実施例６に係るホスト１００での終了処理を示すラダーチャートである。
【０２３３】
この図によれば、実施例５（図１６）と異なり、Ｓ５３３の後に、Ｓ５３４、Ｓ５３６、Ｓ５３７及びＳ５３８が行われる。また、Ｓ５４０の後に、Ｓ５４４が行われる。
【０２３４】
Ｓ５３４で、アプリケーションＶＭ３２０が、アンマウントした全ての内部ＶＯＬの識別子を含んだアンマウント通知をＶＭ制御モジュール３１０に送信する。
【０２３５】
Ｓ５３６で、ＶＭ制御モジュール３１０が、アンマウント通知を受信し、その通知が有する全ての内部ＶＯＬ識別子と一致する識別子を含んだエントリを、マウントテーブル３１２から削除する。
【０２３６】
Ｓ５３７で、ＶＭ制御モジュール３１０が、アンマウントした内部ＶＯＬの識別子を含んだ通知をストレージ制御ＶＭ３３０に送信する。
【０２３７】
Ｓ５３８で、ストレージ制御ＶＭ３３０内のプログラム３３２が、Ｓ５３７で送信された通知を受信する。プログラム３３２は、その通知が有する内部ＶＯＬ識別子と一致する識別子３５１を有するＳＳＤキャッシュ情報３５０を特定する。プログラム３３２は、特定されたＳＳＤキャッシュ情報３５０内のマウントカウンタ３９４を更新する（例えば１デクリメントする）。
【０２３８】
Ｓ５４４で、ストレージ制御ＶＭ３３０内のプログラム３３２が、全てのＳＳＤキャッシュ情報３５０内のマウントカウンタ３９４が０を表しているか否かを判断する。図３９は、全てのＳＳＤキャッシュ情報３５０内のマウントカウンタ３９４が０を表している場合の流れを示すので、Ｓ５４４の判断の結果は肯定的となる。それ故、Ｓ５４９に示すように、ストレージ制御ＶＭ３３０が終了する。
【０２３９】
図４０は、アプリケーションＶＭ３２０からアンマウント通知がない場合に行われる異常終了処理を示すラダーチャートである。
【０２４０】
ＶＭ制御モジュール３１０が、管理者などからストレージ制御ＶＭ３３０の終了要求を受け付けた場合（Ｓ５６５）、ストレージ制御ＶＭ３３０に終了要求を発行する（Ｓ５６６）。
【０２４１】
ストレージ制御ＶＭ３３０内のプログラム３３２が、全てのＳＳＤキャッシュ情報３５０のマウントカウンタ３９４が０か否かを判断する（Ｓ５４４）。図４０は、少なくとも１つのマウントカウンタ３９４が０ではない値を示しているので、Ｓ５４４の判断の結果は否定的となる。それ故、図３９のＳ５４９が行われない。つまり、ストレージ制御ＶＭ３３０が終了しない（ストレージ制御ＶＭ３３０の終了が失敗する）。
【０２４２】
図４１は、アプリケーションＶＭ３２０が異常終了したホスト１００での終了処理を示すラダーチャートである。
【０２４３】
アプリケーションＶＭ３２０が何らかの異常で終了した場合（Ｓ５５５）、ＶＭ制御モジュール３１０が、アプリケーションＶＭ３２０の終了を検出する（Ｓ５５６）。そして、モジュール３１０は、マウントテーブル３１２を基に、終了したアプリケーションＶＭ３２０の識別子を含んだエントリを特定する（Ｓ５５７）。モジュール３１０は、特定したエントリ内の内部ＶＯＬ識別子を含んだアンマウント通知をストレージ制御ＶＭ３３０に送信する（Ｓ５５８）。
【０２４４】
ストレージ制御ＶＭ３３０内のプログラム３３２が、アンマウント通知を受信し、そのアンマウント通知が有する内部ＶＯＬ識別子と一致する識別子３５１を含んだＳＳＤキャッシュ情報３５０内のマウントカウンタ３９４を更新する（例えば１デクリメントする）。
【０２４５】
その後、ＶＭ制御モジュール３１０が、システム終了の要求を受けた場合（Ｓ５６０）、ストレージ制御ＶＭ３３０に終了要求を発行する（Ｓ５６１）。その後は、図３９のＳ５４４以降と同様の処理により、システムが終了する。
【０２４６】
図４２は、実施例６に係る起動／終了制御プログラム３３２が行う処理を示すフローチャートである。
【０２４７】
この図によれば、実施例５（図３２）と異なり、Ｓ６０２、Ｓ５２９、Ｓ６０３、Ｓ５３８及びＳ５４４が行われる。Ｓ６０２及びＳ６０３は、要求の解析処理である。Ｓ５２９、Ｓ５３８及びＳ５４４の処理は、図３９と同様なので、説明を省略する。
【０２４８】
Ｓ５４４の判断によれば、内部ＶＯＬ（間接的には外部ＶＯＬ）をマウントしているアプリケーションＶＭ３２０がいなくなるまで、ストレージ制御ＶＭ３３０が終了しないことになる。このため、誤ってストレージ制御ＶＭ３３０が終了することによる障害を回避することができる。
【実施例７】
【０２４９】
次に、図４３を用いて、実施例７を説明する。図４３以外は、実施例６と同様なので、説明を省略する。なお、実施例７は、実施例１〜６のうちの少なくとも１つの特徴を含まなくても良い。
【０２５０】
図４３は、実施例７に係る通信方法（キャッシュＳＳＤ２００とストレージ制御ＶＭ３３０との間の通信方法）の説明図である。
【０２５１】
キャッシュＳＳＤ２００とストレージ制御ＶＭ３３０との間の通信は、ＳＣＳＩ（Small Computer System Interface）プロトコルに従って行われても良いが、本実施例では、図４３に示すように、キャッシュＳＳＤ２００内のメモリ２３０が、ストレージ制御ＶＭ３３０が参照可能な領域（以下、通信領域）２３００を有し、その通信領域２３００を介して、通信が行われる。
【０２５２】
通信領域２３００は、入出力キュー２３０１とバッファ２３０２とを有する。
【０２５３】
バッファ２３０２は、ストレージ制御ＶＭ３３０との間でやり取りされる情報を記憶する。その情報としては、例えば、ストレージ制御ＶＭ３３０へのアクセス依頼（例えば、リード依頼またはライト依頼）と、そのアクセス依頼に従うデータ（ライト対象及びリード対象のデータ）とがある。
【０２５４】
入出力キュー２３０１は、バッファ２３０２へのポインタを有し、ストレージ制御ＶＭ３３０が依頼に対する応答（正常または異常）を書き込むためのキューである。この例では、入出力キュー２３０１は、１本のキューであるが、入力と出力を別にするなど、複数本のキューで構成されていても良い。
【０２５５】
入出力キュー２３０１は、ＬＵＮ２３０１ａ、依頼種別２３０１ｂ、ＬＢＡ２３０１ｃ、転送長２３０１ｄ、バッファ外部アドレス２３０１ｅ、応答内容２３０１ｆ、バッファ内部アドレス２３０１ｇ及びＪＯＢ番号２３０１ｈを含む。
【０２５６】
ＬＵＮ２３０１ａは、依頼元であるキャッシュＳＳＤ２００の内部ＶＯＬの識別子（ＬＵＮ）を示す。
【０２５７】
依頼種別２３０１ｂは、依頼が外部ＶＯＬに対するリードかライトかを示す。
【０２５８】
ＬＢＡ２３０１ｃは、アクセス先アドレスであり、転送長２３０１ｄは、アクセスされるデータのサイズである。従って、これらの情報２３０１ｃ及び２３０１ｄにより、内部ＶＯＬにおけるアクセス範囲が表されている。
【０２５９】
バッファ外部アドレス２３０１ｅ及びバッファ内部アドレス２３０１ｇは、両方とも、バッファ２３０２を指すポインタである。バッファ外部アドレス２３０１ｅは、ストレージ制御ＶＭ３３０からみたアドレス（ＶＭ３３０が指定し得る、バッファ２３０２のアドレス）を示し、バッファ内部アドレス２３０１ｇは、キャッシュＳＳＤ２００からみたアドレス（キャッシュＳＳＤ２００が指定し得る、バッファ２３０２のアドレス）を示す。
【０２６０】
応答内容２３０１ｆは、依頼に対する応答の内容を示す。
【０２６１】
ＪＯＢ番号２３０１ｈは、依頼が発行された処理に対応するジョブの識別子である。
【０２６２】
図７のＳ１３５、又は、図１０のＳ１７５において、ＳＳＤ２００内のプログラム２４１が、バッファ２３０２を確保し、情報２３０１ａ〜２３０１ｈのうち応答内容２３０１ｆ以外を書き込み、割り込みをストレージ制御ＶＭ３３０に通知する。
【０２６３】
図１１のＳ３０４で、ＶＭ３３０内のプログラム３３３が、情報２３０１ａ〜２３０１ｄを基に、ＳＳＤ２００からの依頼の解析を行う。
【０２６４】
図１２のＳ３１３で、ＶＭ３３０内のプログラム３３３が、外部ＶＯＬから読み出したデータを、バッファ外部アドレス２３０１ｅが示す領域（バッファ２３０２内の領域）に書き込む。
【０２６５】
図１２のＳ３２１又は図１３のＳ３５１において、ＶＭ３３０内のプログラム３３３が、応答内容２３０１ｆとして、正常又は異常を表す情報を書き込む。
【０２６６】
図１３のＳ３４０で、ＶＭ３３０内のプログラム３３３が、バッファ外部アドレス２３０１ｅが示す領域（バッファ２３０２内の領域）から、外部ＶＯＬに書き込むデータを読み出す。
【０２６７】
図７のＳ１３７又は図１０のＳ１７７で、ＳＳＤ２００内のプログラム２４１は、応答内容２３０１ｆを参照する。
【０２６８】
図７のＳ１３９において、ＳＳＤ２００内のプログラム２４１は、バッファ内部アドレス２３０１ｇが示す領域（バッファ２３０２内の領域）からデータを読み出し、そのデータを、対応する物理ブロック（ＦＭ２１０内の物理ブロック）に書き込む。
【０２６９】
実施例７によれば、ＳＣＳＩプロトコルを使用する場合に比べて、ＳＳＤ２００内のＣＰＵ２１５の処理を単純化することができ、以って、キャッシュＳＳＤ２００の性能改善や低コスト化を図ることができる。
【０２７０】
以上、本発明の幾つかの実施例を説明したが、本発明は、これらの実施例に限定されるものでなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。
【符号の説明】
【０２７１】
１００…ホスト装置
【図１】
0005523561.tif 000002
【図２】
0005523561.tif 000003
【図３】
0005523561.tif 000004
【図４】
0005523561.tif 000005
【図５】
0005523561.tif 000006
【図６】
0005523561.tif 000007
【図７】
0005523561.tif 000008
【図８】
0005523561.tif 000009
【図９】
0005523561.tif 000010
【図１０】
0005523561.tif 000011
【図１１】
0005523561.tif 000012
【図１２】
0005523561.tif 000013
【図１３】
0005523561.tif 000014
【図１４】
0005523561.tif 000015
【図１５】
0005523561.tif 000016
【図１６】
0005523561.tif 000017
【図１７】
0005523561.tif 000018
【図１８】
0005523561.tif 000019
【図１９】
0005523561.tif 000020
【図２０】
0005523561.tif 000021
【図２１】
0005523561.tif 000022
【図２２】
0005523561.tif 000023
【図２３】
0005523561.tif 000024
【図２４】
0005523561.tif 000025
【図２５】
0005523561.tif 000026
【図２６】
0005523561.tif 000027
【図２７】
0005523561.tif 000028
【図２８】
0005523561.tif 000029
【図２９】
0005523561.tif 000030
【図３０】
0005523561.tif 000031
【図３１】
0005523561.tif 000032
【図３２】
0005523561.tif 000033
【図３３】
0005523561.tif 000034
【図３４】
0005523561.tif 000035
【図３５】
0005523561.tif 000036
【図３６】
0005523561.tif 000037
【図３７】
0005523561.tif 000038
【図３８】
0005523561.tif 000039
【図３９】
0005523561.tif 000040
【図４０】
0005523561.tif 000041
【図４１】
0005523561.tif 000042
【図４２】
0005523561.tif 000043
【図４３】
0005523561.tif 000044