(57)【特許請求の範囲】
【請求項１】
上位装置からＩ／Ｏ要求を受信し処理するストレージシステムであって、
前記上位装置からＩ／Ｏ要求を受け付ける第一及び第二のモジュールを備え、
前記第一のモジュールが、
前記上位装置に接続される第一のポートと、
複数の第一の仮想領域で構成され前記第一のポートに関連付けられる第一の仮想ボリュームと、
各第一の仮想領域に関する情報である第一の仮想領域管理情報を記憶する第一のメモリ領域と、
第一の物理記憶装置と、
前記第一の物理記憶装置に基づく複数の第一の実領域で構成された第一のプールと、
前記上位装置から前記第一のポートを介して受け付けたＩ／Ｏ要求を処理する第一のＩ／Ｏ処理部と、
前記第二のモジュールに接続される第一のモジュールインタフェース装置と
を備え、
前記第一の仮想領域管理情報は、前記第一の仮想領域毎に、割り当てられている実領域を有するモジュールである割当モジュールの識別子を含み、
前記第二のモジュールが、
前記上位装置に接続される第二のポートと、
複数の第二の仮想領域で構成され前記第二のポートに関連付けられており、且つ、前記第一の仮想ボリュームに関連付けられているボリューム識別子と同一のボリューム識別子が関連付けられている第二の仮想ボリュームと、
各第二の仮想領域に関する情報である第二の仮想領域管理情報を記憶する第二のメモリ領域と、
第二の物理記憶装置と、
前記第二の物理記憶装置に基づく複数の第二の実領域で構成された第二のプールと、
前記上位装置から前記第二のポートを介して受け付けたＩ／Ｏ要求を処理する第二のＩ／Ｏ処理部と、
前記第一のモジュールに接続される第二のモジュールインタフェース装置と
を備え、
前記第二の仮想領域管理情報は、前記第二の仮想領域毎に、割り当てられている実領域を有するモジュールである割当モジュールの識別子を含み、
（Ａ）前記第二のモジュールが、前記上位装置からライト要求（Ｗ１）を受領した場合、前記第二のＩ／Ｏ処理部は、前記ライト要求（Ｗ１）から特定されるライト対象の第二の仮想領域（Ｖ２１）に第二の実領域が未割当てであれば、前記複数の第二の実領域から未割当ての第二の実領域（Ｒ２１）を探して前記第二の仮想領域（Ｖ２１）に割り当て、前記第二の実領域（Ｒ２１）に、前記ライト要求（Ｗ１）に従うデータを書き込み、前記第二の仮想領域管理情報に、前記第二の仮想領域（Ｖ２１）に対応する前記割当モジュール識別子として前記第二のモジュールの識別子を書き込み、
（Ｂ）前記第一のモジュールが、前記上位装置からライト要求（Ｗ２）を受領した場合、前記第一のＩ／Ｏ処理部は、前記ライト要求（Ｗ２）から特定されるライト対象の第一の仮想領域（Ｖ１１）に第一の実領域が未割当てであれば、前記複数の第一の実領域から未割当ての第一の実領域（Ｒ１１）を探して前記第一の仮想領域（Ｖ１１）に割り当て、前記第一の実領域（Ｖ１１）に、前記ライト要求（Ｗ２）に従うデータを書き込み、前記第一の仮想領域管理情報に、前記第一の仮想領域（Ｖ１１）に対応する前記割当モジュール識別子として前記第一のモジュールの識別子を書き込む、
ストレージシステム。
【請求項２】
前記第一の仮想領域管理情報が、前記第一の仮想領域毎に、複製モジュールの識別子を含み、前記複製モジュールは、複製データが記憶されている実領域を有するモジュールであり、前記複製データは、前記第一の仮想領域に対応する前記割当モジュール内の実領域に記憶されているデータが複製されたものであり、
前記第二の仮想領域管理情報が、前記第二の仮想領域毎に、複製モジュールの識別子を含み、
前記第一のモジュールが、第一のデータ複製部を更に備え、
（Ｃ）前記第一のデータ複製部が、前記第二の実領域（Ｒ２１）に記憶されているデータの複製データを、前記複数の第一の実領域のうちの未割当ての実領域であって、前記第二の仮想領域（Ｖ２１）と同じアドレスの第一の仮想領域（Ｖ１２）に割り当てられる実領域（Ｒ１２）に書き込み、前記第一の仮想領域管理情報に、前記第一の仮想領域（Ｖ１２）に対応する前記複製モジュール識別子として前記第一のモジュールの識別子を書き込み、
（Ｄ）前記第一のモジュールが、前記上位装置から、前記第一の仮想領域（Ｖ１２）がリード対象であるリード要求を受領した場合、前記第一の仮想領域管理情報を参照することにより、前記第一の仮想領域（Ｖ１２）に対応する前記割当モジュールが前記第一のモジュールでなくても、前記第一の仮想領域（Ｖ１２）に対応する前記複製モジュールが前記第一のモジュールであることを特定したならば、前記実領域（Ｒ１２）からデータを読み出し、前記取得されたデータを前記上位装置に転送する、
請求項１記載のストレージシステム。
【請求項３】
前記第二のモジュールが、第二のデータ複製部を更に備え、
（Ｅ）前記第二のデータ複製部が、前記第二の仮想領域管理情報を参照することにより、前記第二の仮想領域（Ｖ２１）に割り当てられている前記第二の実領域（Ｒ２１）に記憶されているデータが複製されていないことを特定し、
前記第一のデータ複製部が、前記特定された前記第二の仮想領域（Ｖ２１）に対応する前記第一の仮想領域（Ｖ１２）について、前記（Ｃ）の処理を実行する、
請求項２記載のストレージシステム。
【請求項４】
前記第一の仮想領域管理情報が、前記第一の仮想領域毎に、単位時間当たりに第一の仮想領域がリード対象とされた回数であるリード頻度を含み、前記第一のＩ／Ｏ処理部が、リード要求の受信に応じて、そのリード要求に従うリード対象の第一の仮想領域に対応した前記リード頻度を更新し、
前記第二の仮想領域管理情報が、前記第二の仮想領域毎に、単位時間当たりに第二の仮想領域がリード対象とされた回数であるリード頻度を含み、前記第二のＩ／Ｏ処理部が、リード要求の受信に応じて、そのリード要求に従うリード対象の第二の仮想領域に対応した前記リード頻度を更新し、
前記第一の仮想領域（Ｖ１２）及び前記第二の仮想領域（Ｖ２１）の少なくとも一方に対応する前記リード頻度が基準値よりも高い場合に、前記実領域（Ｒ１２）へのデータの複製が行われる、
請求項２又は３記載のストレージシステム。
【請求項５】
前記第一の仮想領域管理情報が、前記第一の仮想領域毎に、単位時間当たりに第一の仮想領域がライト対象とされた回数であるライト頻度を含み、前記第一のＩ／Ｏ処理部が、ライト要求の受信に応じて、そのライト要求に従うライト対象の第一の仮想領域に対応した前記ライト頻度を更新し、
前記第二の仮想領域管理情報が、前記第二の仮想領域毎に、単位時間当たりに第二の仮想領域がライト対象とされた回数であるライト頻度を含み、前記第二のＩ／Ｏ処理部が、ライト要求の受信に応じて、そのライト要求に従うライト対象の第二の仮想領域に対応した前記ライト頻度を更新し、
前記第一の仮想領域（Ｖ１２）及び前記第二の仮想領域（Ｖ２１）の少なくとも一方に対応する前記リード頻度と比較される前記基準値は、前記第一の仮想領域（Ｖ１２）及び前記第二の仮想領域（Ｖ２１）の少なくとも一方に対応するライト頻度に基づく値である、
請求項４記載のストレージシステム。
【請求項６】
前記第一のモジュールに前記第一の仮想ボリュームが定義されるよりも先に、前記第二のモジュールに定義された前記第二の仮想ボリュームの前記第二の仮想領域（Ｖ２１）に前記実領域（Ｒ２１）が割り当てられており、
前記第一のポートに関連付けられた前記第一の仮想ボリュームが前記第一のモジュールに定義された契機で、前記第一のモジュールが、前記第二の実領域（Ｒ２１）に記憶されているデータの前記複製データを前記第二のモジュールから取得する、
請求項２乃至５のうちのいずれか１項に記載のストレージシステム。
【請求項７】
前記（Ａ）において前記第二の実領域（Ｒ２１）に前記ライト要求（Ｗ１）に従うデータが書き込まれた契機で、前記第一のモジュールが、前記第二の実領域（Ｒ２１）に記憶されているデータの前記複製データを前記第二のモジュールから取得する、
請求項２乃至５のうちのいずれか１項に記載のストレージシステム。
【請求項８】
（Ｆ）前記第二のＩ／Ｏ処理部が、前記第二の仮想領域（Ｖ２１）に第二の実領域が割り当てられたことを前記第一のモジュールに通知し、前記第一のＩ／Ｏ処理部が、前記第一の仮想領域管理情報において、前記第二の仮想領域（Ｖ２１）と同じアドレスの第一の仮想領域（Ｖ１２）に対応するモジュール識別子として前記第二のモジュールの識別子を書き込み、
（Ｇ）前記第一のモジュールが、前記上位装置から、前記第二の仮想領域（Ｖ２１）と同じアドレスである第一の仮想領域（Ｖ１２）がリード対象であるリード要求を受領した場合、前記第一の仮想領域管理情報を参照することにより、前記第一の仮想領域（Ｖ１２）に割り当てられている実領域が前記第二のモジュールにあることを特定し、前記第二のモジュールから、前記第二の仮想領域（Ｖ２１）に割り当てられている前記第二の実領域（Ｒ２１）に記憶されているデータを取得し、前記取得されたデータを前記上位装置に転送し、
前記（Ｇ）において前記第二の実領域（Ｒ２１）に記憶されているデータが取得された契機で、前記（Ｃ）が行われる、
請求項２乃至５のうちのいずれか１項に記載のストレージシステム。
【請求項９】
（Ｈ）前記第二のモジュールが、前記上位装置から、前記第二の実領域（Ｒ２１）が割り当て済みの前記第二の仮想領域（Ｖ２１）がライト対象であるライト要求（Ｗ３）を受領した場合、前記第二の仮想領域（Ｖ２１）が割当先の第二の実領域に記憶されるデータを、前記ライト要求（Ｗ３）に従うデータとし、
前記（Ｈ）を契機として、前記第一のモジュールが、前記第二の仮想領域（Ｖ２１）に割り当てられている第二の実領域に記憶される、前記ライト要求（Ｗ３）に従うデータを、前記第二のモジュールから取得し、前記第一の仮想領域（Ｖ１２）が割当先の第一の実領域に記憶されるデータを、前記ライト要求（Ｗ３）に従うデータの複製データとする、
請求項２乃至８のうちのいずれか１項に記載のストレージシステム。
【請求項１０】
前記第一のモジュールが、第一の複製削除部を更に備え、
前記第一の複製削除部が、前記割当モジュールが前記第二のモジュールであり前記複製モジュールが前記第一のモジュールである削除対象の前記第一の仮想領域に対する前記第一の実領域の割り当てを解除する、
請求項２乃至９のうちのいずれか１項に記載のストレージシステム。
【請求項１１】
前記第一の複製削除部が、前記第一の仮想ボリュームに対する前記第一のポートの関連付けが解除されたことを契機に、前記削除対象の第一の仮想領域に対する前記第一の実領域の割り当てを解除する、
請求項１０記載のストレージシステム。
【請求項１２】
前記第一の複製削除部が、未割当ての前記第一の実領域の数が所定数以下になったことを契機に、前記削除対象の第一の仮想領域に対する前記第一の実領域の割り当てを解除する、
請求項１０記載のストレージシステム。
【請求項１３】
前記第一の複製削除部が、前記リード頻度が低い第一の仮想領域ほど優先的に前記削除対象の第一の仮想領域とする、
請求項１２記載のストレージシステム。
【請求項１４】
前記第一のモジュールが、前記上位装置からライト要求（Ｗ４）を受領し、
前記第一の複製削除部は、前記ライト要求（Ｗ４）から特定されるライト対象の第一の仮想領域（Ｖ４）に第二の実領域が未割当てで、さらに、前記第一のモジュールが未割当の前記第一の実領域を有していない場合、前記第一の仮想領域（Ｖ１２）に対する前記第一の実領域（Ｒ１２）の割り当てを解除する、
請求項１０記載のストレージシステム。
【請求項１５】
前記第一の複製削除部が、前記複製データが書き込まれてから一定時間が経過した第一の実領域の割当てを解除する、
請求項１０乃至１４のうちのいずれか１項に記載のストレージシステム。
【請求項１６】
互いに通信可能に接続されておりそれぞれが上位装置からＩ／Ｏ要求を受信し処理するようになっている複数のモジュールを備え、各モジュールが、前記上位装置に接続されるポートと、複数の実領域で構成されたプールと、他のモジュールに接続されるモジュールインタフェース装置とを備えているストレージシステム、で実現される方法であって、
前記複数のモジュールが、それぞれ、同一のボリューム識別子が関連付けられた、複数の仮想領域で構成されている仮想ボリュームを有し、
各モジュールは、前記上位装置からライト要求を受領した場合、前記ライト要求から特定されるライト対象の仮想領域に実領域が未割当てであれば、
（Ａ）自モジュール内の前記プールから未割当ての実領域を探し、未割当ての実領域が見つかれば、当該実領域を前記ライト対象の仮想領域に割り当て、当該割り当てた実領域に、前記ライト要求に従うデータを書き込み、
（Ｂ）自モジュール内の前記プールに未割当ての実領域が無い場合には、自モジュールが、自モジュールに接続されている他モジュールに、前記ライト要求に従うデータを転送し、当該他モジュールが、当該他モジュール内のプールから未割当ての実領域を、前記他モジュール内の仮想ボリュームにおける、前記ライト対象の仮想領域と同じ仮想領域に割り当て、当該割り当てた実領域に、前記ライト要求に従うデータを書き込む、
記憶制御方法。
【請求項１７】
前記ライト対象の仮想領域に前記自モジュール内の実領域が割り当てられたことを、前記自モジュールが、他モジュールに通知し、
前記他モジュールが、前記割り当てられた実領域に記憶されているデータの複製データを、当該他モジュール内のプールのうちの未割当ての実領域であって、前記ライト対象の仮想領域と同じアドレスの仮想領域に割り当てられる実領域に書き込み、当該実領域を前記ライト対象の仮想領域と同じアドレスの仮想領域に割り当て、
前記他モジュールが、前記上位装置から、リード要求を受領した場合、
（Ｘ）前記リード要求が、前記ライト対象の仮想領域と異なるアドレスの仮想領域であって前記他モジュール内の実領域が割り当てられていない仮想領域がリード対象であるリード要求であれば、当該他モジュールが、当該別のモジュール内の仮想領域であって前記リード対象の仮想領域と同じアドレスの仮想領域に実領域内のデータを当該別のモジュールから前記他モジュールに転送し、当該転送されて来たデータを前記上位装置に転送し、
（Ｙ）前記リード要求が、前記ライト対象の仮想領域と同じアドレスの仮想領域がリード対象であるリード要求であれば、前記リード対象の仮想領域に割り当てられている、当該他のモジュール内の実領域、から前記複製データを読出して前記上位装置に転送する、
請求項１６記載の記憶制御方法。
【請求項１８】
上位装置からＩ／Ｏ要求を受け付ける、ストレージシステムのモジュールであって、
前記上位装置に接続されるポートと、
複数の仮想領域で構成されている仮想ボリュームと、
複数の実領域で構成されたプールと、
前記上位装置から前記ポートを介して受け付けたＩ／Ｏ要求を処理するＩ／Ｏ処理部と、
他のモジュールに接続されるモジュールインタフェース装置と
を備え、
前記他のモジュールは、複数の仮想領域で構成されている仮想ボリュームと、複数の実領域で構成されたプールと、自モジュールに接続されるモジュールインタフェース装置とを備えており、
前記上位装置からライト要求を受領した場合、前記Ｉ／Ｏ処理部が、前記ライト要求から特定されるライト対象の仮想領域に実領域が未割当てであれば、
（Ａ）自モジュール内の前記プールから未割当ての実領域を探して前記ライト対象の仮想領域に割り当て、当該割り当てた実領域に、前記ライト要求に従うデータを書き込み、
（Ｂ）自モジュール内の前記プールに未割当ての実領域が無い場合には、自モジュールに接続されている他モジュールに前記ライト要求に従うデータを転送し、当該他モジュールが、当該他モジュール内のプールから未割当ての実領域を、前記他モジュール内の仮想ボリュームにおける、前記ライト対象の仮想領域と同じ仮想領域に割り当て、当該割り当てた実領域に、前記ライト要求に従うデータを書き込むことができるようになっている、
ストレージシステムモジュール。
【請求項１９】
前記割り当てた実領域に記憶されるデータの複製データを、このモジュール以外の他のモジュールに転送する第一の複製処理部を更に備える、
請求項１８記載のストレージシステムモジュール。
【請求項２０】
このモジュール以外の他のモジュール内の実領域に記憶されたデータの複製データを、前記他のモジュールから取得し、前記他のモジュールにおいて、その実領域の割当先の仮想領域と同じアドレスの、このモジュール内の仮想ボリュームにおける仮想領域に割り当てられる実領域に、前記取得した複製データを書き込む第二の複製処理部を更に備える、
請求項１８又は１９記載のストレージシステムモジュール。
【請求項２１】
前記第一のモジュールが、前記上位装置からリード要求を受領した場合、前記第一のＩ／Ｏ処理部は、前記リード要求から特定されるリード対象のライト対象の仮想領域に第一の実領域が割り当てられていれば、前記第一の実領域から、前記リード要求に従うデータを読み出し、前記読み出したデータをホストへ転送する、
請求項１記載のストレージシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数の物理的な記憶装置を備えるストレージシステムに関する。
【背景技術】
【０００２】
複数の物理的な記憶装置を備えるストレージシステムの一つとして、動的容量割り当て機能を有したストレージシステムが知られている（例えば、特許文献１及び特許文献２参照）。このストレージシステムには、仮想的な論理ボリューム（以下、「仮想ボリューム」と言う）と、記憶領域プール（以下、「プール」と言う）とが備えられる。仮想ボリュームは、複数の仮想的な記憶領域（以下、「仮想領域」と言う）で構成されている。プールは、複数の実体的な記憶領域（以下、「実領域」と言う）で構成されている。実領域は、複数の物理的な記憶装置に基づく記憶領域である。
【０００３】
動的容量割り当て機能によれば、仮想ボリューム内の仮想領域に対するデータの書き込み発生を契機として、その仮想領域に、プール内の実領域が割り当てられ、データは、その割り当てられた実領域に書き込まれる。
【０００４】
【特許文献１】特開２００５−０１１３１６号公報
【特許文献２】特開２００６−３０２２５８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
ところで、ストレージシステムを、複数のストレージシステムモジュール（以下、「モジュール」と省略する）で構成することが考えられる。以下、複数のモジュールで構成されたストレージシステムを、「モジュール構成のストレージシステム」と呼ぶ。個々のモジュールは、複数の物理記憶装置と、複数の物理記憶装置に対するアクセスを制御するコントローラとを備える。複数のモジュールを１台のストレージシステムであるかのように運用したり管理したりすることができる。また、必要に応じて、モジュールを増やしたり減らしたりすることで、ストレージシステムの記憶容量や処理能力を変更することができる。
【０００６】
モジュール構成のストレージシステムに、上述した動的容量割り当て機能を適用させると、例えば図３０に示す構成が考えられる。
【０００７】
すなわち、モジュール構成のストレージシステムが、ポート（Ａ）及びプール（Ａ）を有するモジュール（Ａ）と、ポート（Ｂ）及びプール（Ｂ）を有するモジュール（Ｂ）で構成される。モジュール（Ａ）及び（Ｂ）が、一つのストレージシステムであるかのように管理される。このため、ホスト（Ｈ）には、一つのストレージシステムにポート（Ａ）及び（Ｂ）があるかのように認識される。
【０００８】
モジュール（Ａ）にのみ、仮想ボリューム（ＶＶＯＬ）が備えられる。ホスト（Ｈ）がポート（Ａ）とポート（Ｂ）のどちらを経由しても仮想ボリューム（ＶＶＯＬ）にアクセスできるようにするため、ポート（Ａ）と仮想ボリューム（ＶＶＯＬ）とを結ぶ第一のパス（Ｐ１）の他に、ポート（Ｂ）と仮想ボリューム（ＶＶＯＬ）とを結ぶ第二のパス（Ｐ２）が張られる。
【０００９】
仮想ボリューム（ＶＶＯＬ）内の仮想領域（Ｖ）に対するデータのライト要求（Ｗ）がホスト（Ｈ）から送信されるケースについて考察すると、下記の４通りが考えられる。
ケースＷ１：モジュール（Ａ）が、第一のパス（Ｐ１）を介してライト要求（Ｗ）を受信し、仮想領域（Ｖ）に、プール（Ａ）内の実領域を割り当てる。
ケースＷ２：モジュール（Ａ）が、第一のパス（Ｐ１）を介してライト要求（Ｗ）を受信し、仮想領域（Ｖ）に、プール（Ｂ）内の実領域を割り当てる。
ケースＷ３：モジュール（Ａ）が、第二のパス（Ｐ２）を介してライト要求（Ｗ）を受信し、仮想領域（Ｖ）に、プール（Ａ）内の実領域を割り当てる。
ケースＷ４：モジュール（Ａ）が、第二のパス（Ｐ２）を介してライト要求（Ｗ）を受信し、仮想領域（Ｖ）に、プール（Ｂ）内の実領域を割り当てる。
【００１０】
以上のことは、図３０には示していないが、仮想領域（Ｖ）からのデータのリード要求（Ｒ）がホスト（Ｈ）から送信されるケースについて考察しても、下記の４通り、すなわち上記と同種のケースが考えられる。
ケースＲ１：モジュール（Ａ）が、第一のパス（Ｐ１）を介してリード要求（Ｒ）を受信し、プール（Ａ）内の実領域からデータを読出しホスト（Ｈ）に送信する。
ケースＲ２：モジュール（Ａ）が、第一のパス（Ｐ１）を介してリード要求（Ｒ）を受信し、プール（Ｂ）内の実領域からデータを読出しホスト（Ｈ）に送信する。
ケースＲ３：モジュール（Ａ）が、第二のパス（Ｐ２）を介してリード要求（Ｒ）を受信し、プール（Ａ）内の実領域からデータを読出しホスト（Ｈ）に送信する。
ケースＲ４：モジュール（Ａ）が、第二のパス（Ｐ２）を介してリード要求（Ｒ）を受信し、プール（Ｂ）内の実領域からデータを読出しホスト（Ｈ）に送信する。
【００１１】
上述のケースＷ２〜Ｗ４やＲ２〜Ｒ４では、モジュール（Ａ）とモジュール（Ｂ）との間に通信（以下、「モジュール間通信」と言う）が発生する。例えば、ケースＷ２では、仮想領域（Ｖ）にプール（Ｂ）内の実領域を割り当てるためのモジュール間通信が発生する。ケースＷ３では、ポート（Ｂ）を経由したライト要求（Ｗ）をモジュール（Ａ）に転送するためのモジュール間通信が発生する。ケースＷ４では、ポート（Ｂ）を経由したライト要求（Ｗ）をモジュール（Ａ）に転送するためのモジュール間通信と、仮想領域（Ｖ）にプール（Ｂ）内の実領域を割り当てるためのモジュール間通信とが発生する。
【００１２】
上記考察によれば、同一のポート（Ａ）或いは（Ｂ）をライト要求／リード要求（Ｉ／Ｏ要求）が経由しても、モジュール間通信の発生により、Ｉ／Ｏ性能が低下してしまう（具体的には、モジュール構成のストレージシステムがホスト（Ｈ）からＩ／Ｏ要求を受けてからレスポンスをホスト（Ｈ）に返すまでの時間長が長くなってしまう）ことがある。また、Ｉ／Ｏ要求（ライト要求／リード要求）が経由するポートが異なると、モジュール間通信の発生回数が異なることがあるため、Ｉ／Ｏ性能が異なることがある。
【００１３】
従って、本発明の目的は、モジュール構成のストレージシステムにおいてモジュール間通信がなるべく発生しないようにすることにある。
【００１４】
本発明の別の目的は、モジュール構成のストレージシステムが有するどのポートをＩ／Ｏ要求が経由してもＩ／Ｏ性能がなるべく均一になるようにすることにある。
【００１５】
本発明の他の目的は、後の説明から明らかになるであろう。
【課題を解決するための手段】
【００１６】
複数のモジュールが、同一のボリューム識別番号が関連付けられた複数の仮想ボリュームを備える。上位装置からライト要求を受領したモジュール（自モジュール）は、そのライト要求に従うライト対象の仮想領域に実領域が未割当てであれば、他のモジュール内の複数の実領域からではなく、自モジュール内の複数の実領域から、未割当ての実領域を探す。自モジュールは、ライト対象の仮想領域に、自モジュール内の探し出された実領域を割り当て、その実領域に、ライト要求に従うデータを書き込む。複数のモジュールは、例えば、一以上の第一のモジュールと一以上の第二のモジュールとで構成される。第一と第二のモジュールが有する機能は同じである。
【発明を実施するための最良の形態】
【００１７】
以下、図面を参照して、本発明の幾つかの実施例を説明する。また、以下、コンピュータプログラムが主語になる場合は、実際にはそのコンピュータプログラムを実行するプロセッサ（ＣＰＵ）によって処理が行われるものとする。
【実施例１】
【００１８】
図１は、実施例１に係るコンピュータシステムの全体構成の一例を示す。
【００１９】
ホスト１００と、モジュール構成のストレージシステム（以下、「ストレージシステム」と省略する、保守端末２７０とが備えられる。ストレージシステムは、例えば２台のストレージシステムモジュール（以下、「モジュール」と言う）２００で構成されている。モジュール２００は、コントローラや物理記憶装置を備える、ストレージシステムの一要素（サブシステム）である。また、ホスト１００と各モジュール２００は、第一の通信ネットワーク１１０を介して接続される。また、モジュール２００同士は、第二の通信ネットワーク２８２を介して接続される。第二の通信ネットワーク２８２は、第一の通信ネットワーク１１０から独立したネットワークである。第一又は第二の通信ネットワーク１１０、２８２に代えて、第一又は第二の専用線など他種の通信媒体がそれぞれ採用されてもよい。
【００２０】
２台のモジュール２００が１台のストレージシステムであるかのようにホスト１００に認識される。以下、２台のモジュール２００を区別して説明する場合には、「モジュール（１）」、「モジュール（２）」と言う。なお、実施例１では、モジュール２００は２台であるが、３台以上あってもよい。
【００２１】
ホスト１００は、Ｉ／Ｏ要求をモジュール構成のストレージシステムに送信する計算機である。
【００２２】
保守端末２７０は、ストレージシステムを保守するための端末（計算機）であり、第三の通信ネットワーク２８１を介して各モジュール２００に接続される。保守端末２７０は、保守ポート２７５、ＣＰＵ２７１、メモリ２７２及び入出力部２７４を備える。保守ポート２７５は、プロセッサパッケージ２１０の保守ポート２１３と接続される。保守ポート２７５を介して、プロセッサパッケージ２１０から稼動情報が取得されたり、プロセッサパッケージ２１０に保守操作が送信されたりする。メモリ２７２には、保守用プログラム２７３が格納されている。ＣＰＵ２７１が、メモリ２７２から保守用プログラム２７３を読み出し実行することで、保守を実現する。なお、メモリ２７２は、プロセッサパッケージ２１０から取得された情報を記憶することもできる。入出力部２７４は、ユーザからの操作を受け付けたり、ユーザにストレージシステムの稼動情報を表示したりするためのユーザインタフェース（例えば、キーボード、マウス、モニタなど）である。なお、保守端末２７０は電源を有するものとする（図示しない）。
【００２３】
モジュール２００は、コントローラと、ＨＤＤ（Hard Disk Drive）２４０と、スイッチ２９０とを備える。コントローラは、フロントエンドパッケージ２６０（以下、「ＦＥパッケージ」と言う）と、プロセッサパッケージ２１０と、メモリパッケージ２２０と、バックエンドパッケージ２３０（以下、「ＢＥパッケージと略記）とで構成される。コントローラを構成する各要素やスイッチ２９０が、内部ネットワーク（例えばクロスバスイッチ）２８０を介して相互に接続されている。なお、ＦＥパッケージ２６０、プロセッサパッケージ２１０、メモリパッケージ２２０及びＢＥパッケージ２３０の少なくとも一つが、複数個存在しても良い。
【００２４】
ＦＥパッケージ２６０は、一つ以上のポート２６１を有する。ポート２６１は、ホスト１００からＩ／Ｏ要求が出力されるポート（図示せず）と第一の通信ネットワーク１１０を介して接続され、ホスト１００からＩ／Ｏ要求（ライト要求／リード要求）を受け付ける。
【００２５】
プロセッサパッケージ２１０は、プロセッサ（例えばマイクロプロセッサ）２１１、ローカルメモリ２１２、及び保守ポート２１３を有する。これらは、パッケージ内ネットワーク（例えばＣＰＵバス）２１４によって相互に接続されている。一つのプロセッサパッケージ２１０に、プロセッサ２１１、ローカルメモリ２１２及び保守ポート２１３のうちの少なくとも一つが、複数個存在しても良い。
【００２６】
プロセッサ２１１は、メモリパッケージ２２０のプログラム部２２２に格納されているコンピュータプログラムを実行することで、ホスト１００からのＩ／Ｏ要求の処理などを実行する。
【００２７】
ローカルメモリ２１２は、プロセッサ２１１が実行するコンピュータプログラムが一時的に使用するデータを一時的に記憶しておくほか、ＨＤＤ２４０やメモリパッケージ２２０に格納されているデータ（制御情報、業務データ、プログラムなど）を記憶する。プロセッサ２１１からローカルメモリ２１２までの物理的な距離が、プロセッサ２２１からメモリパッケージ２２０やＨＤＤ２４０までの物理的な距離に比べ近い。このため、プロセッサ２１１が実行する処理に使用されるデータをメモリパッケージ２２０やＨＤＤ２４０に格納するよりも、ローカルメモリ２１２に格納するほうが高速に処理を行うことができる。
【００２８】
保守ポート２１３は、第二の通信ネットワーク２８１を介して、保守端末２７０にある保守ポート２７５に接続される。保守ポート２１３を介して、保守端末２７０にプロセッサパッケージ２１０の稼動情報が送信されたり、保守端末２７０からの保守操作が受け付けられたりする。
【００２９】
メモリパッケージ２２０は、一又は複数のメモリで構成されており、制御情報部２２１、プログラム部２２２及びキャッシュ部２２３を有する。プログラム部２２２には、ストレージシステム２００が実行する処理を実現するためのプログラムが記憶されている。制御情報部２２１には、これらプログラムが利用する制御情報が記憶されている。メモリパッケージ２２０に記憶されているプログラム及び制御情報は、プロセッサパッケージ２１０のプロセッサ２１１から読み出される。キャッシュ部２２３には、ＨＤＤ２４０に入出力されるデータが一時的に記憶される。キャッシュ部２２３にターゲットのデータがあれば、プロセッサ２１１は、ＨＤＤ２４０にアクセスすることなくターゲットのデータをキャッシュ部２２３から取得できる。ＨＤＤ２４０に格納される使用頻度の高いデータなどがキャッシュ部２２３に記憶されていれば、ホスト１００からのＩ／Ｏ要求の処理速度の向上が期待できる。なお、メモリパッケージ２２０は、障害発生時におけるデータ消失などを避けるため、二重化されていてもよい。
【００３０】
ＢＥパッケージ２３０は、一つ以上のポート２３１を有する。ポート２３１は、バックエンドの通信ネットワーク（例えばファイバチャネルネットワーク）２８３を介してＨＤＤ２４０に接続される。ポート２３１を介して、キャッシュ部２２３に一時的に記憶されたライト対象のデータがＨＤＤ２４０に書き込まれたり、ＨＤＤ２４０から読み出されたリード対象のデータがキャッシュ部２２３に一時的に記憶されたりする。
【００３１】
スイッチ２９０は、フロントエンドパッケージ２６０、バックエンドパッケージ２３０、プロセッサパッケージ２１０、及び、メモリパッケージ２２０に接続され、これらの要素間の通信を制御する回路基板である。一方のモジュール２００内のスイッチ２９０が、他方のモジュール２００内のスイッチ２９０と接続されている。スイッチ２９０同士を介して、モジュール間通信が行われる。なお、以下、スイッチ２９０同士の結合を、「疎結合」と呼び、内部ネットワーク２８０を介した要素間の結合を、「密結合」と呼ぶことがある。なぜなら、一つのモジュール２００内のパッケージ間では、そのモジュール２００のキャッシュ部２２３に記憶される制御情報を直接参照及び更新することが可能であり、一方、一方のモジュール２００から他方のモジュール２００のキャッシュ部２２３に記憶される制御情報を直接参照及び更新することを許されず、一方のモジュール２００内のプロセッサ２１１が他方のモジュール２００内のプロセッサ２１１に依頼することで間接的に参照及び更新することが可能になるためである。つまり、密結合とは、制御情報を直接的に参照及び更新することが可能な結合を言い、疎結合とは、制御情報を間接的に参照及び更新することになる結合を言う。
【００３２】
ＨＤＤ２４０は、ホスト１００によって実行されるソフトウェア（例えばデータベースマネジメントシステム）が利用するデータ、すなわち、ホスト１００からのＩ／Ｏ要求の対象となるデータを記憶する。また、１つ以上のＨＤＤ２４０が、パリティグループ（或いはＲＡＩＤグループ）という単位でグループ化されても良い。つまり、ＲＡＩＤ（Redundant Arrays of Inexpensive Disks）のような方法で高信頼化が実現されてもよい。パリティグループの記憶空間を構成する各記憶領域を、論理的な記憶デバイスであるボリューム２５０とすることができる。なお、実施例１では、物理的な記憶装置としてＨＤＤ２４０が使用されるが、フラッシュメモリやＤＶＤなどの他種の物理的な不揮発性の記憶装置が採用されても良い。また、複数種類の物理的な記憶装置が、一つのモジュール２００或いは一つのストレージシステムに混在しても良い。
【００３３】
図２は、メモリパッケージ２２０の詳細を示す。
【００３４】
制御情報部２２１に記憶される制御情報として、例えば、パスに関する情報が記録されるパス情報テーブル２２１１、仮想ボリュームに関する情報が記録される仮想ボリュームテーブル２２１２、プールに関する情報が記録されるプールテーブル２２１３、及び後述のページに関する情報が記録されるページテーブル２２１４がある。プログラム部２２２に記憶されるコンピュータプログラムとして、例えば、リード処理を制御するリードプログラム２２２１、ライト処理を制御するライトプログラム２２２２、パスを定義するためのパス定義プログラム２２２３、定義されているパスを削除するためのパス削除プログラム２２２４、ページを仮想領域に割り当てるためのページ割当プログラム２２２５、モジュール間でページ単位にデータを複製するための複製作成プログラム２２２６、複製ページを削除するための複製削除プログラム２２２７、制御情報を更新するための制御情報更新プログラム２２２８、及び仮想ボリュームを作成するための仮想ボリューム作成プログラム２２２９がある。これらのテーブルやプログラムについては、後に詳述する。なお、これらのコンピュータプログラム２２２１〜２２２９がプロセッサで実行されることによって行われる処理の全部又は一部が、ハードウェア回路など別種の処理部で実現されても良い。
【００３５】
前述したように、モジュール（１）及び（２）が、ホスト１００に対して一台のストレージシステムとして認識される。このため、管理者が、モジュール（２）のボリューム２５０に繋がるパス（Ｉ／Ｏ用のパス）を定義する場合に、モジュール（１）のポート２６１を指定する可能性がある。このような指定がされた場合、次のようにＩ／Ｏ処理を実現する必要がある。すなわち、モジュール（１）が、ホスト１００からＩ／Ｏ要求を受領し、モジュール（２）にＩ／Ｏ処理を依頼する。モジュール（２）が、その依頼に応答して、モジュール（２）内のボリューム２５０に対するＩ／Ｏを実行する。このようなＩ／Ｏを、以下、「モジュール２００を跨ぐＩ／Ｏ」と呼ぶことがある。以降に、モジュール２００を跨ぐＩ／Ｏの処理方式について説明する。
【００３６】
まず、モジュール２００を跨ぐＩ／Ｏを実現するための制御情報について説明する。
【００３７】
図３は、パス情報テーブル２２１１の詳細を示す。
【００３８】
パス情報テーブル２２１１には、パス毎に、ポート番号、ボリューム番号及びモジュール番号が記録される。一つのパス（以下、この段落で「対象パス」と言う）について説明すると、「ポート番号」は、対象パスの一つの構成要素である、ポート２６１の識別番号である。「ボリューム番号」は、対象パスにつながる論理ボリューム（例えばボリューム２５０或いは後述の仮想ボリューム）の識別番号である。実施例１では、パスの情報は、ポート番号とボリューム番号とで構成される。「モジュール番号」は、対象パスにつながる論理ボリュームを有するモジュール２００の識別番号である。図３の例によれば、ボリューム０、ボリューム１及びボリューム２は、モジュール（１）にあり、ボリューム３は、モジュール（２）にある。
【００３９】
図４を用いて、モジュール２００を跨ぐＩ／Ｏとしてライトの処理の一例を説明する。
【００４０】
ライト処理は、モジュール（１）及びモジュール（２）のそれぞれにおいてライトプログラム２２２２が実行されることで実現される。図４の説明では、モジュール（１）のプロセッサ２１１で実行されるライトプログラム２２２２を「ライトプログラム（１）」と言い、モジュール（２）のプロセッサ２１１で実行されるライトプログラム２２２２を「ライトプログラム（２）」と言う。なお、以下、モジュール（１）及び（２）における同種の要素を区別するときには、ライトプログラム２２２２と同様に、参照符号に代えて、（１）或いは（２）と言う符号を用いることがある。
【００４１】
ホスト１００が、モジュール（１）のポート２６１を有するパスを利用してライト要求を発行し（Ｓ１００）、ストレージシステムからのライト完了報告を待つ（Ｓ１０１）。
【００４２】
ホスト１００が上記パスを利用してライト要求を発行すると、モジュール（１）がライト要求を受領する（Ｓ１０２）。ライトプログラム（１）が、パス情報テーブル（１）を参照し、ライトデータ（ライト対象のデータ）の書込み先のボリューム２５０の所在をチェックする（Ｓ１０３）。ライトプログラム（１）は、書込み先ボリューム２５０を有するモジュール２００がモジュール（１）と（２）のどちらであるかの判定を行う（Ｓ１０４）。Ｓ１０４でモジュール（１）と判定された場合（Ｓ１０４でＮｏ）、ライトプログラム（１）は、書込み先ボリューム２５０にライトデータを書込み（Ｓ１０５）、ホスト１００へライト完了を報告する（Ｓ１０６）。一方、Ｓ１０４でモジュール（２）と判定された場合（Ｓ１０４でＹｅｓ）、ライトプログラム（１）は、ライトデータをキャッシュ部（１）に格納する。そして、ライトプログラム（１）は、モジュール（２）にライト処理を依頼し（Ｓ１０８）、モジュール（２）からの応答を待つ（Ｓ１０９）。このとき、ライトプログラム（１）は、モジュール（２）に、ライトデータのキャッシュアドレスを通知する。キャッシュアドレスとは、対象のデータが記憶されている記憶領域のアドレスであって、キャッシュ部２２３内の記憶領域（以下、キャッシュ領域）のアドレスである。
【００４３】
ライトプログラム（２）は、ライト処理の依頼をモジュール（１）から受領し（Ｓ１１０）、その依頼と共に受けたキャッシュアドレスが示すキャッシュ領域から、ライトデータをモジュール（２）へ転送し（キャッシュ領域からライトデータの読出し）（Ｓ１１１）、そのライトデータを書き込み先ボリューム２５０に書き込む（Ｓ１１２）。書込み完了後、ライトプログラム（２）は、モジュール（１）へライト完了を報告する（Ｓ１１３）。
【００４４】
ライトプログラム（１）は、ライト完了の報告をライトプログラム（２）から受領したならば、ホスト１００へライト完了を報告する（Ｓ１１６）。
【００４５】
ホスト１００は、モジュール（１）からライト完了報告を受領すると（Ｓ１１７）、処理を終了する（Ｓ１１８）。
【００４６】
モジュール２００を跨ぐＩ／Ｏとしてライトを例に採り説明したが、リードの場合は、例えば以下の処理が行われる。すなわち、Ｓ１０７が省略され、Ｓ１０８で、リードプログラム（１）が、モジュール（２）にリード要求を発行する。リードプログラム（２）が、そのリード要求を受領し、リードデータ（リード対象のデータ）を、キャッシュ部（２）に書き込み、リードデータのキャッシュアドレス（キャッシュ部（２）内のキャッシュ領域のアドレス）をモジュール（１）に通知する。リードプログラム（１）が、ステップＳ１１１同様に、モジュール（２）からモジュール（１）へリードデータを転送する（つまり、通知されたキャッシュアドレスが示すキャッシュ領域からリードデータを読み出す）。最後に、リードプログラム（１）が、リード完了報告と共に、リードデータをホスト１００へ転送する。
【００４７】
以上のようにして、モジュール２００を跨ぐライトやリードを実現することができる。しかし、モジュール２００を跨ぐＩ／Ｏの場合、モジュール間通信が行われるため、Ｉ／Ｏ性能が低下する。さらに、モジュール（１）内のボリューム２５０とホスト１００との間に、ＦＥのポート（１）を有する第一のパスとＦＥのポート（２）を有する第二のパスとが張られている場合、第一と第二のパスのどちらが使用されるかによって（つまり、ＦＥのポート（１）と（２）のどちらがＩ／Ｏ要求を受領するかによって）、Ｉ／Ｏ性能が異なってしまう。
【００４８】
実施例１では、モジュール（１）及び（２）の両方に仮想ボリューム技術（動的容量割り当て機能）が備えられ、Ｉ／Ｏ性能が低下することを回避するための工夫が施されている。以下、その工夫を説明するが、その前に、図５から図８を用いて、仮想ボリュームについて説明する。
【００４９】
図５は、仮想ボリューム技術の概要を示す。
【００５０】
モジュール（１）及び（２）に、仮想ボリューム３０２とプール３００が備えられる。
【００５１】
仮想ボリューム３０２は、ボリューム２５０のような実領域で構成された論理ボリュームとは異なり、実領域を有しない仮想的な論理ボリュームである。仮想ボリューム３０２は、複数の仮想的な記憶領域（仮想領域）で構成されている。
【００５２】
プール３００は、例えばボリューム２５０で構成された記憶空間であり、複数のページ３０１で構成されている。ここで、「ページ」とは、ボリューム２５０の構成要素であり、ＨＤＤ２４０に基づく実体的な記憶領域（実領域）である。ページ３０１が、仮想領域に割り当てられると、その仮想領域を書き込み先とするライトデータ３０４が、割り当てられたページ３０１に書き込まれる。一個の仮想領域の記憶容量が、所定個数（例えば一個）のページ３０１の記憶容量であっても良いし、一個のページ３０１の記憶容量が、所定個数（例えば一個）の仮想領域の記憶容量であっても良い。
【００５３】
なお、プール３００は、仮想ボリューム３０２毎に存在する必要はない。例えば、一つのプール３００から複数の仮想ボリューム３０２にページ３０１が割り当てられても良いし、一つの仮想ボリューム３０２に複数のプール３００からページ３０１が割り当てられても良い。仮想ボリューム３０２には、その仮想ボリューム３０２を有しない他のモジュール２００にあるプール３００からページ３０１が割り当てられても良い。
【００５４】
図６は、プールテーブル２２１３の一例である。
【００５５】
プールテーブル２２１３は、プール３００毎に存在するテーブルである。プールテーブル２２１３には、そのテーブル２２１３に対応するプール３００についてのプール番号、プールサイズ及びページテーブルが記録される。「プール番号」は、上記対応するプール３００の識別番号である。「プールサイズ」は、上記対応するプール３００の記憶容量である。「ページテーブル」は、上記対応するプール３００が有する各ページ３０１を管理するための情報、具体的には、図７に示す情報である。すなわち、ページテーブル２２１４には、上記対応するプール３００を構成するページ３０１毎に、ページ番号、開始アドレス、終了アドレス、状態及び割当先が記録される。一つのページ３０１（以下、この段落で「対象ページ３０１」と言う）について説明すると、「ページ番号」は、対象ページ３０１の識別番号である。「開始アドレス」は、対象ページ３０１のプール３００における開始アドレスであり、「終了アドレス」は、対象ページ３０１のプール３００における最終アドレスである。「状態」は、対象ページ３０１の状態であり、例えば、仮想領域に割当て済みか否かである。「割当先」は、対象ページ３０１の割当て先の仮想領域を有する仮想ボリューム３０２のボリューム番号である。「状態」の値が“未割当て”の場合には、「割当先」の値としては、例えば無意味な値（例えば“−”）が採用される。なお、実施例１では、説明の簡単化のため一つのページ３０１は固定サイズであるが、ページテーブル２２１４内にページサイズを管理することで可変サイズとされても良い。
【００５６】
図８は、仮想ボリュームテーブル２２１２の一例を示す。
【００５７】
仮想ボリュームテーブル２２１２には、仮想領域毎に、仮想ボリューム番号、アドレス、ページ割当状態、割当モジュール、プール番号及びページ番号が記録される。以下、一つの仮想領域（以下、図８（及び図１７）の説明において「対象仮想領域」と言う）について説明する。「仮想ボリューム番号」は、対象仮想領域を有する仮想ボリュームの識別番号である。「仮想ボリューム番号」の値は、「ボリューム番号」としてパス情報テーブル２２１１（図３参照）にも記録され得る。「アドレス」は、仮想ボリューム内の対象仮想領域のアドレスであり、例えば、対象仮想領域の先頭アドレスと末尾アドレスとの組み合わせで表される。「ページ割当状態」は、対象仮想領域にページ３０１が割当済みか否かである。「割当モジュール」は、対象仮想領域に割り当てられたページ（以下、図８の説明において「対象ページ」と言う）３０１を有するモジュール２００の識別番号である。「プール番号」は、対象ページ３０１を有するプールの識別番号である。「ページ番号」は、対象ページ３０１の識別番号である。
【００５８】
図９は、実施例１の一つの特徴の概要の説明図である。以下の説明では、Ｉ／Ｏ要求を受領したモジュールを「自モジュール」と言い、そうではないモジュールを「他モジュール」と言うことがある。
【００５９】
実施例１では、例えば下記（工夫１）及び（工夫２）が施される。
（工夫１）モジュール（１）及びモジュール（２）の両方に、同一のボリューム番号が割り当てられた仮想ボリューム３０２が備えられる。
（工夫２）モジュール（１）及び（２）は、ライト要求を受領した場合、そのライト要求から特定される書込み先仮想領域にページ３０１が未割り当てであるならば、自モジュールにあるプール３００内のページ３０１を、書込み先の仮想領域に割り当てる。
【００６０】
なお、（工夫１）では、例えば、ボリューム番号が例えば２層の番号であっても良い。すなわち、ホスト１００に認識されモジュール（１）及び（２）で共通の第一種のボリューム番号（グローバルな番号）と、ホスト１００では認識されず個々のモジュール２００で認識される第二種のボリューム番号（ローカルな番号）とがあっても良い。
【００６１】
以下、具体例を説明する。
【００６２】
同一のボリューム番号“１”が割り当てられた仮想ボリューム（１）及び（２）が、モジュール（１）及び（２）に備えられる。仮想ボリューム（１）及び（２）のボリューム番号が同じため、ホスト１００には、仮想ボリューム（１）及び（２）が別々に認識されず、仮想ボリューム（１）及び（２）がマージされた一つの論理ボリューム（以下、図９を参照した説明において「ボリューム（Ｔ）」と言う）として認識される。
【００６３】
モジュール（１）が、第一の仮想領域がライト対象の仮想領域であるライト要求を受けた場合、矢印６１２に示すように、仮想ボリューム（１）の第一の仮想領域６１１に、プール（１）内のページ７１１を割り当て、そのページ７１１に、ライトデータを書き込む。同様に、モジュール（２）が、第二の仮想領域がライト対象の仮想領域であるライト要求を受けた場合、矢印６２２に示すように、仮想ボリューム（２）の第二の仮想領域６２３に、プール（２）内のページ７２３を割り当て、そのページ７２３に、ライトデータを書き込む。
【００６４】
上記の場合、ホスト１００には、ボリューム（Ｔ）における第一の記憶領域（アドレス“０〜９９”）と第二の記憶領域（アドレス“１００〜１９９”）にライトデータが記憶済みであると認識される。また、仮想ボリュームテーブル（１）及び（２）は、それぞれ図９に示す通りになる。すなわち、仮想ボリューム（１）における第二の仮想領域６１３（アドレス“１００〜１９９”）にプール（１）内のページ３０１が割り当てられていないが、仮想ボリューム（２）における第二の仮想領域６２３にプール（２）内のページ３０１が割り当て済みであるため、仮想ボリュームテーブル（１）には、「ページ割当状態」の値として“済み”が記録され、「割当モジュール」の値として“モジュール（２）”が記録される。同様に、仮想ボリューム（２）における第一の仮想領域６２１（アドレス“０〜９９”）にプール（２）内のページ３０１が割り当てられていないが、仮想ボリューム（１）における第一の仮想領域６１１にプール（１）内のページ（３０１）が割り当てられているため、仮想ボリュームテーブル（２）には、「ページ割当状態」の値として“済み”が記録され、「割当モジュール」の値として“モジュール（１）”が記録される。
【００６５】
モジュール（２）が、矢印６４０に示すように、第二の仮想領域６２３からリードデータを読み出すリード要求を受領した場合、仮想ボリュームテーブル（２）を参照し、第二の仮想領域６２３の「ページ割当状況」をチェックする。チェックの結果、モジュール（２）内のページ３０１（プール番号“１”及びページ番号“１”に対応したページ３０１）にリードデータが記憶されていることがわかる。このため、モジュール（２）は、自モジュール内のそのページ３０１からリードデータを読出し、読み出したリードデータをホスト１００へ転送する。
【００６６】
また、ページ３０１が割り当て済みの仮想領域６２３へデータをライトする場合にも、リードの場合と同様に実現される。すなわち、モジュール間の通信は不要である。
【００６７】
上記（工夫１）及び（工夫２）を適用することで、同一のモジュールのポートからライト、および、リードを繰り返し実行する場合には、モジュール間通回数を削減できる。
【００６８】
一方、モジュール（２）が、矢印６３０に示すように、第一の仮想領域６２１からリードデータを読み出すリード要求を受領した場合、仮想ボリュームテーブル（２）を参照し、第一の仮想領域６２１の「ページ割当状況」をチェックする。チェックの結果、モジュール（１）内のページが使用されていることがわかる。このため、モジュール（２）は、矢印６２５に示すように、モジュール（１）に、リード処理を依頼する。モジュール（１）が、その依頼に応答して、仮想ボリューム（１）の第一の仮想領域６１１に割り当てられている、モジュール（１）内のページ３０１（プール番号“３”及びページ“２”に対応したページ３０１）からリードデータを読み出す。読み出されたリードデータが、モジュール（１）からモジュール（２）に転送され、モジュール（２）からそのリードデータがホスト１００に転送される。
【００６９】
さて、仮想ボリューム３０２の作成契機及び作成方法としては、以下の（ＴＭ１）及び（ＴＭ２）が考えられる。
（ＴＭ１）ユーザが仮想ボリューム３０２を作成する契機で、全モジュール２００に仮想ボリューム３０２が作成される。
（ＴＭ２）ユーザが仮想ボリューム３０２を作成する契機では、ユーザが指定するモジュール２００のみに仮想ボリューム３０２が作成される。そして、他モジュール２００のポート２６１からその仮想ボリューム３０２へのパスが定義された契機で、他モジュール２００に、その仮想ボリューム３０２が作成される。
【００７０】
図１０を用いて、上記（ＴＭ１）に関わる処理の一例を説明する。
【００７１】
ユーザが保守端末２７０から仮想ボリューム作成を指示すると、保守端末２７０の保守プログラム２７３や、各モジュール２００の仮想ボリューム作成プログラム２２２９が実行されることで、仮想ボリューム作成が行われる。ユーザは、保守端末２７０に対して作成する仮想ボリューム３０２のボリューム番号を指定するものとする。
【００７２】
保守プログラム２７３は、仮想ボリューム作成を指示していないモジュール２００があるか否かを判定する（Ｓ１６００）。全モジュール２００に仮想ボリューム作成を指示した場合には、Ｓ１６０７が行われる（つまり処理の終了となる）。一方、仮想ボリューム作成を指示していないモジュール２００が存在する場合、Ｓ１６０１からＳ１６０６が実行される。
【００７３】
保守プログラム２７３は、仮想ボリュームの作成をモジュール２００に指示し（Ｓ１６０１）、指示先のモジュール２００からの完了報告を待つ（Ｓ１６０２）。なお、仮想ボリューム作成の指示とともに、保守プログラム２７３は、モジュール２００に、作成する仮想ボリューム３０２のボリューム番号（例えばユーザから指定された番号）を通知する。
【００７４】
仮想ボリューム作成プログラム２２２９は、保守プログラム２７３から仮想ボリューム作成の指示を受領し（Ｓ１６０３）、仮想ボリュームテーブル２２１２に、仮想ボリューム情報を登録する（Ｓ１６０４）。具体的には、例えば、仮想ボリューム情報として、「仮想ボリューム番号」の値は、保守プログラム２７３から通知された番号であり、「ページ割当状態」の値は、全て“未”であり、「割当モジュール」及び「ページ番号」の値は、未割当を意味する値（例えば“−”）である。
【００７５】
仮想ボリューム作成プログラム２２２９は、仮想ボリューム情報を登録したら、完了報告を保守プログラム２７３に送る（Ｓ１６０５）。保守プログラム２７３は、完了報告を受領する（Ｓ１６０６）。
【００７６】
次に、上記（ＴＭ２）に関わる処理を説明する。
【００７７】
上記（ＴＭ２）によれば、ユーザが指定するモジュール２００に対してのみ、仮想ボリューム作成が指示される。すなわち、図１０で言えば、Ｓ１６００が不要となる。そして、その後、他モジュール２００のポート２６１からその仮想ボリューム３０２へのパスが定義された契機で、他モジュール２００に、その仮想ボリューム３０２が作成される。以下、それに関わる処理を、図１１を用いて説明する。
【００７８】
ユーザが保守端末２７０からパス定義を指示すると、保守端末２７０の保守プログラム２７３や、各モジュール２００のパス定義プログラム２２２３が実行される。ユーザは、保守端末２７０に対して、例えば、使用するポート２６１のポート番号と、対象となる仮想ボリューム３０２のボリューム番号とを指定する。
【００７９】
保守プログラム２７３は、指定されたポート２６１を有するモジュール２００に、パス定義を指示し（Ｓ２００）、指示先のモジュール２００からの完了報告を待つ（Ｓ２０１）。パス定義の指示とともに、保守プログラム２７３は、モジュール２００に、使用するポート２６１のポート番号、及び、対象となる仮想ボリューム３０２のボリューム番号を通知する。
【００８０】
パス定義プログラム２２２３は、保守プログラム２７３からパス定義の指示を受領すると（Ｓ２０２）、仮想ボリュームテーブル２２１２に、対象となる仮想ボリューム（以下、図１１の説明において「対象仮想ボリューム」と言う）３０２の仮想ボリューム情報が登録済みか否かをチェックする（Ｓ２０３）。図１０を参照して説明したとおり、ユーザが指定したモジュール２００内の仮想ボリュームテーブル２２１２には、対象仮想ボリュームの仮想ボリューム情報が登録されている。対象仮想ボリュームの仮想ボリューム情報が登録済みであれば（Ｓ２０３でＹＥＳ）、Ｓ２０４はスキップされる。対象仮想ボリュームの仮想ボリューム情報が未登録であれば（Ｓ２０３でＮＯ）、パス定義プログラム２２２３は、仮想ボリュームテーブル２２１２に、その仮想ボリューム情報を登録する（Ｓ２０４）。ここで登録される仮想ボリューム情報の内容は、図１０のＳ１６０４で登録される内容と実質的に同じである。
【００８１】
次に、パス定義プログラム２２２３は、パス情報テーブル２２１１に、指定されたポート２６１のポート番号と、指定されたボリューム番号と、このプログラム２２２３が実行されているモジュール（図１１の説明において便宜上「自モジュール」と言う）２００のモジュール番号とを登録する（Ｓ２０５）。そして、パス定義プログラム２２２３は、保守プログラム２７３に、完了を報告する（Ｓ２０６）。
【００８２】
保守プログラム２７３は、パス定義プログラム２２２３から完了報告を受領し（Ｓ２０７）、処理を終了する（Ｓ２０８）。
【００８３】
なお、パス定義時に仮想ボリューム３０２を作成する場合、既に、他モジュール２００で、その仮想ボリューム３０２に対してＩ／Ｏ処理が行われている可能性がある。このため、他モジュール２００で、その仮想ボリューム３０２にページ３０１が割当てられている可能性がある。従って、この時点で、自モジュール２００が、他モジュール２００に、仮想ボリューム３０２へのページ割当状況を問い合わせ、問い合わせ結果を、自モジュール２００の仮想ボリュームテーブル２２１２に登録してもよい。新たに定義されたパスを介してＩ／Ｏ要求を受領した時点で、自モジュール２００が、他モジュール２００に、Ｉ／Ｏ要求に従うＩ／Ｏ対象の仮想領域についてページ割当状況を問い合わせることができる。
【００８４】
以上のようにして、各モジュール２００に仮想ボリューム３０２を作成することができる。
【００８５】
以降、図１２から図１５を用いて、仮想ボリューム３０２へのＩ／Ｏ処理の一例を説明する。ちなみに、図１２は、Ｉ／Ｏ対象の仮想領域に、Ｉ／Ｏ要求を受領したモジュール（自モジュール）２００内のページ３０１が割当てられている場合の、Ｉ／Ｏ処理の一例を示している。図１３は、リード対象の仮想領域に自モジュール２００内のページ３０１が割り当てられていない場合のリード処理の一例を示している。図１４は、ライト対象の仮想領域に自モジュール２００内のページ３０１が割り当てられていない場合のライト処理の一例を示している。図１５は、仮想ボリューム３０２にページ３０１を割当てる処理の一例を示している。
【００８６】
図１２を用いて、自モジュール２００内のページが割当済みの仮想領域がＩ／Ｏ対象の仮想領域である場合のＩ／Ｏ処理を説明する。このＩ／Ｏ処理は、リードプログラム２２２１又はライトプログラム２２２２が実行されることで実現される。以下、Ｉ／Ｏ処理としてライト処理を例に採り説明する。
【００８７】
ホスト１００が、モジュール２００に対してライト要求を発行し（Ｓ５００）、モジュール２００からのライト完了報告を待つ（Ｓ５０１）。
【００８８】
ライトプログラム２２２２は、ライト要求を受領すると（Ｓ５０２）、自モジュール２００内の仮想ボリュームテーブル３３１２をチェックし（Ｓ５０４）、ライト対象の仮想領域に自モジュール２００内のページ３０１が割当済みか否かを判定する（Ｓ５０４）。図１２の例は、自モジュール２００内のページ３０１がライト対象の仮想領域に割り当てられている場合のライト処理の例である。このため、Ｓ５０４の判定は、「Ｙｅｓ」になるものとする。Ｓ５０４の判定が「Ｎｏ」の場合の処理は、図１３及び図１４を用いて説明する。
【００８９】
次に、ライトプログラム２２２２は、ページテーブル２２１４を参照し、ライトデータを書き込むプール３００のアドレスを決定する（すなわち、ライト対象の仮想領域に割当済みのページ３０１を特定する）（Ｓ５０５）。ライトプログラム２２２２は、決定したアドレス（ページ３０１）にライトデータを書き込み（Ｓ５０６）、ホスト１００に完了を報告する（Ｓ５０７）。
【００９０】
ホスト１００は、ライトプログラム２２２２からの完了報告を受領すると（Ｓ５０８）、処理を終了する（Ｓ５０９）。
【００９１】
上の説明では、ライト処理を例に説明したが、リード処理の場合は、例えば以下のようになる。すなわち、Ｓ５０２で、リード要求が受領され、Ｓ５０６で、割当済みページ３０１からリードデータが読み出され、ホスト１００へそのリードデータが転送される。
【００９２】
次に、図１３を用いて、リード要求に従うリード対象の仮想領域に自モジュール（リード要求を受領したモジュール）２００内のページ３０１が未割当てのケースでのリード処理を説明する。このケースでは、他モジュール２００内のページ３０１が、その他モジュール２００内の仮想ボリューム３０２におけるリード対象仮想領域に割り当てられている可能性がある。以下、自モジュール２００をモジュール（１）とし、他モジュール２００をモジュール（２）として、このケースでのリード処理を説明する。なお、リード処理は、モジュール（１）及びモジュール（２）のそれぞれにおいてリードプログラム２２２１が実行されることで実現される。
【００９３】
ステップＳ５０４の判定が「Ｎｏ」となると、リードプログラム（１）は、仮想ボリュームテーブル（１）を参照し、リード対象仮想領域に対応する割当モジュールが不明であるか否かを判定する（Ｓ３０１）。リード対象仮想領域について、「ページ割当状態」の値が“済み”であり、「割当モジュール」の値が他モジュールのモジュール番号であれば、割当モジュールが判明しているということである。一方、リード対象仮想領域について、「ページ割当状態」の値が“未”であり、「割当モジュール」の値が未割当を意味する値“−”であれば、割当モジュールが不明であるということである。
【００９４】
割当モジュールが判明している場合（Ｓ３０２でＮｏ）、リードプログラム（１）は、割当モジュールであるモジュール（２）に、リード対象仮想領域のリードを依頼する（例えばリード対象仮想領域のアドレスを通知する）（Ｓ３０２）。データの転送依頼を受領したリードプログラム（２）は、リード対象仮想領域に割り当てられているページ３０１を、仮想ボリュームテーブル（２）を参照することにより特定し、特定されたページ３０１からリードデータを読み出しキャッシュ部２２３に格納する（Ｓ３０３）。リードプログラム（２）は、モジュール（１）にデータ転送を指示する（Ｓ３０４）。このとき、リードプログラム（２）は、モジュール（１）に、リードデータのキャッシュアドレスを通知する。リードプログラム（１）は、データ転送指示を受領すると、モジュール（２）からデータを転送する（通知されたキャッシュアドレスが示すキャッシュ領域からリードデータを読み出す）（Ｓ３０５）。続けて、リードプログラム（１）は、読み出されたリードデータを、ホスト１００へ転送する（Ｓ３０６）。
【００９５】
一方、割当モジュールが不明の場合（Ｓ３０１でＹｅｓ）、リードプログラム（１）は、ページ割当状況が問い合わせされていないモジュール２００が存在するか否かを判定する（Ｓ３０７）。問い合わせされていないモジュール２００が存在する場合、リードプログラム（１）は、当該モジュール２００にページ３０１の割当状況を問い合わせる（Ｓ３０８）。
【００９６】
ページ３０１の割当状況の問い合わせを受けたモジュール（２）のリードプログラム（２）は、仮想ボリュームテーブル（２）を参照し、ページ割当状況をチェックし（Ｓ３０９）、リード対象仮想領域にモジュール（２）内のページ３０１を割当済みか否か判定する（Ｓ３１０）。リードプログラム（２）は、ページ３０１を未割当の場合は（Ｓ３１０でＮｏ）、未割当であることをモジュール（１）へ通知する（Ｓ３１１）。一方、ページ３０１を割当済みの場合は（Ｓ３１０でＹｅｓ）、リードプログラム（２）は、リードデータをキャッシュ部２２３に格納し（Ｓ３１２）、モジュール（１）にそのリードデータの転送を指示する（Ｓ３１３）。
【００９７】
リードプログラム（１）は、モジュール（２）からの応答を受領すると、モジュール（２）でページ割当済みであるか否かを判定する（Ｓ３１４）。モジュール（２）内のページ３０１がリード対象仮想領域に未割当である場合（Ｓ３１４でＮｏ）、リードプログラム（１）は、別のモジュール２００についてＳ３０７を実行する。一方、モジュール（２）内のページ３０１がリード対象仮想領域に割り当て済みである場合、リードプログラム（１）は、モジュール（２）からモジュール（１）へリードデータを転送し（Ｓ３１５）、モジュール（１）の仮想ボリュームテーブル２２１２を更新する（Ｓ３１６）。具体的には、リードプログラム（１）は、リード対象仮想領域について、「ページ割当状況」の値を“済み”に変更し、「割当モジュール」の値として“モジュール（２）”を登録する。
【００９８】
次に、リードプログラム（１）は、モジュール（２）から転送したリードデータを、ホスト１００へ転送し（Ｓ３１７）、処理を終了する。
【００９９】
ページ割当済みのモジュール２００が判明しないまま、問い合わせ未実施のモジュール２００がなくなった場合（Ｓ３０７でＮｏ）、すなわち、リード対象仮想領域が、どのモジュール２００内のページ３０１が割当られていない仮想領域の場合、以下の処理が行われる。
【０１００】
この場合、リードプログラム（１）は、ホスト１００へ、リード対象仮想領域にデータが存在しないことを意味するデータ、例えば“０”で構成されたデータを転送し（Ｓ３１８）、処理を終了する。なお、Ｓ３１８では、“０”で構成されたデータに代えて、エラーが転送されても良い。
【０１０１】
次に、図１４及び図１５を用いて、ライト要求に従うライト対象の仮想領域に自モジュール（ライト要求を受領したモジュール）２００内のページ３０１が割当てられていないケースでのライト処理を説明する。以下、自モジュール２００をモジュール（１）とし、他モジュール２００をモジュール（２）として説明する。
【０１０２】
ライト処理は、モジュール（１）及びモジュール（２）でライトプログラム２２２２及びページ割当プログラム２２２５が実行されることで実現される。
【０１０３】
ステップＳ５０４の判定が「Ｎｏ」となると、ライトプログラム（１）は、仮想ボリュームテーブル（１）を参照し、ライト対象仮想領域について割当モジュールが不明であるか否かを判定する（Ｓ１００１）。なお、不明の定義は、図１３を参照して説明したリード処理の場合と同じである。
【０１０４】
割当モジュールが判明している場合（Ｓ１００１でＹｅｓ）、ライトデータが他モジュール（２）に転送され格納される（Ｓ１００２）。すなわち、Ｓ１００２では、図４のＳ１０７からＳ１１５が行われる。
【０１０５】
割当モジュールが不明の場合（Ｓ１００１でＮｏ）、ライトプログラム（１）は、ライト対象仮想領域についてページ割当状況が問い合わせされていないモジュール２００が存在するか否かを判定する（Ｓ１００３）。問い合わせされていないモジュール２００が存在する場合、ライトプログラム（１）は、問い合わせされていない他モジュール２００にページ割当状況を問い合わせる（Ｓ１００４）。
【０１０６】
ページ割当状況の問い合わせを受けたモジュール（２）のライトプログラム（２）は、仮想ボリュームテーブル（２）を参照してページ割当状況をチェックし（Ｓ１００５）、ライト対象仮想領域にモジュール（２）内のページ３０１が割当済みか否かを判定する（Ｓ１００６）。ページ３０１が未割当の場合は（Ｓ１００６でＮｏ）、ライトプログラム（２）は、未割当であることをモジュール（１）へ通知する（Ｓ１００７）。一方、ページ３０１が割当済みの場合は（Ｓ１００６でＹｅｓ）、ライトプログラム（２）は、割当済みであることをモジュール（１）へ通知する（Ｓ１００８）。
【０１０７】
ライトプログラム（１）は、モジュール（２）からの応答を受領すると、モジュール（２）でページ割当済みであったか否かを判定する（Ｓ１００９）。モジュール（２）でページ未割当であった場合（Ｓ１００９でＮｏ）、ライトプログラム（１）は、別のモジュール２００についてＳ１００３を実行する。一方、モジュール（２）でページ割当済みであった場合（Ｓ１００９でＹｅｓ）、ライトプログラム（１）は、仮想ボリュームテーブル（１）を更新する（Ｓ１０１０）。その後、ライトデータが他モジュール（２）に転送され格納される（Ｓ１０１１）。すなわち、図４のステップＳ１０４からＳ１１５が実行される。なお、ステップＳ１００２と異なり、ステップＳ１０４からＳ１０６も実行する理由は、ステップＳ１０１２で新規にページ３０１を割当てた場合が考慮されるからである。具体的には、ステップＳ１０１２でモジュール（１）内のページ３０１が割り当てられた場合、ライトプログラム（１）が自モジュール（１）内のページ３０１へライトデータを書き込む必要があるためである。また、ステップＳ１０１０における仮想ボリュームテーブル２２１２の更新は、リード処理の場合と同様に、ライト対象仮想領域について、仮想ボリュームテーブル２２１２の「ページ割当状況」の値が“済み”に更新され、「割当モジュール」の値として“モジュール（２）”が登録される。
【０１０８】
ページ割当済みのモジュール２００が判明しないまま、問い合わせ未実施のモジュール２００がなくなった場合（Ｓ１００３でＮｏ）、ライトプログラム（１）は、ページ割当プログラム（１）を起動し、ページ割当処理を実施する（ステップＳ１０１２）。次に、ライトプログラム（１）は、ページ割当が完了したか否かを判定する（Ｓ１０１３）。判定の結果、新しくページ３０１が割当てられた場合（Ｓ１０１３でＹｅｓ）、ライトプログラム（１）は、割当てられたページ３０１にライトデータを格納する（Ｓ１０１１）。一方、モジュール（１）内のプール３００の空き容量不足（未割当てのページ３０１が不足している）などが原因で、ページ３０１が割当られなかった場合（Ｓ１０１３でＮｏ）、ライトプログラム（１）は、異常終了をホスト１００へ報告し（Ｓ１０１４）、処理を終了する。
【０１０９】
図１５を用いて、ステップＳ１０１２（ページ割当処理）を詳細に説明する。
【０１１０】
ページ割当プログラム（１）は、プールテーブル（１）及びページテーブル（１）を参照し、未割当ページを探す（Ｓ４００）。そして、ページ割当プログラム（１）は、モジュール（１）内のプール３００に未割当ページが存在するか否かを判定する（Ｓ４０１）。
【０１１１】
モジュール（１）内に未割当ページが存在する場合（Ｓ４０１でＹｅｓ）、ページ割当プログラム（１）は、ページテーブル（１）及び仮想ボリュームテーブル（１）を更新し（Ｓ４０２及びＳ４０３）、処理を終了する（Ｓ４０４）。具体的には、ページ割当プログラム（１）は、割り当てるページ３０１について、ページテーブル（１）の「状態」の値を“割当済み”に変更し、「割当先」の値を対象仮想ボリュームの仮想ボリューム番号に変更する。また、ページ割当プログラム（１）は、ライト対象仮想領域について、仮想ボリュームテーブル２２１２の「ページ割当状態」の値を“済み”に変更し、「割当モジュール」の値として“モジュール（１）”を登録し、「プール番号」の値として、割り当てたページ３０１が属するプール３００のプール番号を登録し、「ページ番号」の値として、割り当てたページ３０１のページ番号を登録する。
【０１１２】
一方、モジュール（１）内に未割当ページが存在しない場合（Ｓ４０１でＮｏ）、ページ割当プログラム（１）は、未割当ページの有無が問い合わせされていないモジュール２００が存在するか否かを判定する（Ｓ４０５）。問い合わせされていないモジュール２００が存在する場合、ページ割当プログラム（１）は、当該モジュール２００に未割当ページの有無を問い合わせる（Ｓ４０７）。
【０１１３】
問い合わせを受ける他モジュール（２）のページ割当プログラム（２）は、未割当ページの有無の問い合わせを受領し（Ｓ４０８）、プールテーブル（２）及びページテーブル（２）を参照し、未割当ページを探し、モジュール（２）内のプール３００に未割当ページが存在するか否かを判定する（Ｓ４０９）。
【０１１４】
未割当ページが存在する場合（Ｓ４０９でＹｅｓ）、ページ割当プログラム（２）は、ページテーブル（２）を更新する（具体的には、割り当てるページについて、ページテーブル（２）の「状態」の値を“割当済み”に変更する）（Ｓ４１０）。
【０１１５】
次に、ページ割当プログラム（２）は、モジュール（２）でページ割当先の仮想ボリューム３０２が作成されているか否かを判定する（Ｓ４１１）。この判定の結果は、ページ割当先の仮想ボリューム３０２に関する仮想ボリューム情報が仮想ボリュームテーブル（２）に存在する場合は、作成済みとの判定結果であり、その情報が存在しない場合は、未作成との判定結果である。ユーザがボリューム３０２を作成する契機で全モジュール２００に仮想ボリューム３０２が作成されるケース（前述の（ＴＭ１）のケース）では、モジュール（２）で仮想ボリューム３０２が作成されている。さらに、パス定義契機で仮想ボリューム３０２が作成されるケース（前述の（ＴＭ２）のケース）では、モジュール（２）に当該仮想ボリューム３０２へのパスが定義されていれば仮想ボリューム３０２が作成済みである。
【０１１６】
仮想ボリューム３０２が作成済みの場合は（Ｓ４１１でＹｅｓ）、ページ割当プログラム（２）は、仮想ボリュームテーブル（２）を更新する（Ｓ４１２）。具体的には、ライト対象仮想領域について、仮想ボリュームテーブル（２）の「ページ割当状態」の値が“割当済み”に更新され、「割当モジュール」の値として“モジュール（２）”が登録され、「プール番号」の値として、ライト対象仮想領域に割り当てられたページ３０１が属するプール３００のプール番号が登録され、「ページ番号」の値として、そのページ３０１のページ番号が登録される。一方、仮想ボリューム３０２が未作成の場合は（Ｓ４１１でＮｏ）、Ｓ４１２がスキップされる。ページ割当プログラム（２）は、未割当ページが存在することをモジュール（１）に報告する（Ｓ４１３）。
【０１１７】
上記のように仮想ボリュームテーブル（２）を更新しておくことで、モジュール（２）が、そのページ３０１の割当先の仮想領域をＩ／Ｏ対象とするＩ／Ｏ要求をホスト１００から受領した場合に、モジュール（１）と通信することなく、その仮想領域についてのページ割当状況を判断できる。
【０１１８】
さて、Ｓ４０９で、未割当ページが存在しない場合には（Ｓ４０９でＮｏ）、ページ割当プログラム（２）は、未割当ページが存在しないことをモジュール（１）に報告する（Ｓ４１４）。
【０１１９】
モジュール（２）からの報告を受領したモジュール（１）のページ割当プログラム（１）は、モジュール（２）に未割当ページが存在するか否かを判定する（Ｓ４１５）。
【０１２０】
モジュール（２）に未割当ページが存在する場合（Ｓ４１５でＹｅｓ）、ページ割当プログラム（１）は、仮想ボリュームテーブル（１）を更新し（Ｓ４１６）、処理を終了する（Ｓ４１７）。具体的には、ライト対象領域について、仮想ボリュームテーブル（１）の「ページ割当状態」の値が“割当済み”に変更され、「割当モジュール」の値として“モジュール（２）”が登録される。逆に、モジュール（２）に未割当ページが存在しない場合（Ｓ４１５でＮｏ）、ページ割当プログラム（１）は、別のモジュール２００についてＳ４０５を実行する。
【０１２１】
未割当ページを有するモジュール２００が判明しないまま、問い合わせ未実施のモジュール２００がなくなった場合（Ｓ４０５でＮｏ）、ページ割当プログラム（１）は、ページ割当プログラム（１）をコールしたライトプログラム（１）に割当不可を報告する（Ｓ４０６）。
【０１２２】
以上のようにして、自モジュール２００内のページ３０１が割り当てられていない仮想領域に対するライトやリードの処理が実現できる。
【０１２３】
以上の説明によれば、モジュール（１）が有する仮想ボリューム（１）に割り当てられているボリューム番号と同一のボリューム番号が割り当てられた仮想ボリューム（２）が、モジュール（２）に備えられる。モジュール（２）が、ページ未割当ての仮想領域をライト対象仮想領域とするライト要求をホスト１００から受領した場合、モジュール（２）内のページをライト対象仮想領域に割り当て、そのページにライトデータを書き込む。また、その仮想領域をリード対象仮想領域とするリード要求をモジュール（２）がホスト１００から受領した場合、モジュール（２）は、モジュール（２）内のページからリードデータを読み出してホスト１００に転送する。従って、このようなケースで、モジュール間通信が発生しない。
【実施例２】
【０１２４】
以下、本発明の実施例２を説明する。その際、実施例１との相違点を主に説明し、実施例１との共通点については説明を省略或いは簡略する。
【０１２５】
実施例１では、例えば、自モジュール（２）が受領したリード要求に従うリード対象仮想領域に、他モジュール（１）内のページ３０１が割り当てられている場合には、モジュール間通信が発生する。
【０１２６】
そこで、実施例２では、ページ３０１に記憶されているデータがモジュール間で複製されることで、モジュール間通信が発生するケースを減らすことができる。具体的には、例えば、モジュール（１）内のページ３０１に記憶されているデータであって、モジュール（２）内のページ３０１に記憶されていないデータが、モジュール（１）内のページからモジュール（２）内のページに複製される。この場合、モジュール（１）内のページが複製元のページであり、モジュール（２）のページが、複製先のページである。
【０１２７】
より具体的には、例えば図１６に示すように、仮想ボリューム（１）の第一の仮想領域６１１に割り当てられているページ７１１に記憶されているデータは、モジュール（２）内には存在しない。この実施例２では、そのページ７１１に記憶されているデータが、矢印７２０に示すように、モジュール（２）内の未割当てのページ７２１に複製される。ページ７２１は、仮想ボリューム（２）の第一の仮想領域６２１に割り当てられる。これにより、モジュール（２）は、矢印６３０に示すように、第一の仮想領域６２１がリード対象領域であるリード要求を受領した場合、モジュール（２）内のページ７２１からリードデータを読出しホスト１００に転送することができる。つまり、モジュール間通信の発生が生じない。以下、ページに記憶されているデータがモジュール間で複製されることを、「ページ複製」と言う。また、複製されたデータを「複製データ」と言い、複製データが格納されているページを「複製ページ」と言う。
【０１２８】
図１７は、実施例２での仮想ボリュームテーブルの一例を説明する。
【０１２９】
仮想ボリュームテーブル２２１２１によれば、仮想ボリューム番号、アドレス、ページ割当状態、割当モジュール、プール番号及びページ番号の他に、仮想領域毎に、複製有無ビット、複製モジュール及びリード頻度が登録される。「複製有無ビット」は、対象仮想領域に割り当てられているページ（対象仮想領域に対応する「プール番号」の値及び「ページ番号」の値から特定されるページ）３０１に記憶されているデータが他モジュール２００に複製されているか否かを示す。「複製モジュール」は、そのページ３０１に記憶されているデータの複製を有するモジュール２００のモジュール番号である。「リード頻度」は、そのページ３０１へのホスト１００からのリード要求の頻度（単位時間当たりのリード要求の受領回数）を示している。
【０１３０】
図１７に示すテーブルが、モジュール（１）内の仮想ボリュームテーブルであるとすると、図１７に示すテーブルから、以下のことがわかる。例えば、アドレス“０〜９９”に対応する仮想領域には、最初にモジュール（２）内のページが割り当てられ、その後、モジュール（２）からモジュール（１）に対してページ複製が行われたことがわかる。さらに、アドレス“０〜９９”に対応する仮想領域に対応したリード頻度は、毎秒１０００回であることがわかる。なお、図１７に示すテーブルにおける「リード頻度」の値は、例えば、リードプログラム（１）によって更新される。リードプログラム（１）は、第一の仮想領域毎に、単位時間当りのリード要求の受領回数をカウントし、適時に、各第一の仮想領域に対応した「リード頻度」の値を更新することができる。
【０１３１】
リード頻度が追加される利点を説明する。例えば、図１６に示したように、仮想ボリューム（１）における第一の仮想領域６１１に、モジュール（１）内のページ７１１が割り当てられており、仮想ボリューム（２）における第一の仮想領域６２１に、ページ７１１に記憶されているデータの複製が記憶された、モジュール（２）内のページ７２１が、割り当てられているとする。ここで、ページ７１１に記憶されているデータが更新されたにも関わらず、ページ７２１に記憶されているデータが更新されないと、ページ７２１に記憶されているデータは古い内容のデータとなる。このため、第一の仮想領域をリード対象仮想領域とするリード要求をモジュール（２）が受領すると、古いデータがホスト１００に転送されてしまう。これを防ぐためには、第一の仮想領域６１１及び６２１に対応付けられるデータを常に同期させる必要がある。しかし、そうすると、仮想領域に属するデータ更新時に、仮想領域６１１及び６２１の両方を更新するなどの処理が必要となりモジュール間通信が発生することになる。そこで、図１７に示すように、仮想領域毎にリード頻度が登録されていれば、例えば、リード頻度が高い仮想領域に割り当てられているページについてのみページ複製が行われるようにすることができる。
【０１３２】
なお、リード頻度が高いとは、基準値よりもリード頻度が高いことである。ここで、「基準値」とは、予め定められた値であっても良いし、ライト頻度に基づく値であっても良い。各仮想領域についてのライト頻度とは、その仮想領域が対象とされたライト要求の単位時間当りの受領回数である。例えば、一つの仮想領域について、ライト頻度よりもリード頻度が高い場合、或いは、ライト頻度に所定の係数が乗算された値よりもリード頻度が高い場合に、「リード頻度が高い」とされても良い。ライト頻度は、例えばリード頻度と同様に、仮想ボリュームテーブル２２１２１に登録されても良い。
【０１３３】
以下、ページ複製を実行する契機及び条件と、複製ページを削除する契機及び条件と、ライト処理とを説明する。ライト処理は、古いデータを参照しないように制御する方法について詳細に述べる。
【０１３４】
まず、ページ複製を実行する契機として、（ａ）パス定義する契機、（ｂ）Ｉ／Ｏ処理の契機、などが考えられる。Ｉ／Ｏ処理の契機では、以下の（ｂ１）及び（ｂ２）のケース、
（ｂ１）他モジュール２００内のページ３０１に対してＩ／Ｏが発生する時に、他モジュール２００から自モジュール２００にページ複製を行うケース、
（ｂ２）自モジュール２００内のページ３０１に対してＩ／Ｏが発生する時に、自モジュール２００から他モジュール２００にページ複製を行うケース、
が考えられる。また、保守操作契機でページ複製が実行されるケースや、ストレージシステムが定期的にページ複製を行うケースなども考えられる。
【０１３５】
図１８を用いて、パス定義時に、モジュール（２）で割当済みのページ３０１に記憶されているデータを、パス定義を実施するモジュール（１）に複製するページ複製処理の一例を説明する。
【０１３６】
この処理は、以下のように実現される。例えば、モジュール（１）内でパス定義プログラム２２２３が実行される。モジュール（２）内で、複製作成プログラム２２２６が実行される。また、図１８での複製元ページに対応した複製ページを有する全てのモジュール内で、制御情報更新プログラム２２２８が実行される。
【０１３７】
例えば図１１に示したＳ２０５の直後に、パス定義プログラム２２２３は、複製元となり得るページ３０１を有するか否かが問い合わせされていないモジュール２００が存在するか否かを判定する（Ｓ６００）。全モジュール２００に問い合わせがされた場合（Ｓ６００でＮｏ）、処理を終了する（Ｓ６１５）。
【０１３８】
問い合わせされていないモジュール２００が存在する場合（Ｓ６００でＹｅｓ）、パス定義プログラム２２２３は、そのモジュール２００（モジュール（２））に、パス定義対象のボリュームへ割当てられているページ３０１であり、且つ、リード頻度が高い仮想領域に割り当てられているページ（高リード頻度ページ）３０１の有無を問い合わせる（Ｓ６０１）。なお、パス定義プログラム２２２３は、この問い合わせとともに、パス定義対象の仮想ボリューム３０２のボリューム番号をモジュール（２）へ通知する。
【０１３９】
複製作成プログラム２２２６は、問い合わせを受領し、仮想ボリュームテーブル（２）をチェックすることで、高リード頻度ページを探す（Ｓ６０２）。次に、複製作成プログラム２２２６は、複製元ページ３０１を決定し（例えばＳ６０２で探し出されたページを複製元ページ３０１に決定し）、その複製元ページ３０１に記憶されているデータをキャッシュ部（２）に格納する（Ｓ６０３）。そして、複製作成プログラム２２２６は、そのデータのキャッシュアドレスと、複製元ページ３０１が割り当てられている仮想領域に対応した「割当モジュール」の値、「アドレス」の値、「複製モジュール」の値、及び「リード頻度」の値とを、モジュール（１）に通知し（Ｓ６０４）、処理を終了する（Ｓ６０５）。なお、複製元ページ３０１が存在しない場合、複製作成プログラム２２２６は、例えば、ステップＳ６０４で複製元ページ３０１が存在しないことをモジュール（１）へ通知する。
【０１４０】
モジュール（２）の報告を受領したモジュール（１）のパス定義プログラム２２２３は、モジュール（１）内に未割当ページ３０１が存在するか否かの判定を行う（Ｓ６０６）。モジュール（１）内に未割当ページ３０１が存在しない場合（Ｓ６０６でＮｏ）、パス定義プログラム２２２３は、処理を終了する（Ｓ６１５）。
【０１４１】
モジュール（１）内に未割当ページ３０１が存在する場合（Ｓ６０６でＹｅｓ）、パス定義プログラム２２２３は、モジュール（２）内の複製元ページ３０１からのデータ転送（つまりページ複製）が全て完了したか否かの判定を行う（Ｓ６０７）。そして、全ての複製元ページ３０１に記憶されているデータがモジュール（１）へ転送された場合（Ｓ６０７でＹｅｓ）、パス定義プログラム２２２３は、別のモジュール２００についてＳ６００を行う。
【０１４２】
一方、モジュール（２）内の複製元ページ３０１の一部のページ３０１からしかモジュール（１）へデータが転送されていない場合（Ｓ６０７でＮｏ）、パス定義プログラム２２２３は、モジュール（２）内の複製元ページ３０１のうちの一つのページ３０１からデータをモジュール（１）へ転送する（データを読み出す）（Ｓ６０８）。続けて、パス定義プログラム２２２３は、ページテーブル（１）及び仮想ボリュームテーブル（１）を更新することで（Ｓ６０９及びＳ６１０）、対象の仮想領域（モジュール（２）から通された「アドレス」の値に対応する仮想領域）に、未割当のページ（複製先ページ）３０１を割り当てる。具体的には、複製先ページについて、ページテーブル（１）における「状態」が“割当済み”に変更し、「割当先」の値を対象仮想ボリュームの仮想ボリューム番号に変更される。さらに、対象の仮想領域について、仮想ボリュームテーブル（１）における「ページ割当状態」の値が“済み”に変更され、「割当モジュール」の値が“モジュール（２）”に変更され、「プール番号」の値が上記選択されたページ３０１が属するプールのプール番号とされ、複製有無ビットが“ＯＮ”とされ、「複製モジュール」の値が“モジュール（１）”とされ、「リード頻度」の値が、モジュール（２）から通知されたリード頻度の値に変更される。
【０１４３】
次に、パス定義プログラム２２２３は、割当てた複製先ページ３０１に、モジュール（２）から転送された、複製元ページ３０１に記憶されているデータの複製（複製データ）を格納する（Ｓ６１１）。そして、パス定義プログラム２２２３は、図１８での複製元ページに対応した複製ページを有する全てのモジュール（モジュール（１）以外）に、複製先ページ３０１の割当先の仮想領域についてモジュール（１）が「複製モジュール」として追加されたこと（例えば、対象の仮想領域のアドレスと、モジュール（１）の番号）を通知する（Ｓ６１２）。
【０１４４】
パス定義プログラム２２２３は、Ｓ６０７からＳ６１２を繰り返し実行することで、他の複製元ページ３０１についてもページ複製を行う。
【０１４５】
ステップＳ６１２の通知を受領したモジュール２００内の制御情報更新プログラム２２２８は、そのモジュール２００内の仮想ボリュームテーブル２２１２１を更新し（Ｓ６１３）、処理を終了する（Ｓ６１４）。具体的には、通知されたアドレスから特定される仮想領域について、「複製モジュール」の値として“モジュール（１）”が追加される。従って、例えば、３以上のモジュール２００が存在する場合、一つの仮想領域に対応した「複製モジュール」の値として、複数個の値（モジュール番号）が登録されることがあり得る。
【０１４６】
以上のようにして、モジュール（１）にパスが定義された契機で、パス定義対象の仮想ボリューム３０２に対して、既にモジュール（２）で割当てられているページ３０１に記憶されているデータの複製を、モジュール（１）に作成することができる。さらに、対象の仮想領域について複製データを既に有する全てのモジュール２００に、モジュール（１）が「複製モジュール」として新たに加わったことが通知される。これにより、複製データを持つ各モジュール２００は、複製データがどこに作成されているかを把握することができる。この情報は、例えば、ライト処理時に各モジュール２００のページ３０１を同期させる処理で利用される（図２４及び図２５を用いて後述する）。
【０１４７】
次に、図１９及び図２０を用いて、他モジュールのページ３０１にＩ／Ｏが発生する時に、他モジュールから自モジュールにページ複製を行う処理の一例を説明する。この処理は、モジュールを跨ぐＩ／Ｏが行われた際に、Ｉ／Ｏ対象仮想領域に割り当てられたページに書き込まれるデータが、他モジュール内のそのページから自モジュール内のページに複製される。
【０１４８】
図１９は、ライト処理時のページ複製処理の一例であり、図２０は、リード処理時のページ複製処理の一例である。
【０１４９】
図１９に示す処理は、例えば以下のように実現される。モジュール（１）内でライトプログラム２２２２が実行される。モジュール（２）内で複製作成プログラム２２２６が実行される。図１９での複製元ページに対応した複製ページを有する全てのモジュール内で、制御情報更新プログラム２２２８が実行される。
【０１５０】
例えば図１４のＳ１０１１で、モジュール（１）がモジュール（２）内のページ３０１にライトデータを格納した後、モジュール（１）のライトプログラム２２２２は、モジュール（１）内に未割当ページ３０１が存在するか否かを判定する（Ｓ７００）。モジュール（１）内に未割当ページ３０１が存在しない場合、複製データを格納するページ３０１が存在しないため、処理が終了となる（Ｓ７１５）。
【０１５１】
モジュール（１）内に未割当ページ３０１が存在する場合、ライトプログラム２２２２は、ライト対象仮想領域に割り当てられているページにあるデータの複製を、モジュール（２）へ依頼する（Ｓ７０１）。
【０１５２】
複製依頼を受領したモジュール（２）の複製作成プログラム２２２６は、仮想ボリュームテーブル（２）を参照し、ライト対象仮想領域のリード頻度をチェックし（Ｓ７０２）、リード頻度が高いか否かを判定する（Ｓ７０３）。リード頻度が低い場合、複製作成プログラム２２２６は、モジュール（１）にリード頻度が低いことを通知し（Ｓ７０４）、処理を終了する。そして、モジュール（１）のライトプログラム２２２２は、リード頻度が低いという通知を受領し（Ｓ７０７でＮｏ）、処理を終了する（Ｓ７１５）。
【０１５３】
一方、ライト対象仮想領域のリード頻度が高い（以下、図１９において「高リード頻度仮想領域」と言う）場合（Ｓ７０３Ｙｅｓ）、複製作成プログラム２２２６は、高リード頻度仮想領域に割り当てられているページ内のデータをキャッシュ部（２）に格納する（Ｓ７０５）。そして、複製作成プログラム２２２６は、モジュール（１）に、そのデータのキャッシュアドレスと、複製元ページ３０１が割り当てられている仮想領域についての「割当モジュール」の値、「アドレス」の値、「複製モジュール」の値、及び、「リード頻度」の値とを通知し（Ｓ７０６）、処理を終了する。
【０１５４】
モジュール（２）の報告を受領したモジュール（１）のライトプログラム２２２２は、高リード頻度仮想領域に割り当てられている複製元ページに記憶されているデータを、モジュール（２）からモジュール（１）へ転送する（Ｓ７０８）。そして、ライトプログラム２２２２は、モジュール（１）内の未使用ページ３０１を割り当て、転送されたデータを、その割り当てたページ３０１に格納する（Ｓ７０９からＳ７１１）。次に、ライトプログラム２２２２は、図１９での複製元ページに対応した複製ページを有する全てのモジュール（モジュール（１）以外）に、複製先ページ３０１の割当先の仮想領域についてモジュール（１）が「複製モジュール」として追加されたこと（例えば、対象の仮想領域のアドレスと、モジュール（１）の番号）を通知し（Ｓ７１２）、処理を終了する（Ｓ７１５）。この通知を受領した各モジュール２００は、自モジュール内の仮想ボリュームテーブル２２１２１を更新し（Ｓ７１３）、処理を終了する（Ｓ７１４）。このＳ７０８からＳ７１４の処理内容は、図１８のＳ６０８からＳ６１４と同じである。
【０１５５】
なお、図１９に示したライト処理時のページ複製処理では、モジュール（２）が、仮想ボリュームテーブル（２）に格納されている、対象仮想領域のリード頻度の値に基づき、対象仮想領域に割り当てられているページ３０１を複製元とするか否かを決定した。しかし、ページ３０１の複製を要求するモジュール（１）が、仮想ボリュームテーブル（１）に格納されている、対象仮想領域のリード頻度の値に基づき、モジュール（２）内の、対象仮想領域に割り当てられているページ３０１を、複製元とするか否かを決定してもよい。さらに、モジュール（１）が、対象仮想領域について、モジュール（１）及び（２）の両方でのリード頻度の値に基づき、モジュール（２）内の、対象仮想領域に割り当てられているページ３０１を、複製元とするか否かを決定してもよい。
【０１５６】
モジュール２００を跨ぐリードの処理の時のページ複製処理について説明する。このページ複製処理は、ライト処理時のページ複製処理と同じ処理ステップによって実現できる。例えば、図１３に示したモジュール２００を跨ぐリード処理のＳ３１６とＳ３１７との間に、図１９に示した複製を作成するための処理（ステップＳ７００からＳ７１５）を追加することで実現できる。
【０１５７】
図２０を用いて、リード処理時の別のページ複製処理について説明する。リード処理は、ライト処理と異なり、データをホスト１００へ転送するため、他モジュール（２）から自モジュール（１）へリードデータを転送する必要がある。この転送を利用することで、リード処理時のページ複製処理を改善することができる。具体的には、例えば、リードデータが高リード頻度ページ３０１に記憶されている場合、他モジュール（２）から自モジュール（１）へリードデータのみを転送するのではなく、自モジュール（１）が、モジュール（１）内の空きページ３０１に、モジュール（２）からのリードデータを格納する。これにより、ページ複製処理で必要となるモジュール間通信の発生回数を削減することができる。
【０１５８】
図２０に示す処理は、例えば以下のように実現される。モジュール（１）及び（２）内で、リードプログラム２２２１が実行される。モジュール（２）内で、制御情報更新プログラム２２２８が実行される。
【０１５９】
さらに、この処理は、図１３に示したモジュール２００を跨ぐリードの処理の変更で実現できる。なお、Ｓ５０４の結果、「Ｙｅｓ」になるケースは、モジュール（１）でページ割当済みのため、複製の必要がない。よって、説明を省略する（図１３で説明済み）。ステップ３０１の結果、「Ｙｅｓ」になるケースは、以下に説明するページ複製処理を適用することができるが、Ｓ３０１の結果が「Ｎｏ」になる場合の処理と同等であるため省略する。
【０１６０】
リードプログラム（１）は、Ｓ５０４及びＳ３０１を実行することで、モジュール（２）がリードデータを有することを認識する。次に、リードプログラム（１）は、モジュール（２）に対してリード要求を発行する（Ｓ３０２）。
【０１６１】
モジュール（１）からリード要求を受領したモジュール（２）のリードプログラム（２）は、リードデータを記憶するページ３０１の割当先の仮想領域のリード頻度をチェックし、リード頻度が高いか否かを判定する（Ｓ７１６）。リード頻度が低い場合、モジュール（２）は、図１３を用いて説明した処理を実行する（Ｓ３０３、及び、Ｓ３０４）。
【０１６２】
一方、リード頻度が高い場合、リードプログラム（２）は、リード頻度が高い仮想領域に割り当てられているページ内の全データを読み出してキャッシュ部（２）に格納する（Ｓ７１７）。
【０１６３】
そして、リードプログラム（２）は、モジュール（１）にページ複製を指示し（Ｓ７１８）、処理を終了する。このとき、複製元ページ３０１内の転送データのキャッシュアドレスと、複製元ページ３０１の割当先の仮想領域に対応した「割当モジュール」の値、「アドレス」の値、「複製モジュール」の値、「リード頻度」の値とが、リードプログラム（２）からモジュール（１）に通知される。
【０１６４】
モジュール（２）から上記の通知を受領したモジュール（１）のリードプログラム（１）は、通知されたキャッシュアドレスが示すキャッシュ領域にあるデータを、モジュール（２）からモジュール（１）へ転送する（Ｓ７１９）。次に、リードプログラム（１）は、モジュール（２）からの通知がページ複製指示であるか否かを判定する（Ｓ７２０）。ページ複製指示でない場合（Ｓ７２０でＮｏ）、リードプログラム（１）は、モジュール（２）から転送されたリードデータをホスト１００へ転送し、処理を終了する（Ｓ７２４）。
【０１６５】
一方、通知がページ複製指示である場合（Ｓ７２０でＹｅｓ）、リードプログラム（１）は、モジュール（１）内に未割当ページ３０１が存在するか否かの判定を行う（Ｓ７２１）。モジュール（１）内に未割当ページ３０１が存在しない場合（Ｓ７２１でＮｏ）、Ｓ７２４が行われる。モジュール（１）内に未割当ページ３０１が存在する場合（Ｓ７２１でＹｅｓ）、リードプログラム（１）は、モジュール（１）内の未使用ページ３０１を割り当て、割り当てたページ３０１に、転送されたデータを格納する（Ｓ７２２）。次に、リードプログラム（１）は、図２０での複製元ページに対応した複製ページを有する全モジュール（モジュール（１）以外）に、モジュール（１）が「複製モジュール」に追加されたことを通知する。この通知を受領した各モジュール２００は、自モジュール２００内の仮想ボリュームテーブル２２１２１を更新し（「複製モジュール」の値として“モジュール（１）”を追加し）、処理を終了する（Ｓ７２３）。Ｓ７２２の処理は、図１９のＳ７０８からＳ７１１と同じである。さらに、Ｓ７２３の処理は、図１９のＳ７１２からＳ７１４と同じである。リードプログラム（１）は、Ｓ７２３を実行した後、ホスト１００へリードデータを転送し、処理を終了する（Ｓ７２４）。
【０１６６】
なお、ステップＳ３０１の結果が「Ｙｅｓ」になる場合は、ステップＳ３１２及びＳ３１３を、ステップＳ７１６からＳ７１８に変更し、ステップＳ３１５及びＳ３１６を、ステップＳ７１９からＳ７２４に変更することで、ページ複製処理を行うことができる。
【０１６７】
次に、図２１から図２３を用いて、自モジュール内のページ３０１にＩ／Ｏが発生する時に、Ｉ／Ｏ対象の仮想ボリューム３０２へのパスを有する他モジュールへ自モジュールからページ複製する処理の一例を説明する。
【０１６８】
この処理を実現するためには、自モジュール２００が、Ｉ／Ｏ対象の仮想ボリューム３０２へのパスを、どのモジュール２００が有しているかを認識できる必要がある。これは、例えば、図２１に示すパス情報テーブル２２１１１により実現できる。すなわち、実施例１におけるパス情報テーブル２２１１に、パス毎にパス定義済みモジュール番号が追加される。「パス定義済みモジュール番号」は、ボリューム番号によって識別される仮想ボリューム３０２へのパスを有するモジュール２００のモジュール番号である。ボリューム番号によって識別される仮想ボリューム３０２へのパスを複数のモジュール２００が有する場合、「パス定義済みモジュール番号」の値としては、複数個のモジュール２００のモジュール番号が格納される。
【０１６９】
図２２を用いて、パス定義時の各モジュール２００におけるパス情報テーブル２２１１１のパス定義時済みモジュール番号の更新処理について説明する。以下、その更新処理を、パス定義に用いるポート２６１を有するモジュール２００をモジュール（１）、既に対象仮想ボリューム３０２へのパスを有するモジュール２００をモジュール（２）として説明する。
【０１７０】
この処理は、保守端末２７０のＣＰＵ２７１が保守プログラム２７３を実行し、モジュール（１）及び（２）内でパス定義プログラム２２２３が実行されることで実現される。さらに、この処理は、図１１に示したパス定義処理の変形例とすることができる。
【０１７１】
保守プログラム２７３が、モジュール（１）に対してパス定義指示を発行する（Ｓ８００）。このとき、保守プログラム２７３は、モジュール（１）に、ユーザから指定されたポート２６１のポート番号、指定された仮想ボリューム３０２のボリューム番号に加え、そのボリューム番号の仮想ボリューム３０２へのパスを定義済みのモジュール２００のモジュール番号を通知する。
【０１７２】
パス定義指示を受領したモジュール（１）のパス定義プログラム２２２３は、図１１の処理と同じくステップＳ２０２から２０４を実行することで、必要に応じて仮想ボリュームテーブル２２１２１を更新する。
【０１７３】
次に、パス定義プログラム２２２３は、パス情報テーブル２２１１１に、指定されたポート２６１のポート番号、指定された仮想ボリューム３０２のボリューム番号、モジュール（１）のモジュール番号、及び、パス定義済みモジュール２００のモジュール番号を登録する（Ｓ８０１）。なお、パス定義済みモジュール２００のモジュール番号には、保守プログラム２７３から通知された値を登録する。
【０１７４】
パス情報テーブル２２１１１の更新後、パス定義プログラム２２２３は、保守端末２７０の保守プログラム２７３に完了を報告する（Ｓ２０６）。
【０１７５】
保守プログラム２７３は、すでにパス定義の対象仮想ボリューム３０２へのパスを有するモジュール（２）へ、モジュール（１）が新たにパス定義を実施したことを通知し（Ｓ８０２）、モジュール（２）からの完了報告を待つ（Ｓ８０３）。なお、このとき、保守プログラム２７３は、モジュール（２）にモジュール（１）のモジュール番号、及び、対象仮想ボリューム３０２のボリューム番号を渡す。
【０１７６】
ステップＳ８０２を実行するためには、例えば、保守プログラム２７３が、モジュール（２）が対象仮想ボリューム３０２へのパスを有することを認識できる必要がある。それは、たとえば、次のように実現できる。すなわち、保守プログラム２７３は、以前にモジュール（２）に対象仮想ボリューム３０２へのパス定義を指示している。この以前の指示内容を保守端末２７０のメモリ２７２に記憶しておくことで、保守プログラム２７３は、モジュール（２）が対象仮想ボリューム３０２へのパスを有することを認識できる。
【０１７７】
保守プログラム２７３からの通知を受領したモジュール（２）のパス定義プログラム２２２３は、パス情報テーブル２２１１１を更新する（Ｓ８０４）。具体的には、パス定義プログラム２２２３は、通知されたボリューム番号に対応する行の「パス定義済みモジュール番号」の値として、通知されたモジュール（１）のモジュール番号を追加する。パス情報テーブル２２１１１の更新後、パス定義プログラム２２２３は、保守端末２７０に完了を報告する（Ｓ８０５）。
【０１７８】
保守プログラム２７３は、モジュール（２）のパス定義プログラム２２２３から完了報告を受領し（Ｓ８０６）、処理を終了する（Ｓ８０７）。
【０１７９】
なお、図２２の例では、対象仮想ボリューム３０２へのパスを既に有するモジュール２００が、モジュール（２）のみとして説明したが、３以上のモジュール２００が存在する場合、保守プログラム２７３は、モジュール（２）以外の各モジュール２００に対しても、ステップＳ８０２からＳ８０７を実行する。
【０１８０】
以上により、対象仮想ボリューム３０２へのパスを有する全モジュール２００は、当該仮想ボリューム３０２へのパスを有するモジュール２００を認識することができる。
【０１８１】
図２３を用いて、Ｉ／Ｏ対象仮想ボリュームへのパスを有する他モジュールへのページ複製をＩ／Ｏ処理時に行う処理の一例を説明する。その際、ホスト１００からＩ／Ｏ要求を受領する自モジュール２００をモジュール（１）とし、新たに複製先となるモジュール２００をモジュール（２）とする。以下、Ｉ／Ｏ要求としてライト要求が受領されたものとする。
【０１８２】
図１２のステップＳ５０６を実行した後、ライトプログラム（１）は、仮想ボリュームテーブル（１）を参照し、ライト対象仮想領域のリード頻度をチェックし、リード頻度が高いか否かを判定する（Ｓ９００）。リード頻度が低い場合（Ｓ９００でＮｏ）、ライトプログラム（１）は、処理を終了する（Ｓ９０４）。
【０１８３】
一方、リード頻度が高い場合（Ｓ９００でＹｅｓ）、ライトプログラム（１）は、高リード頻度仮想領域について、ライト対象ボリュームへのパスを有しており、かつ、複製を持たないモジュール２００が存在するか否かを判定する（Ｓ９０１）。具体的には、ライトプログラム（１）は、パス情報テーブル（１）の「パス定義済みモジュール番号」、及び、仮想ボリュームテーブル（１）における高リード頻度仮想領域に対応した「複製モジュール」をチェックする。該当するモジュール２００が存在しない場合には（Ｓ９０１でＮｏ）、ライトプログラム（１）は、処理を終了する（Ｓ９０４）。ここで、「該当するモジュール」とは、仮想ボリュームテーブル（１）の「複製モジュール」の値に含まれず、かつ、パス情報テーブル（１）の「パス定義済みモジュール番号」の値に含まれるモジュールである。
【０１８４】
該当するモジュール２００（この例ではモジュール（２））が存在する場合（Ｓ９０１でＹｅｓ）、ライトプログラム（１）は、高リード頻度仮想領域へ割り当てられている複製元ページ３０１に記憶されているデータをキャッシュ部（１）に格納し（Ｓ９０２）、当該モジュール２００（モジュール（２））へ複製を依頼する（Ｓ９０３）。このとき、ライトプログラム（１）は、そのデータのキャッシュアドレスと、その高リード頻度仮想領域についての「割当モジュール」の値、「アドレス」の値、「複製モジュール」の値、及び「リード頻度」の値とを、モジュール（２）に通知する。
【０１８５】
ライトプログラム（１）は、更に別のモジュール２００へページ複製を行うために、Ｓ９０１からＳ９０３を繰り返し実行する。
【０１８６】
モジュール（２）の処理について説明する。モジュール（１）から複製指示を受領したモジュール（２）の複製作成プログラム２２２６は、モジュール（２）に未割当ページ３０１が存在するか否かを判定する（Ｓ９０５）。未割当ページ３０１が存在しない場合（Ｓ９０５でＮｏ）、処理を終了する（Ｓ９０８）。逆に、未割当ページ３０１が存在する場合（Ｓ９０５でＹｅｓ）、複製作成プログラム２２２６は、対象データをモジュール（１）（通知されたキャッシュアドレス）からモジュール（２）へ転送し、モジュール（２）内の未割当ページ３０１に格納する（Ｓ９０６）。この処理は、図１８のステップＳ６０８からＳ６１１と同じである。
【０１８７】
次に、複製作成プログラム２２２６は、対象仮想領域に割り当てられているページ３０１を有する全モジュール２００（モジュール（２）を除く、モジュール（１）を含む）に、新たにモジュール（２）が「複製モジュール」として追加されたことを通知する。この通知を受領した各モジュール２００は、そのモジュール２００内の仮想ボリュームテーブル２２１２１の「複製モジュール」の値として、“モジュール（２）”を追加する（Ｓ９０７）。この処理は、図１８のステップＳ６１２からＳ６１４と同じである。
【０１８８】
以上のようにして、ライト処理時に、ライトデータなどの対象データを他モジュール２００へ複製することができる。なお、説明では、ライト処理を例に説明したがリード処理の場合も同様に実現できる。
【０１８９】
ところで、或る仮想領域について、ライト要求を受領したモジュール２００のみでデータが更新されると、そのモジュール２００では更新後のデータがあり、他モジュール２００での複製データは、更新前のデータとなってしまう。つまり、データの内容が異なってしまう。この場合、他モジュール２００が上記或る仮想領域をリード対象領域とするリード要求をホスト１００から受領すると、更新前のデータがホスト１００へ転送されてしまう可能性がある。
【０１９０】
以下、このような不整合状態を回避するライト処理について説明する。具体的には、ライト時に複製ページを削除する方法と、ライト時に全複製データを更新する方法について説明する。その際、ライト要求を受領した自モジュール２００内に存在するデータをオリジナルのデータとし、そのデータと同じ内容のデータであって、他モジュール２００内に存在するデータを複製データとする。
【０１９１】
図２４を用いて、ライト処理時に自モジュール２００以外のモジュール２００が有する複製ページを削除する処理の一例を説明する。その際、自モジュール２００をモジュール（１）とし、複製ページを有する他モジュール２００をモジュール（２）として説明する。
【０１９２】
図２４に示す処理は、次のように実現される。例えば、モジュール（１）内でライトプログラム２２２２が実行される。モジュール（２）内で複製削除プログラム２２２７が実行される。
【０１９３】
さらに、この処理は、図１２及び図１４に示したライト処理の変形例である。具体的には、図１２の場合、ステップＳ５０４とＳ５０５の間に、図２４に示す複製を削除するための処理（ステップＳ１１００からＳ１１０７）を追加することができる。また、図１４の場合、ステップ１０１１（ステップＳ１０４からＳ１１５と同じ）内のＳ１１１とＳ１１２の間に、図２４に示す複製を削除するための処理（ステップＳ１１００からＳ１１０７）を追加することができる。なお、図２４には、図１２の処理に、複製を削除するための処理（ステップＳ１１００からＳ１１０７）を追加した全ステップを示している。
【０１９４】
ライトプログラム２２２２が、ライトデータがモジュール（１）にあることを認識する（Ｓ５００からＳ５０４）。
【０１９５】
次に、ライトプログラム２２２２は、仮想ボリュームテーブル（１）を参照することで、ライトデータに対応する複製データを有するモジュール２００が存在するか否かをチェックする（Ｓ１１００）。具体的には、ライトプログラム（１）が、ライト対象仮想領域に対応する「複製モジュール」を参照する。該当するモジュール２００が存在しない場合（Ｓ１１０でＮｏ）、ライトプログラム（１）は、ライト処理（Ｓ５０５からＳ５０９）を実行する。
【０１９６】
該当するモジュール２００（モジュール（２））が存在する場合（Ｓ１１００でＹｅｓ）、ライトプログラム（１）は、モジュール（２）に複製ページの削除を依頼する（Ｓ１１０１）。このとき、ライトプログラム（１）は、例えば、モジュール（２）に、ライト対象の仮想ボリュームのボリューム番号、及び、ライト対象仮想領域のアドレスを通知する。
【０１９７】
複製ページ３０１の削除依頼を受領したモジュール（２）の複製削除プログラム２２２７は、モジュール（２）内の複製ページ３０１を特定する（Ｓ１１０２）。具体的には、複製削除プログラム２２２７は、モジュール（１）から通知された仮想ボリューム番号及びアドレスを用いて仮想ボリュームテーブル（２）を参照する。
【０１９８】
次に、複製削除プログラム２２２７は、ページテーブル（２）及び仮想ボリュームテーブル（２）を更新することで、Ｓ１１０２で特定されたページ３０１の、仮想領域に対する割当てを解除する（そのページ３０１を解放する）（Ｓ１１０３、Ｓ１１０４）。具体的には、Ｓ１１０２で特定されたページ３０１について、ページテーブル（２）における「状態」の値が“未割当”に変更され、“割当先”の値が“−”に変更される。さらに、そのページ３０１の割当先の仮想領域について、仮想ボリュームテーブル（２）における「割当モジュール」の値が“モジュール（１）”に変更され、さらに、「複製モジュール」の値が“−”に変更される。このようにして、複製データが削除される。つまり、実施例２において、「複製ページの削除」とは、複製ページの割当てが解除されること（つまりそのページの「状態」が“割り当て済み”から“未割当”になること）である。
【０１９９】
複製ページの削除後、複製削除プログラム２２２７は、モジュール（１）へ完了を報告する（Ｓ１１０５）。
【０２００】
ライトプログラム（１）は、モジュール（２）から完了報告を受領すると（Ｓ１１０６）、仮想ボリュームテーブル（１）を更新する（Ｓ１１０７）。具体的には、仮想ボリュームテーブル（１）の「割当モジュール」の値が“モジュール（１）”に変更され、さらに、「複製モジュール」の値が“−”に変更される。
【０２０１】
続けて、ライトプログラム（１）は、更に別のモジュール２００が有する複製ページを削除するために、ステップＳ１１００からＳ１１０７を繰り返し実行する。
【０２０２】
以上のようにして、他モジュール２００が有する複製ページを削除することができる。
【０２０３】
次に、図２５を用いて、ライト処理時に全複製ページを更新する処理の一例を説明する。その際、自モジュール２００をモジュール（１）とし、複製データを有する他モジュール２００をモジュール（２）として説明する。
【０２０４】
図２５に示す処理は、モジュール（１）及び（２）内でライトプログラム２２２２が実行されることで実現される。
【０２０５】
さらに、この処理は、図１２及び図１４に示したライト処理の変形例である。具体的には、図１２の場合、ステップＳ５０４とＳ５０５の間に、図２５に示す他モジュール２００の複製を更新するための処理（ステップＳ１２００からＳ１２０４）を追加する。また、図１４の場合、ステップ１０１１（ステップＳ１０４からＳ１１５と同じ）内のＳ１１１とＳ１１２の間に、図２５に示す他モジュール２００の複製を更新するための処理（ステップＳ１２００からＳ１２０４）を追加する。なお、図２５には、図１２の処理に、他モジュール２００の複製を更新するための処理（ステップＳ１２００からＳ１２０４）を追加した全ステップを示している。
【０２０６】
ライトプログラム（１）が、ライトデータがモジュール（１）にあることを認識する（Ｓ５００からＳ５０４）。
【０２０７】
次に、ライトプログラム（１）は、仮想ボリュームテーブル（１）を参照することで、ライトデータの複製データを有するモジュール２００が存在するか否かをチェックする（Ｓ１２００）。具体的には、ライトプログラム（１）が、ライト対象仮想領域に対応する「複製モジュール」を参照する。該当するモジュール２００が存在しない場合（Ｓ１２００でＮｏ）、ライトプログラム（１）は、ライト処理を実行する（Ｓ５０５からＳ５０９）。
【０２０８】
該当するモジュール２００（モジュール（２））が存在する場合（Ｓ１２００でＹｅｓ）、ライトプログラム（１）は、ライトデータをキャッシュ部２２３に格納し（Ｓ１２０１）、モジュール（２）にライトデータの書込みを依頼する（Ｓ１２０２）。
【０２０９】
ライトデータの書込み依頼を受領したモジュール（２）のライトプログラム（２）は、モジュール（２）内の複製ページ３０１に、ライトデータを格納し、処理を終了する（Ｓ１２０３）。この処理は、図４のステップＳ１１０からＳ１１３と同じである。
【０２１０】
ライトプログラム（１）は、モジュール（２）から完了報告を受領すると（Ｓ１２０４）、更に別のモジュール２００が有する複製ページ３０１を更新するために、Ｓ１２００からＳ１２０４を繰り返し実行する。
【０２１１】
以上のようにして、他モジュール２００が有する複製ページ内のデータをライトデータの更新に伴って更新することができる。なお、複製ページの更新としては、例えば、第一と第二の更新方法のいずれが採用されても良い。第一の更新方法は、仮想領域に割り当て済みの複製ページに記憶されているデータに更新後の複製データが上書きされる方法である。第二の更新方法は、複製ページの割当先の仮想領域に、その複製ページに代えて、更新後の複製データが格納された新たな複製ページが割り当てられる方法である。
【０２１２】
以下、図２６から図２８を用いて、（１）ページ３０１の割当て時の複製ページ削除、（２）パス削除時の複製ページ削除、及び（３）時間による複製ページ削除について説明する。
【０２１３】
まず、図２６を用いて、ページ３０１の割当て時の複製ページ削除の処理の一例を説明する。ライト対象の仮想領域にページが未割当てのとき、その仮想領域に割り当て可能なページ３０１が存在しないことがあり得る。このとき、複製ページ３０１を削除することで、ライトデータを格納するためのページを確保することができる。以下の説明では、ホスト１００からライト要求を受領するモジュール２００をモジュール（１）とし、削除対象の複製ページを有するモジュール２００をモジュール（２）とする。
【０２１４】
図２６に示す処理は、例えば次のように実現される。すなわち、モジュール（１）内でページ割当プログラム２２２５が実行され、モジュール（２）内で制御情報更新プログラム２２２８が実行される。
【０２１５】
さらに、この処理は、図１５に示したページ割当処理の変更で実現できる。具体的には、図１５のステップＳ４０５の直前に、自モジュール２００内の複製ページ３０１を解放するための処理（Ｓ１３００からＳ１３０９）を追加する。
【０２１６】
新規にページ３０１を割当てる時、モジュール（１）のページ割当プログラム２２２５は、モジュール（１）内に未使用ページ３０１が存在するか否かを判断する（Ｓ４００、Ｓ４０１）。
【０２１７】
モジュール（１）内に未使用ページ３０１が存在しない場合（Ｓ４０１でＮｏ）、ページ割当プログラム２２２５は、モジュール（１）内に複製ページ３０１が存在するか否かを判定する（Ｓ１３００）。具体的には、仮想ボリュームテーブル２２１２１から、「複製有無ビット」の値が“ＯＮ”の行が検索される。なお、ライト対象ボリューム以外のボリュームも探索の対象である。つまり、ライト対象ボリューム以外の仮想ボリューム３０２に割当てられている複製ページも削除することもできる。探索の結果、複製ページ３０１が存在しない場合（Ｓ１３００でＮｏ）、図１５のＳ４０５からＳ４１６が実行され、処理が終了する（Ｓ１３０１）。
【０２１８】
一方、複製ページ３０１が存在する場合（Ｓ１３００でＹｅｓ）、ページ割当プログラム２２２５は、複製ページ３０１の「リード頻度」を参照し、「リード頻度」の値が最も低いページ３０１を決定する（Ｓ１３０２）。
【０２１９】
ページ割当プログラム２２２５は、ページテーブル（１）及び仮想ボリュームテーブル（１）を更新することで（Ｓ１３０３、Ｓ１３０４）、複製ページ３０１を解放する。具体的には、ページテーブル（１）において、複製ページ３０１の「状態」の値が“未割当”に変更され、「割当先」が“−”へ変更される。さらに、仮想ボリュームテーブル（１）において、複製ページ３０１が割当先である仮想領域に対応した「割当モジュール」及び「複製モジュール」の値から“モジュール（１）”が削除される。
【０２２０】
次に、ページ割当プログラム２２２５は、解放した複製ページ３０１に対応する複製ページを有する他モジュール２００（モジュール（２））が存在するか否かを判定する（Ｓ１３０５）。存在する場合（Ｓ１３０５でＹｅｓ）、ページ割当プログラム２２２５は、複製ページ３０１を解放したことを当該他モジュール２００に通知する（Ｓ１３０６）。当該他モジュールは、例えば、解放された複製ページが割り当てられていた仮想領域に対応する「複製モジュール」の値に対応したモジュールである。ページ割当プログラム２２２５は、Ｓ１３０６の際、モジュール（２）に、解放された複製ページが割り当てられていた仮想領域に対応した「アドレス」の値と、「仮想ボリューム番号」の値とを通知する。
【０２２１】
モジュール（１）から通知を受領したモジュール（２）内の制御情報更新プログラム２２２８は、仮想ボリュームテーブル（２）における、上記通知された「アドレス」及び「仮想ボリューム番号」に対応する「割当モジュール」及び「複製モジュール」の値として“モジュール（１）”を削除する（Ｓ１３０７）。その除後、制御情報更新プログラム２２２８は、モジュール（１）へ完了を報告する（Ｓ１３０８）。
【０２２２】
モジュール（１）のページ割当プログラム２２２５は、モジュール（２）からの完了報告を受領する（Ｓ１３０９）。そして、ページ割当プログラム２２２５は、Ｓ１３０５からＳ１３０９を繰り返し実行する。
【０２２３】
解放した複製ページ３０１に対応する複製ページを有する全てのモジュール２００への通知が完了すると、ページ割当プログラム２２２５は、Ｓ４０１へ戻り、ライト要求に対するページ割当処理を実行する（Ｓ４０２からＳ４０４）。複製ページ３０１が解放されたため、Ｓ４０１の判定は“Ｙｅｓ”になる。
【０２２４】
以上のように、複製ページ３０１を解放することで、ページ不足によるライト不可という状況を回避することができる。
【０２２５】
次に、図２７を用いて、パス削除時に複製ページを削除する処理の一例を説明する。
【０２２６】
仮想ボリュームへのパスを削除する場合、削除対象のパスが使用するポート２６１を有するモジュール２００は、ホスト１００からＩ／Ｏ要求を受領しなくなる。このため、このときに複製ページ削除を実行することは、効率的である。
【０２２７】
削除対象のパスが使用するポート２６１を有するモジュール２００をモジュール（１）、削除対象のパスの宛先となるボリュームへの別のパスを有するモジュール２００をモジュール（２）として説明する。
【０２２８】
図２７に示す処理は、例えば次のように実行される。モジュール（１）内でパス削除プログラム２２２４が実行される。モジュール（２）内で複製作製プログラム２２２６、パス削除プログラム２２２４、及び制御情報更新プログラム２２２８が実行される。なお、これらのモジュール（２）のプログラムはモジュール（１）からの通知を契機に実行される。
【０２２９】
まず、パス削除プログラム（１）は、パス削除の指示を受領する（Ｓ１４００）。なお、図示していないが、この指示は、保守端末２７０の保守プログラム２７３からの指示である。
【０２３０】
次に、パス削除プログラム（１）は、対象パスの宛先ボリュームへのパスを有し、かつ、モジュール（１）のパス削除を通知していない他モジュール２００が存在するか否かを判定する（Ｓ１４０１）。該当するモジュール２００が存在する場合、パス削除プログラム２２２４は、該当するモジュール２００へ、パス情報テーブル２２１１１の更新を通知する（Ｓ１４０２）。このとき、パス削除プログラム２２２４は、宛先ボリュームのボリューム番号を通知する。
【０２３１】
パス削除プログラム（１）からパス情報テーブル２２１１１の更新通知を受領したモジュール（２）のパス削除プログラム（２）は、パス情報テーブル２２１１１の宛先ボリュームのボリューム番号によって特定できるパス情報を更新する（Ｓ１４０３）。具体的には、「パス定義済みモジュール」の値として“モジュール（１）”が削除される。
【０２３２】
削除後、パス削除プログラム（２）は、モジュール（１）へ完了を報告する（Ｓ１４０４）。
【０２３３】
モジュール（１）のパス削除プログラム（１）は、モジュール（２）からの完了報告を受領する（Ｓ１４０５）。そして、パス削除プログラム（１）は、宛先ボリュームへのパスを有する更に別のモジュール２００へ、パス情報テーブル２２１１１の更新を通知するため、Ｓ１４０１からＳ１４０５を繰り返し実行する。
【０２３４】
宛先ボリュームへのパスを有する全てのモジュール２００へ、パス情報テーブル２２１１１の更新を通知すると、パス削除プログラム（１）は、Ｓ１４０６へ進む。Ｓ１４０６以降のステップは、モジュール（１）のみが有するページ３０１を、他モジュール２００へのページ３０１をコピーする処理、及び、モジュール（１）以外のモジュール２００へ複製済みのページ３０１をモジュール（１）で削除する処理である。パスが削除されると、モジュール（１）はホスト１００からＩ／Ｏを受領しない。このため、上記のように他モジュール２００へページ３０１をコピーするほうがモジュール２００を跨ぐＩ／Ｏの発生頻度が低くなる。
【０２３５】
パス削除プログラム（１）は、削除対象のパスの宛先ボリュームに対して割当られているページ３０１のうちで、モジュール（１）のみが有するページ３０１が存在するか否かを判定する（Ｓ１４０６）。この処理は、仮想ボリュームテーブル（１）において「複製有無ビット」の値が“ＯＦＦ”、且つ、「割当モジュール」の値が“モジュール（１）”である行を探すことで実現できる。モジュール（１）のみが有するページ３０１が存在する場合、パス削除プログラム（１）は、削除対象パスの宛先ボリュームへのパスを有する他モジュール２００が存在するか否かを判定する（Ｓ１４０７）。宛先ボリュームへのパスを有する他モジュール２００（モジュール（２））が存在する場合、パス削除プログラム（１）は、モジュール（１）のみが有するページ３０１内のデータをモジュール（２）へ複製する（Ｓ１４０８）。この処理は、図２３を用いて説明したＳ９０２からＳ９０８と同じである。続けて、パス削除プログラム（１）は、宛先ボリュームへ割当てられているページ３０１のうち、モジュール（１）以外のモジュールに複製ページが存在するページ３０１を、モジュール（１）から削除する（Ｓ１４０９）。この処理は、図２６を用いて説明したＳ１３０３からＳ１３０９と同じである。また、ステップＳ１４０６、及び、Ｓ１４０７の判定の結果が“Ｎｏ”の場合は、Ｓ１４０８がスキップされ、Ｓ１４０９が行われる。
【０２３６】
次に、パス削除プログラム（１）は、削除対象のパスの宛先ボリュームに割り当てられているページ３０１のうちで、モジュール（１）のみが有するページ３０１が存在するか否かを判定する（Ｓ１４１０）。この判定において、「“Ｙｅｓ”（存在する）」になるのは、Ｓ１４０７からＳ１４０９へ進んだ場合、及び、Ｓ１４０８でモジュール（１）のみが有する全てのページ３０１をモジュール（２）へ複製できなかった場合である。この場合、他モジュール２００が有するポート２６１を介してモジュール（１）内のデータがリード・ライトされる可能性があるため、仮想ボリュームテーブル（１）から対象ボリュームの情報を削除できない。よって、パス削除プログラム（１）は、Ｓ１４１１をスキップし、Ｓ１４１２へ進む。
【０２３７】
一方で、Ｓ１４１０の判定において、「“Ｎｏ”（存在しない）」となる場合、パス削除プログラム（１）は、仮想ボリュームテーブル（１）から宛先ボリュームの情報を削除し、Ｓ１４１２へ進む。
【０２３８】
パス削除プログラム（１）は、パス情報テーブル（１）から削除対象のパス情報を削除し、完了を報告する（Ｓ１４１３）。なお、完了の報告先は、保守端末２７０の保守プログラム２７３である。
【０２３９】
図２８を用いて、複製データが書込まれてから一定時間が経過した複製ページ３０１を削除する処理の一例を説明する。なお、この処理は、既に述べたライト時の複製ページ削除、新規ページ割当時の複製ページ削除、パス定義時の複製ページ削除と併用することも可能である。
【０２４０】
なお、図示しないが、この処理を実現するために、仮想ボリュームテーブル２２１２１に、ページ３０１を割当てた時刻（以後、ページ割当時刻）が記録される。また、以下、複製ページ３０１を削除せずに残しておく時間長を「複製時間長」と呼ぶ。以下、モジュール（１）での処理を例に採り説明するが、この処理は、各モジュールで複製削除プログラム２２２７により行われる。
【０２４１】
複製削除プログラム（１）は、ボリューム番号が“０”の仮想ボリュームの先頭仮想領域（本実施例では、アドレス「０」から「９９」）を処理対象とする（Ｓ１５００）。
【０２４２】
次に、複製削除プログラム（１）は、処理対象仮想領域がページ割当済みであるか否かを判定する（Ｓ１５０１）。ページ割当済みの場合、複製削除プログラム（１）は、モジュール（１）で割当てているページ３０１が他モジュール２００で割当てられたページ３０１の複製であるか否かを判定する（Ｓ１５０２）。これは、仮想ボリュームテーブル（１）を参照し、「複製モジュール」の値として“モジュール（１）”が存在するか否かによって判断することができる。
【０２４３】
Ｓ１５０１又はＳ１５０２の結果が“Ｎｏ”の場合、複製削除プログラム（１）は、現在の処理対象仮想領域が処理対象ボリュームの末尾であるか否かを判定する（Ｓ１５０６）。現在の処理対象領域がボリュームの末尾の場合、複製削除プログラム（１）は、次のボリューム（ボリューム番号が次のボリューム）の先頭仮想領域を次の処理対象とし（Ｓ１５０７）、Ｓ１５０１へ返る。一方、現在の処理対象仮想領域がボリュームの末尾でない場合、複製削除プログラム（１）は、同一ボリューム内の次の仮想領域を処理対象とし（Ｓ１５０８）、Ｓ１５０１へ返る。
【０２４４】
一方、Ｓ１５０１及びＳ１５０２が共に“Ｙｅｓ”の場合、複製削除プログラム（１）は、仮想ボリュームテーブル（１）から、処理対象仮想領域に対応する「ページ割当時刻」の値を得る（Ｓ１５０３）。次に、複製削除プログラム（１）は、（複製時間長＋ページ割当時刻）が現在時刻より大きいか否かを判定する（Ｓ１５０４）。（複製時間長＋ページ割当時刻）が現在時刻以上の場合、複製時間長を超過しているため、複製削除プログラム２２２７は、処理対象仮想領域に割り当てられている複製ページ３０１を削除する（Ｓ１５０５）。この削除処理は、図２６を用いて説明したＳ１３０３からＳ１３０９と同じである。一方、（複製時間長＋ページ割当時刻）が現在時刻よりも小さい場合、処理対象仮想領域に割り当てられている複製ページ３０１については、複製時間長が超過されておらず、削除する必要がないため、複製削除プログラム２２２７は、Ｓ１５０６へ進む。
【０２４５】
以上のようにして、時間に基づいて複製ページを削除することができる。なお、複製ページ３０１のリード頻度に応じて複製時間長が自動で変更されても良い。例えば、リード頻度が高い仮想領域に割り当てられている複製ページについては、複製時間長はより長くされても良い。具体的には、例えば、図２８のＳ１５０４で、処理対象仮想領域に割り当てられている複製ページ３０１に対応する「リード頻度」の値を参照し、その値に応じて、複製時間長が変更されても良い。
【０２４６】
以上、本発明の好適な幾つかの実施例を説明したが、これは本発明の説明のための例示であって、本発明の範囲をこれらの実施例にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実施することが可能である。例えば、識別番号に代えて、他種の識別子が採用されても良い。例えば、図２９に示すように、一つのモジュール間が密結合となって、その他のモジュール間が疎結合とされても良い。
【図面の簡単な説明】
【０２４７】
【図１】本発明の実施例１に係るコンピュータシステムの全体構成の一例を示す。
【図２】メモリパッケージの詳細の一例を示す図である。
【図３】パス情報テーブルの一例を示す図である。
【図４】モジュール構成のストレージにおけるＩ／Ｏ処理の流れの一例を示す図である。
【図５】仮想ボリューム技術の一例を示す図である。
【図６】プールテーブルの一例を示す図である。
【図７】ページテーブルの一例を示す図である。
【図８】仮想ボリュームテーブルの一例を示す図である。
【図９】実施例１の一つの特徴の概要の説明図である。
【図１０】仮想ボリュームを作成する処理の一例を示す図である。
【図１１】実施例１でのパス定義処理の一例を示す図である。
【図１２】自モジュール内のページが割当済みの仮想領域がライト対象の仮想領域である場合のライト処理の一例を示す図である。
【図１３】リード対象の仮想領域に自モジュール内のページが割り当てられていない場合のリード処理の一例を示す図である。
【図１４】ライト対象の仮想領域に自モジュール内のページが割り当てられていない場合のライト処理の一例を示す図である。
【図１５】仮想ボリュームにページを割当てる処理の一例を示す図である。
【図１６】実施例２の一つの特徴の概要の説明図である。
【図１７】実施例２における仮想ボリュームテーブルの一例を示す図である。
【図１８】パス定義時のページ複製処理の一例を示す図である。
【図１９】ライト処理時のページ複製処理の一例を示す図である。
【図２０】リード処理時のページ複製処理の一例を示す図である。
【図２１】実施例２におけるパス情報テーブルの一例を示す図である。
【図２２】実施例２でのパス定義処理の一例を示す図である。
【図２３】リード・ライト処理時のページ複製処理の別の一例を示す図である。
【図２４】ライト処理時の複製ページ削除処理の一例を示す図である。
【図２５】ライト処理時の複製ページ更新処理の一例を示す図である。
【図２６】新規ページ割当時の複製ページ削除処理の一例を示す図である。
【図２７】パス定義時の複製ページ削除処理の一例を示す図である。
【図２８】時間経過による複製ページ削除処理の一例を示す図である。
【図２９】モジュール間の結合の変形例を示す図である。
【図３０】課題の説明図である。
【符号の説明】
【０２４８】
１００・・・ホスト  １１０・・・ネットワーク  １２０・・・ネットワーク  ２００・・・ストレージシステムモジュール  ２１０・・・プロセッサパッケージ  ２１１・・・プロセッサ  ２１２・・・ローカルメモリ  ２１３・・・保守ポート  ２２０・・・メモリパッケージ  ２２１・・・制御情報部  ２２２・・・プログラム部  ２２３・・・キャッシュ部  ２３０・・・バックエンドパッケージ  ２３１・・・ポート  ２４０・・・ＨＤＤ  ２５０・・・ボリューム  ２６０・・・フロントエンドパッケージ  ２６１・・・ポート
【図１】
0005072692.tif 000002
【図２】
0005072692.tif 000003
【図３】
0005072692.tif 000004
【図４】
0005072692.tif 000005
【図５】
0005072692.tif 000006
【図６】
0005072692.tif 000007
【図７】
0005072692.tif 000008
【図８】
0005072692.tif 000009
【図９】
0005072692.tif 000010
【図１０】
0005072692.tif 000011
【図１１】
0005072692.tif 000012
【図１２】
0005072692.tif 000013
【図１３】
0005072692.tif 000014
【図１４】
0005072692.tif 000015
【図１５】
0005072692.tif 000016
【図１６】
0005072692.tif 000017
【図１７】
0005072692.tif 000018
【図１８】
0005072692.tif 000019
【図１９】
0005072692.tif 000020
【図２０】
0005072692.tif 000021
【図２１】
0005072692.tif 000022
【図２２】
0005072692.tif 000023
【図２３】
0005072692.tif 000024
【図２４】
0005072692.tif 000025
【図２５】
0005072692.tif 000026
【図２６】
0005072692.tif 000027
【図２７】
0005072692.tif 000028
【図２８】
0005072692.tif 000029
【図２９】
0005072692.tif 000030
【図３０】
0005072692.tif 000031