(57)【特許請求の範囲】
【請求項１】
ブロックＩ／ＯコマンドとファイルＩ／Ｏコマンドを受け付けるストレージ装置であって、
ブロックＩ／ＯコマンドとファイルＩ／Ｏコマンドのデータを格納する複数の記憶デバイスと、
ブロックキャッシュ領域とファイルキャッシュ領域とを含む、コントローラと、を含み、
前記コントローラは、ファイルＩ／ＯコマンドからブロックＩ／Ｏコマンドを生成して、当該生成したブロックＩ／Ｏコマンドに従って前記複数の記憶デバイスにアクセスし、
前記ファイルキャッシュ領域は、ファイルＩ／Ｏコマンドのデータをキャッシュし、
前記ブロックキャッシュ領域は、ブロックＩ／Ｏコマンドのデータをキャッシュし、
前記コントローラは、受信した第１ファイルリードコマンドの第１データをキャッシュする領域が前記ファイルキャッシュ領域において不足している場合に、前記ファイルキャッシュ領域の空き領域を新たに形成して前記第１データを前記ファイルキャッシュ領域にキャッシュする第１キャッシュ方法、及び、前記ファイルキャッシュ領域に前記第１データをキャッシュすることなく前記ブロックキャッシュ領域に前記第１データをキャッシュする第２キャッシュ方法、から一つを選択し、
前記コントローラは、前記第１キャッシュ方法において、前記第１ファイルリードコマンドから生成したブロックリードコマンドを、前記ブロックキャッシュ領域への非キャッシュの指定又は前記ブロックキャッシュ領域における最も高い廃棄優先度の指定を行って、発行し、当該ブロックリードコマンドに従って取得した前記第１データを前記ファイルキャッシュ領域にキャッシュする、ストレージ装置。
【請求項２】
請求項１に記載のストレージ装置であって、
前記コントローラは、前記ブロックキャッシュ領域の空き領域が前記第１データをキャッシュできる場合、前記第２キャッシュ方法を選択する、ストレージ装置。
【請求項３】
請求項１に記載のストレージ装置であって、
前記コントローラは、前記ファイルキャッシュ領域にキャッシュされているデータのアクセス時刻情報と前記ブロックキャッシュ領域にキャッシュされているデータのアクセス時刻情報とを参照し、
前記コントローラは、前記ファイルキャッシュ領域の前記アクセス時刻情報が前記ブロックキャッシュ領域の前記アクセス時刻情報より古いアクセス時刻を示す場合に、前記第１キャッシュ方法を選択し、
前記コントローラは、前記ブロックキャッシュ領域の前記アクセス時刻情報が前記ファイルキャッシュ領域の前記アクセス時刻情報より古いアクセス時刻を示す場合に、前記第２キャッシュ方法を選択する、ストレージ装置。
【請求項４】
請求項３に記載のストレージ装置であって、
前記アクセス時刻情報は、前記ファイルキャッシュ領域及び前記ブロックキャッシュ領域のそれぞれにおける、最古の最終アクセス時刻及び最終アクセス時刻の平均値の一方を示す、ストレージ装置。
【請求項５】
請求項１に記載のストレージ装置であって、
前記コントローラは、前記第１キャッシュ方法において、前記第１ファイルリードコマンドから生成したブロックリードコマンドを前記ブロックキャッシュ領域への非キャッシュを指定して発行し、前記第１データを、前記ブロックキャッシュ領域にキャッシュすることなく前記ファイルキャッシュ領域にキャッシュする、ストレージ装置。
【請求項６】
請求項１に記載のストレージ装置であって、
前記コントローラは、前記第１キャッシュ方法において、前記第１ファイルリードコマンドから生成したブロックリードコマンドを前記ブロックキャッシュ領域における最も高い廃棄優先度の指定を行って発行し、前記第１データを、前記ブロックキャッシュ領域に格納した後に最も高い廃棄優先度で前記ブロックキャッシュ領域から廃棄する、ストレージ装置。
【請求項７】
請求項１に記載のストレージ装置であって、
前記コントローラは、前記第１キャッシュ方法において、前記ファイルキャッシュ領域のデータを前記ブロックキャッシュ領域に移動して前記第１データをキャッシュする領域を確保する、ストレージ装置。
【請求項８】
請求項１に記載のストレージ装置であって、
前記コントローラは、前記第１ファイルリードコマンドから生成したブロックリードコマンドに、前記指定を含める、ストレージ装置。
【請求項９】
請求項１に記載のストレージ装置であって、
前記コントローラは、前記ブロックキャッシュ領域から、ファイルＩ／Ｏコマンドから変換したブロックＩ／Ｏコマンドのデータを、外部から受信したブロックＩ／Ｏコマンドのデータよりも優先的に廃棄する、ストレージ装置。
【請求項１０】
請求項１に記載のストレージ装置であって、
前記コントローラは、ファイルＩ／Ｏコマンドから変換したブロックＩ／Ｏコマンドのデータの種別を管理し、当該種別に応じて前記ブロックキャッシュ領域からの廃棄優先度を決定する、ストレージ装置。
【請求項１１】
請求項１に記載のストレージ装置であって、
前記コントローラは、前記ファイルキャッシュ領域と前記ブロックキャッシュ領域との間においてキャッシュ領域を移動する、ストレージ装置。
【請求項１２】
ブロックＩ／ＯコマンドとファイルＩ／Ｏコマンドを受け付けるストレージ装置の制御方法であって、
ファイルＩ／ＯコマンドからブロックＩ／Ｏコマンドを生成し、当該生成したブロックＩ／Ｏコマンドに従って記憶デバイスにアクセスし、
ファイルＩ／Ｏコマンドのデータをファイルキャッシュ領域にキャッシュし、
ブロックＩ／Ｏコマンドのデータをブロックキャッシュ領域にキャッシュし、
受信した第１ファイルリードコマンドの第１データをキャッシュする領域が前記ファイルキャッシュ領域において不足している場合に、前記ファイルキャッシュ領域の空き領域を新たに形成して前記第１データを前記ファイルキャッシュ領域にキャッシュする第１キャッシュ方法、及び、前記ファイルキャッシュ領域に前記第１データをキャッシュすることなく前記ブロックキャッシュ領域にキャッシュする第２キャッシュ方法、から一つを選択し、
前記第１キャッシュ方法において、前記第１ファイルリードコマンドから生成したブロックリードコマンドを、前記ブロックキャッシュ領域への非キャッシュの指定又は前記ブロックキャッシュ領域における最も高い廃棄優先度の指定を行って、発行し、当該ブロックリードコマンドに従って取得した前記第１データを前記ファイルキャッシュ領域にキャッシュする、ストレージ装置の制御方法。
【請求項１３】
請求項１２に記載のストレージ装置の制御方法であって、
前記ブロックキャッシュ領域の空き領域が前記第１データをキャッシュできる場合、前記第２キャッシュ方法を選択する、ストレージ装置の制御方法。
【請求項１４】
請求項１２に記載のストレージ装置の制御方法であって、
前記ファイルキャッシュ領域にキャッシュされているデータのアクセス時刻情報と前記ブロックキャッシュ領域にキャッシュされているデータのアクセス時刻情報とを参照し、
前記ファイルキャッシュ領域の前記アクセス時刻情報が前記ブロックキャッシュ領域の前記アクセス時刻情報より古いアクセス時刻を示す場合に、前記第１キャッシュ方法を選択し、
前記ブロックキャッシュ領域の前記アクセス時刻情報が前記ファイルキャッシュ領域の前記アクセス時刻情報より古いアクセス時刻を示す場合に、前記第２キャッシュ方法を選択する、ストレージ装置の制御方法。
【請求項１５】
請求項１２に記載のストレージ装置の制御方法であって、
前記第１キャッシュ方法において、前記第１ファイルリードコマンドから生成したブロックリードコマンドを前記ブロックキャッシュ領域への非キャッシュを指定して発行し、前記第１データを、前記ブロックキャッシュ領域にキャッシュすることなく前記ファイルキャッシュ領域にキャッシュする、ストレージ装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージ装置及びストレージ装置の制御方に関する。
【背景技術】
【０００２】
近年、情報システムの適用分野の拡大および計算機システムの分散化の進行にともない、一つのサイト内で管理されるホストの数が飛躍的に増大している。これにともない、計算機システムの管理コストの増大が問題となっている。特に、分散したホストに実装された記憶デバイスの管理を個別に行えば、運用に必要とされる容量を事前に予測することの難しさから、容量の追加を行う必要が生じた場合に各ホストに個別に記憶デバイスを増設する必要があり、管理コストは大きくなる。
【０００３】
この問題を解決するための技術として、ＳＡＮ（Ｓｔｏｒａｇｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）およびＮＡＳ（Ｎｅｔｗｏｒｋ  Ａｔｔａｃｈｅｄ  Ｓｔｏｒａｇｅ）が利用されている。いずれの技術も、分散したホストが個別に持つ記憶デバイスの集約を目的としているが、それぞれの技術が持つ特徴から、異なる適用分野に用いられている。
【０００４】
ＳＡＮは、複数のストレージ装置と複数のホストを、ホスト−ストレージ装置間通信専用のネットワークによって接続し、高速で遅延の少ないＩ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）を実現する技術である。ＳＡＮにおいては、ホストとストレージ装置との間のＩ／Ｏは、ブロック単位で行われる。ブロックは、ストレージ装置の容量をあるサイズに分割した、アドレスによって識別される固定長のデータの管理単位である。
【０００５】
ブロック単位のＩ／Ｏが適したアプリケーションとしては、データベースが挙げられる。複数のデータベースサーバのボリュームを単一のストレージ装置に集約し、管理を一元化することによって、計算機システムの管理コストを削減することが可能である。また、ＳＡＮが高信頼な専用ネットワークであり、効率の良い通信が行えることから、ボリューム単位のデータ転送のための通信路としての使用も有効である。ボリューム単位のデータ転送は、バックアップや、災害対策のための、遠隔のストレージ装置へのボリューム複製の目的で利用される。
【０００６】
一方、ＮＡＳは、ファイルサーバ機能を持つストレージ装置であり、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）上の複数のホストに対するファイルサービスを提供する。ＮＡＳとホストとの間のＩ／Ｏは、ファイル単位で行われる。ファイルは、一般的に文字列の識別子によって識別される可変長のデータの、管理単位である。ファイル単位のＩ／Ｏが適したアプリケーションとしては、複数のホストによるファイル共有が挙げられる。複数のＷｅｂサーバによる同一コンテンツのサービスや、複数のオフィスパーソナルコンピュータによる文書の共有を実現することができる。
【０００７】
このように、ＳＡＮとＮＡＳは互いを補完する関係にある技術である。したがって、ＳＡＮに対応したストレージ装置とＮＡＳとを単一の装置に統合することで、さらに管理コストが削減できるという発想に到る。下記特許文献１に記載された技術は、ストレージ装置の制御プログラムをＳＡＮとＮＡＳの両方の制御を行えるように構成することで、ＳＡＮとＮＡＳの双方に対応したストレージ装置を実現するものである。この技術を使用したストレージ装置は、ＳＡＮとＮＡＳのインタフェースを持ち、記憶容量をＳＡＮとＮＡＳに自由に割り当てることができる。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】米国特許出願公開第２００５／０１７２０４３号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００９】
上記特許文献１に示される技術においては、ＳＡＮ経由でアクセスするホストであるＳＡＮホストからのＩ／Ｏを処理するためのプログラム（ブロック処理プログラム）と、ＮＡＳを利用するホストであるＮＡＳホストからのＩ／Ｏを処理するためのプログラム（ファイル処理プログラム）とが、それぞれ独立しており、互いのキャッシングが独立に動作する。
【００１０】
しかし、両者でキャッシュ容量を共有していないために、Ｉ／Ｏパターンによっては十分な容量を使えず、キャッシュの利用効率が悪くなる。
【課題を解決するための手段】
【００１１】
本発明の代表的な例は、ブロックＩ／ＯコマンドとファイルＩ／Ｏコマンドを受け付けるストレージ装置である。前記ストレージ装置は、ブロックＩ／ＯコマンドとファイルＩ／Ｏコマンドのデータを格納する複数の記憶デバイスと、ブロックキャッシュ領域とファイルキャッシュ領域とを含む、コントローラと、を含む。前記コントローラは、ファイルＩ／ＯコマンドからブロックＩ／Ｏコマンドを生成して、当該生成したブロックＩ／Ｏコマンドに従って前記複数の記憶デバイスにアクセスする。前記ファイルキャッシュ領域は、ファイルＩ／Ｏコマンドのデータをキャッシュする。前記ブロックキャッシュ領域は、ブロックＩ／Ｏコマンドのデータをキャッシュする。前記コントローラは、受信した第１ファイルＩ／Ｏコマンドの第１データをキャッシュする領域が前記ファイルキャッシュ領域において不足している場合に、前記ファイルキャッシュ領域の空き領域を新たに形成して前記第１データを前記ファイルキャッシュ領域にキャッシュする第１キャッシュ方法、及び、前記ファイルキャッシュ領域に前記第１データをキャッシュすることなく前記ブロックキャッシュ領域に前記第１データをキャッシュする第２キャッシュ方法、から一つを選択する。
【発明の効果】
【００１２】
本発明の一例によれば、ストレージ装置におけるキャッシュ領域を効率的に利用することができる。
【図面の簡単な説明】
【００１３】
【図１】実施例１において、計算機システムの全体構成を示すブロック図である。
【図２】実施例１において、ＭＰＵメモリの構成例を示す。
【図３】実施例１において、ブロック処理用メモリの構成例を示す。
【図４】実施例１において、ファイル処理用メモリの構成例を示す。
【図５】実施例１において、共有メモリの構成例を示す。
【図６】実施例１において、ファイルキャッシュ情報テーブルの構成例を示す。
【図７】実施例１において、ブロックキャッシュ情報テーブルの構成例を示す。
【図８】実施例１において、キャッシュ連携情報テーブルの構成例を示す。
【図９】実施例１において、ファイル処理用プログラムにおけるブロックコマンド発行プログラムによる、リードコマンド発行処理の処理フローの第一の例である。
【図１０】実施例１において、ブロックコマンド発行プログラムによる、リードコマンド発行処理の処理フローの第二の例である。
【図１１】実施例１において、ブロックコマンド発行プログラムによる、リードコマンド発行処理の処理フローの第三の例である。
【図１２】実施例１において、ファイルキャッシュ制御プログラムによるキャッシュ階層判定処理の一例を示すフローチャートである。
【図１３】実施例１において、キャッシュ階層判定処理の別の例である。
【図１４】実施例１において、ブロックコマンド処理プログラムのブロックリードコマンド処理の処理フローの例である。
【図１５】実施例１において、ブロックコマンド処理プログラムのブロックライトコマンド処理の処理フローの例である。
【図１６】実施例１において、ブロックキャッシュ制御プログラムによる、ブロックキャッシュ領域におけるフリー領域を確保する処理（ブロックキャッシュフリー領域確保処理）の処理フローの例である。
【図１７】実施例１において、ブロックキャッシュ制御プログラムによる、ブロックキャッシュフリー領域確保処理の処理フローの第二の例である。
【図１８】実施例２において、ブロックキャッシュ情報テーブルの構成例である。
【図１９】実施例２において、ブロックライトコマンド処理フローの例である。
【図２０】実施例２において、ブロックキャッシュフリー領域確保処理の処理フローの例である。
【図２１】実施例２において、ブロックキャッシュフリー領域確保処理の処理フローの別の例である。
【図２２】実施例２において、ブロックキャッシュフリー領域確保処理の処理フローの別の例である。
【図２３】実施例３において、ブロックコマンド発行プログラムのライトコマンド発行処理の処理フローの例である。
【図２４】実施例３において、ブロックキャッシュフリー領域確保処理の処理フローの例である。
【図２５】実施例４において、ＭＰＵメモリの構成例を示す。
【図２６】実施例４において、仮想サーバ用メモリの構成例を示す。
【図２７】実施例５において、ブロック処理用メモリの構成例を示す。
【図２８】実施例５において、キャッシュ容量調整プログラムによって実行される、容量割り当て変更処理の処理フローの例である。
【本発明を実施するための形態】
【００１４】
以下、添付図面を参照して本発明の実施形態を説明する。本実施形態は本発明を実現するための一例に過ぎず、本発明の技術的範囲を限定するものではないことに注意すべきである。以下において、複数インタフェースを有するストレージ装置、例えば、ＳＡＮ（Ｓｔｏｒａｇｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）インタフェースとＮＡＳ（Ｎｅｔｗｏｒｋ  Ａｔｔａｃｈｅｄ  Ｓｔｏｒａｇｅ）インタフェースのコマンドの両者によりデータアクセスを行うことのできるハイブリッド型のストレージ装置について説明する。
【実施例１】
【００１５】
図１は、本実施例における計算機システムの全体構成を示すブロック図である。図１での計算機システム１は、ＳＡＮホスト２、ＮＡＳホスト３、管理端末８、ストレージ装置４を有する。
【００１６】
ＳＡＮホスト２は、ブロックストレージ装置を利用し、ブロックＩ／Ｏ要求（ブロックＩ／Ｏコマンド）を発行して、ブロック単位でアクセスするホストの例である。ＮＡＳホスト３は、ファイルストレージ装置を利用し、ファイルＩ／Ｏ要求（ファイルＩ／Ｏコマンド）を発行して、ファイル単位でアクセスするホストの例である。ストレージ装置４は、ブロックストレージ装置とファイルストレージ装置の双方の機能を有する。
【００１７】
計算機システム１は、さらに、ブロックストレージ用とファイルストレージ用のデータネットワーク、一例として、ＳＡＮ（Ｓｔｏｒａｇｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）５及びＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）６を有する。さらに、管理用ＬＡＮ７を有する。ＳＡＮ５は、例えば、ファイバチャネルや、ＦＣｏＥ、ｉＳＣＳＩ等のプロトコルが使用可能なネットワークであり、ＬＡＮ６は、例えば、ＴＣＰ／ＩＰネットワークである。
【００１８】
ＳＡＮホスト２は、ＳＡＮ５を介して、ストレージ装置４と通信可能に接続する。ＮＡＳホスト３は、ＬＡＮ６を介して、ストレージ装置４と通信可能に接続する。管理端末８は、管理用ＬＡＮ７を介してストレージ装置４と通信可能に接続する。ＳＡＮホスト２、ＮＡＳホスト３は、例えば、大型汎用コンピュータ、サーバ、クライアント端末などである。ＳＡＮホスト２、ＮＡＳホスト３は、ＳＡＮ５やＬＡＮ６を介さずに直接ストレージ装置４に接続されてもよい。また、管理端末８は、管理用ＬＡＮ７を介さず直接ストレージ装置４と接続してもよい。
【００１９】
図１でのストレージ装置４は、ストレージコントローラ（ＣＴＬ）１００と、ＣＴＬ１００で制御される記憶ドライブ群１０９を備える。ＣＴＬ１００は、プロセッサであるＭＰＵ１０１、主記憶デバイスであるＭＰＵメモリ１０２、ブロックインタフェース（Ｉ／Ｆ）１０４、ファイルＩ／Ｆ１０５、ドライブＩ／Ｆ１０６、管理Ｉ／Ｆ１０７を備えている。
【００２０】
さらに、ＣＴＬ１００は、ブロックＩ／Ｆ１０４を介してＳＡＮホスト２と通信し、ファイルＩ／Ｆ１０５を介してＮＡＳホスト３と通信し、ドライブＩ／Ｆ１０６を介して記憶ドライブ群１０９と通信し、管理Ｉ／Ｆ１０７を介して管理端末８と通信する。また、記憶ドライブ群１０９は、例えば、磁気ディスクドライブやＳｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅなどの記憶ドライブで構成される。
【００２１】
また、図示していないが、記憶ドライブ群１０９には、複数の連続したアドレス空間を割り当てた論理的な記憶領域（これを論理ボリュームという）が構成されている。ＳＡＮホスト２は、この論理ボリュームのアドレス空間を使用するブロック単位のＩ／Ｏコマンド（以下、「ブロックコマンド」という）をブロックＩ／Ｆ１０４を経由してストレージ装置４に対して発行する。
【００２２】
ＮＡＳホスト３は、ファイル単位のＩ／Ｏコマンド（以下、「ファイルコマンド」という）をファイルＩ／Ｆ１０５を経由してストレージ装置４に対して発行する。ファイルコマンドは、ファイル内の一部のデータを指定することができる。本実施例ではＣＴＬは１つであるが、複数ＣＴＬを含むことによって冗長性を持たせ、システムとしての可用性を高めることもできる。
【００２３】
次に、ＭＰＵメモリ１０２が格納するプログラム、制御情報、データの構成について、図２で説明する。図２は、本実施例におけるＭＰＵメモリ１０２の構成図である。ＭＰＵメモリ１０２は、ファイル処理用メモリ１０、ブロック処理用メモリ１１、共有メモリ１２の３つの領域を有している。
【００２４】
図３にブロック処理用メモリ１１の構成例を示す。ブロック処理用メモリ１１は、ブロック処理用テキスト領域３００、ブロック制御情報領域３１０、ブロックキャッシュ領域３２０を含み、それぞれの領域にプログラム、制御情報ないし各種データを格納する。
【００２５】
ブロック処理用テキスト領域３００は、ＳＡＮホスト２の発行するブロックコマンドを受けてデータを読み書きするストレージ装置としての処理や機能を実行する各種プログラムを格納し、ＭＰＵ１０１が適宜アクセスして実行するする。具体的には、ブロックコマンド処理プログラム３０１、ブロックキャッシュ制御プログラム３０２等を格納する。また、ブロック処理用テキスト領域３００に格納されるプログラムを総じてブロック処理用プログラムという。
【００２６】
ブロックコマンド処理プログラム３０１は、ＳＡＮホスト２や後述するファイル処理用プログラム（図４参照）から発行されたブロックコマンドを受け、データをリード・ライトする処理を実行するためのプログラムである。
【００２７】
ブロックコマンド処理プログラム３０１は、ＳＡＮホスト２又はファイル処理用プログラムからのブロックコマンドに応じて、ブロックリード処理又はブロックライト処理等を実行する。ブロックリード処理、ブロックライト処理については、図１４、図１５でその処理フローを説明する。ブロックコマンド処理プログラム３０１が実行される際、ブロックコマンド処理プログラム３０１は、必要に応じて、ブロックキャッシュ制御プログラム３０２を呼び出し、一部の処理を実行させる。
【００２８】
ブロック制御情報領域３１０は、ブロックキャッシュ情報テーブル３１１などを格納する。ブロックキャッシュ領域３２０は、ＳＡＮホスト２や後述するファイル処理用プログラムからのブロックコマンドによって読み書きされるユーザデータを、一時的に保持するための領域である。
【００２９】
つまり、アクセスに時間がかかる記憶ドライブに毎回アクセスすることを防ぐために、記憶ドライブのユーザデータの一部を、記憶ドライブよりも短時間にアクセスできるＭＰＵメモリ１０２上のブロックキャッシュ領域３２０に置いておく。更に、ブロックキャッシュ領域３２０は、ストレージ装置４への書き込みアクセスの高速化の役割もある。
【００３０】
ブロックキャッシュ領域３２０は有限なため、ＣＴＬ１００は、格納されたブロックを入れ替えながら使用する。入れ替え対象の選択アルゴリズムが重要である。本実施例は、一例として、Ｌｅａｓｔ  Ｒｅｃｅｎｔｌｙ  Ｕｓｅｄ（ＬＲＵ）と呼ばれる方式を採る。ＬＲＵは最も長時間アクセスされていないデータを入れ替え対象とするアルゴリズムである。
【００３１】
ブロックキャッシュ制御プログラム３０２は、リードのブロックコマンドを処理する際に、ブロックキャッシュ領域３２０に対象データが格納されているかを判定する。格納されている場合をヒット又はキャッシュヒット、格納されていない場合をミス又はキャッシュミスという。
【００３２】
キャッシュヒットだった場合は、ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ領域３２０からデータを読み込んで、ブロックコマンドを発行したＳＡＮホスト２又はファイルコマンド制御プログラム２０１にデータを返す。キャッシュミスだった場合は、ブロックキャッシュ制御プログラム３０２は、記憶ドライブ群１０９からデータを読み出す。
【００３３】
ブロックキャッシュ制御プログラム３０２は、また、ライトのブロックコマンドを処理する際に、ブロックキャッシュ領域３２０に対象データを格納する。ブロックキャッシュ領域３２０に格納した時点でブロックコマンドを発行したＳＡＮホスト２又はファイルコマンド制御プログラム２０１に応答を返すことで、応答時間を短縮できる。ブロックキャッシュ領域３２０に書き込まれたデータは、非同期に記憶ドライブ群１０９に書き込まれる。
【００３４】
図４にファイル処理用メモリ１０の構成例を示す。ファイル処理用メモリ１０は、ファイル処理用テキスト領域２００、ファイル制御情報領域２１０、ファイルキャッシュ領域２２０を含み、それぞれの領域が、プログラム、制御情報ないし各種データを格納する。
【００３５】
ファイル処理用テキスト領域２００は、ファイルコマンドでデータを読み書きするストレージとしての処理や機能を実行する各種プログラムを格納し、ＭＰＵ１０１が適宜アクセスして実行するする。具体的には、ファイル処理用テキスト領域２００は、ファイルコマンド処理プログラム２０１、ファイルキャッシュ制御プログラム２０２、ブロックコマンド発行プログラム２０３等を格納する。ファイル処理用テキスト領域２００に格納されるプログラムを総じてファイル処理用プログラムという。
【００３６】
ファイル処理用プログラムはデータにアクセスするために、内部的にブロック処理用プログラムに対し、ＳＡＮホスト２と同様に、論理ボリュームへのブロックＩ／Ｏコマンドを発行する。
【００３７】
ファイルコマンド処理プログラム２０１は、ＮＡＳホスト３から発行されたファイルコマンドを受け、データをリード及びライトする処理を実行するためのプログラムである。ファイルコマンド処理プログラム２０１は、ＮＡＳホスト３からのファイルコマンドに応じて、指定されたファイルのリード処理及びライト処理を実行する。
【００３８】
ＮＡＳホスト３がファイルコマンドでデータの読み書きを指示する対象は、ファイル名で識別され可変長のサイズを持つファイルの形式で示される。ファイルコマンド処理プログラム２０１は、ファイルシステム等に基づいて、ファイルコマンドをブロックコマンドに変換する。つまり、指定されたファイルの属するファイルシステムのデータが格納される論理ボリュームと、対象ファイルに対応するブロックの論理アドレスを指定したブロックコマンド形式に変換する。
【００３９】
変換されたブロックコマンドは、ブロックコマンド発行プログラム２０３を呼び出すことによって対象論理ボリュームに応じた方法で発行される。すなわち、ファイルシステムの格納される論理ボリュームが同じストレージ装置内であれば、ブロックコマンド発行プログラム２０３は、共有メモリ１３を経由して同筐体内のブロックコマンド処理プログラム３０１に対してブロックコマンドを発行する。
【００４０】
ファイルシステムの格納される論理ボリュームがＳＡＮ５を通して接続された外部のストレージ装置に存在する場合は、ブロックコマンドは、例えば、ブロックＩ／Ｆ１０４を通してＳＡＮ５を介して外部のストレージ装置に発行される。
【００４１】
発行されるブロックコマンドによって読み書きされるデータは、ファイル内容の他、メタデータ（ｉ−ｎｏｄｅや、ジャーナリングファイルシステムにおけるジャーナルデータ等）を含む。いずれも、それぞれのデータを指し示す一つ又は複数の連続した、固定長の領域（ブロック）として読み書きされる。
【００４２】
ブロックコマンド発行プログラム２０３が実行される際、ブロックコマンド発行プログラム２０３は、必要に応じて、ファイルキャッシュ制御プログラム２０２を呼び出し、一部の処理を実行させる。
【００４３】
具体的には、ファイルキャッシュ制御プログラム２０２は、ファイルキャッシュ領域２２０へのブロックのキャッシングを行う。すなわち、リードしたブロックをファイルキャッシュ領域２２０へ格納し、次に同じブロックをリードする際にはこの格納したブロックをリードすることで高速アクセスを実現する。ファイルキャッシュ制御プログラム２０２も、ブロックキャッシュ制御プログラム３０２と同様に、入れ替え対象の選択アルゴリズムにＬＲＵ方式を採る。ブロックコマンド発行プログラム２０３の詳細な説明は図９〜図１１で行う。
【００４４】
ファイル制御情報領域２１０は、ファイルキャッシュ情報テーブル２１１を格納する。ファイルキャッシュ領域２２０は、ＮＡＳホスト３からファイルコマンドによって読み書きされるユーザデータを一時的に保持する領域である。
【００４５】
図５は、共有メモリ１２の構成例を示す。共有メモリ１２には、ブロック処理用プログラムとファイル処理用プログラムの双方から読み書き可能な領域であり、それらの間の通信に利用される。ブロック処理用メモリ１１はブロック処理用プログラムのみがアクセスし、ファイル処理用メモリ１０はファイル処理用プログラムのみがアクセスする領域であり、双方でアクセスする情報の格納等にはこの共有メモリ１２を使用する。
【００４６】
共有メモリ１２は、共有制御情報領域４０１と通信領域４０２を有する。共有制御情報領域４０１は、ブロック処理用プログラムとファイル処理用プログラムとが共有する必要のある制御情報を格納する。具体的には、キャッシュ連携情報テーブル４０１が例に挙げられる。また、通信領域４０２は、ブロック処理用プログラムとファイル処理用プログラムとが通信する際に使用する領域であり、双方から読み書き可能である。
【００４７】
キャッシュ連携情報テーブル４０１は、ファイルキャッシュ制御プログラム２０２とブロックキャッシュ制御プログラム３０２が連携動作するために必要な制御情報を、格納する。
【００４８】
ブロックコマンド発行プログラム２０３は、ブロックコマンド処理プログラム３０１にコマンドを発行するため、またブロックコマンド処理プログラム３０１からの応答を受け取るために、ブロック−ファイル間の通信領域４０２を使用する。
【００４９】
なお、共有メモリ１２を使用することなく、ファイル処理用プログラムとブロック処理用プログラムとが必要な情報の通信を行ってもよい。キャッシュ連携情報テーブル４０１を使用することなく、ファイル処理用プログラムとブロック処理用プログラムとが、相互に必要な情報を問い合わせ、応答してもよい。
【００５０】
なお、ＭＰＵ１０１は、ＭＰＵメモリ１０２に記憶されているプログラムを実行することによって所定の機能を実現する。プログラムはＭＰＵ１０１によって実行されることで、定められた処理を記憶デバイス及び通信Ｉ／Ｆを用いながら行う。従って、本実施例及び他の実施例において、プログラムを主語とする説明は、ＭＰＵ１０１を主語とした説明でもよい。若しくは、プログラムが実行する処理は、そのプログラムが動作するストレージ装置４及びそれを含むシステムシステムが行う処理である。
【００５１】
ＭＰＵ１０１は、プログラムに従って動作することによって、所定の機能を実現する機能部として動作する。例えば、ＭＰＵ１０１は、ブロックコマンド処理部及びファイルコマンド処理部として機能する。ストレージ装置４は、これらの機能部を含む装置である。プログラムの少なくとも一部は、専用ハードウェアによって実現されてもよい。
【００５２】
説明の便宜上、プログラムはＭＰＵメモリ１０２内に示されているが、典型的には、プログラムは、二次記憶デバイスの記憶領域からＭＰＵメモリ１０２にロードされる。二次記憶デバイスは、所定の機能を実現するために必要なプログラム及びデータを格納する、不揮発性の非一時的記憶媒体を備える記憶デバイスであり、ストレージ装置４内に実装され又はネットワークを介して接続される。
【００５３】
本実例及び他の実施例において、システムが使用する情報は、データ構造に依存せずどのようなデータ構造で表現されていてもよい。例えば、テーブル、リスト、データベース又はキューから適切に選択したデータ構造体が、情報を格納することができる。さらに、各情報の内容を説明する際に、「識別情報」、「識別子」、「名」、「ＩＤ」という表現を用いるが、これらについてはお互いに置換が可能である。
【００５４】
図６は、ファイルキャッシュ情報テーブル２１１の構成例である。ファイルキャッシュ情報テーブル２１１は、ファイルキャッシュ領域２２０に格納されたキャッシュデータそれぞれについての情報を管理するテーブルであり、キャッシュアドレスフィールド２１１０、ボリューム番号フィールド２１１１、ボリュームアドレスフィールド２１１２、属性情報フィールド２１１３、最終アクセス時刻フィールド２１１４を有する複数のエントリを含む。
【００５５】
キャッシュアドレスフィールド２１１０は、ファイルキャッシュ領域２２０における各キャッシュ領域のアドレスを示す値を格納する。ボリューム番号フィールド２１１１およびボリュームアドレスフィールド２１１２は、キャッシュされたデータの論理ボリュームと論理ボリューム上のアドレスを示す値を格納する。
【００５６】
属性情報フィールド２１１３は、当該データに関する性質やキャッシング処理における振る舞いを指定するための情報を格納する。例えば、ユーザデータかｉ−ｎｏｄｅ等のメタデータかを示す情報が、一つ以上の文字列等の形式で格納される。最終アクセス時刻フィールド２１１４は、当該データに読み書きのアクセスがあった最終時刻を示す値を格納する。フリー領域（データが格納されておらず、あいているキャッシュ領域）については、各フィールドは値なし（図中では「−」で示す）となる。
【００５７】
これらのキャッシュ領域に関する情報は、新たにキャッシュデータが格納された時、キャッシュデータが入れ替えられた時、キャッシュデータが削除され領域が解放された（フリー領域となった）時、キャッシュヒットしてアクセスされた時等、ファイルキャッシュ制御プログラム２０２によって、その都度最新の情報を示すように更新される。
【００５８】
図７は、ブロックキャッシュ情報テーブル３１１の構成例である。ブロックキャッシュ情報テーブル３１１は、ブロックキャッシュ領域３２０に格納されたキャッシュデータそれぞれについての情報を管理するテーブルであり、キャッシュアドレスフィールド３１１０、ボリューム番号フィールド３１１１、ボリュームアドレスフィールド３１１２、属性情報フィールド３１１３、最終アクセス時刻フィールド３１１４を有する複数のエントリから構成される。
【００５９】
キャッシュアドレスフィールド３１１０は、ブロックキャッシュ領域３２０における各キャッシュ領域のアドレスを示す値を格納する。ボリューム番号フィールド３１１１およびボリュームアドレスフィールド３１１２は、キャッシュされたデータの論理ボリュームと論理ボリューム上のアドレスを示す値を格納する。
【００６０】
属性情報フィールド３１１３は、当該データに関する性質やキャッシング処理における振る舞いを指定するための情報を格納する。例えば、優先的に解放すべきデータであることを示す「優先解放」等の情報が、一つ以上の文字列等の形式で格納される。最終アクセス時刻フィールド３１１４は、当該データに読み書きのアクセスがあった最終時刻を示す値を格納する。また、フリー領域（データが格納されておらず、あいているキャッシュ領域）については、各フィールドは値なし（図中では「−」で示す）となる。
【００６１】
これらのキャッシュ領域に関する情報は、新たにキャッシュデータが格納された時、キャッシュデータが入れ替えられた時、キャッシュデータが削除され領域が解放された（フリー領域となった）時、キャッシュヒットしてアクセスされた時等、ブロックキャッシュ制御プログラム３０２によってその都度最新の情報を示すように更新される。
【００６２】
図８は、キャッシュ連携情報テーブル４０３の構成例である。キャッシュ連携情報テーブル４０３は、ブロックキャッシュ制御プログラム３０２とファイルキャッシュ制御プログラム２０２が連携動作するために必要な情報のテーブルである。
【００６３】
キャッシュ連携情報テーブル４０３は、ファイルキャッシュ最古最終アクセス時刻フィールド４０３０、ファイルキャッシュ平均最終アクセス時刻フィールド４０３４、ファイルキャッシュヒット率フィールド４０３１、ファイルキャッシュ空き領域フィールド４０３６、ブロックキャッシュ最古最終アクセス時刻フィールド４０３２、ブロックキャッシュ平均最終アクセス時刻フィールド４０３５、ブロックキャッシュヒット率フィールド４０３３、ブロックキャッシュ空き領域フィールド４０３７を持つ。
【００６４】
ファイルキャッシュ最古最終アクセス時刻フィールド４０３０は、ファイルキャッシュ領域２２０に格納されたデータのうち、最終アクセス時刻が最も古いキャッシュ領域の最終アクセス時刻を格納している。ファイルキャッシュ平均最終アクセス時刻フィールド４０３４は、ファイルキャッシュ領域２２０に格納されたデータの最終アクセス時刻の平均値を格納している。
【００６５】
ファイルキャッシュヒット率フィールド４０３１は、ファイルキャッシュ領域２２０におけるヒット率（総アクセス回数に対するキャッシュヒットの回数の割合）を格納する。ファイルキャッシュ空き領域フィールド４０３６は、ファイルキャッシュ領域２２０におけるフリー領域の数を格納する。それぞれのフィールドの値は、ファイルキャッシュ制御プログラム２０２によって随時反映される。
【００６６】
ブロックキャッシュ最古最終アクセス時刻フィールド４０３２は、ブロックキャッシュ領域３２０に格納されたデータのうち、最終アクセス時刻が最も古いキャッシュ領域の最終アクセス時刻を格納している。ブロックキャッシュ平均最終アクセス時刻フィールド４０３５は、ブロックキャッシュ領域３２０に格納されたデータの最終アクセス時刻の平均値を格納している。
【００６７】
ブロックキャッシュヒット率フィールド４０３３は、ブロックキャッシュ領域３２０におけるヒット率（総アクセス回数に対するキャッシュヒットの回数の割合）を格納する。ブロックキャッシュ空き領域フィールド４０３７は、ブロックキャッシュ領域３２０におけるフリー領域の数を格納する。それぞれのフィールドの値は、ブロックキャッシュ制御プログラム３０２によって随時反映される。
【００６８】
図９は、ファイル処理用プログラムにおけるブロックコマンド発行プログラム２０３による、リードコマンド発行処理の処理フローの第一の例である。一部ステップは他のプログラムを利用して実行される。
【００６９】
本処理（ブロックコマンド発行プログラム２０３）は、ファイルコマンド処理プログラム２０１等によって呼び出され、ファイルやそれに関連したメタデータに割り当てたブロックをリードするために実行される。リード対象のブロックを指す論理ボリューム番号、ボリューム内の論理ブロックアドレス等を示す情報、つまり、それらの値そのもの又はそれらを導出可能な情報を伴って呼び出される。
【００７０】
まず、ブロックコマンド発行プログラム２０３は、ファイルキャッシュ制御プログラム２０２を呼び出す（ステップＳ５１１１）。ファイルキャッシュ制御プログラム２０２は、要求されたデータがファイルキャッシュ領域２２０に存在するか（キャッシュヒット）否か（キャッシュミス）を、ファイルキャッシュ情報テーブル２１１を参照して、判定する。
【００７１】
キャッシュヒットだった場合（ステップＳ５１００：ＹＥＳ）、ファイルキャッシュ制御プログラム２０２は、ファイルキャッシュ領域２２０から対象データを読み込み、ファイルキャッシュ情報テーブル２１１を更新する。ファイルキャッシュ制御プログラム２０２は、対象データを、コマンド発行元（ＮＡＳホスト３）に返送する（ステップＳ５１０９）。
【００７２】
キャッシュミスだった場合（ステップＳ５１００：ＮＯ）、ブロックコマンド発行プログラム２０３は、ステップＳ５１１３に進む。ステップＳ５１１３で、ブロックコマンド発行プログラム２０３は、対象データの格納先論理ボリュームが同筺体内か、外部ストレージ装置かを判定する（Ｓ５１１３）。
【００７３】
ファイル制御情報領域２１０は、不図示のボリューム情報テーブルを格納しており、このテーブルは、ボリュームのデータの格納位置を示す情報を含む。ブロックコマンド発行プログラム２０３は、このボリューム情報テーブルを参照することで、ステップＳ５１１３の判定を行うことができる。
【００７４】
対象データが同筐体内に存在する場合（ステップＳ５１１３：ＹＥＳ）、ブロックコマンド発行プログラム２０３は、ステップＳ５１０１に進む。対象データが外部ストレージ装置に格納されている場合（ステップＳ５１１３：ＮＯ）、ブロックコマンド発行プログラム２０３は、ブロックＩ／Ｆ１０４を経由して外部ストレージ装置にコマンドを発行し（ステップＳ５１１２）、その応答からデータを読み込んで、ファイルキャッシュ領域２２０に格納することなく、ブロックコマンド発行プログラム２０３の呼び出し元に返送する（ステップＳ５１１０）。
【００７５】
ステップＳ５１０１で、ブロックコマンド発行プログラム２０３は、ブロックコマンドを、通信領域４０２を経由してブロックコマンド処理プログラム３０１に発行する。ブロックコマンド処理プログラム３０１は、受信したブロックコマンドに従って、後述するブロックリードコマンド処理（図１４を参照）を実行する。ブロックコマンド発行プログラム２０３は、ブロックコマンド処理プログラム３０１からの応答を、通信領域４０２を経由して受け取る（ステップＳ５１０２）。応答情報は、対象となるデータと、ブロックキャッシュ領域３２０にキャッシュヒットしたか否かの情報とを含む。
【００７６】
ブロックコマンド発行プログラム２０３は、応答情報を参照して、ブロックキャッシュ領域３２０でキャッシュヒットしたかどうかを判定する（ステップＳ５１０３）。キャッシュヒットしていた場合（ステップＳ５１０３：ＹＥＳ）、ブロックコマンド発行プログラム２０３は、ステップ５１１０に進み、データを呼び出し元に返送する。
【００７７】
ブロックキャッシュ領域３２０でキャッシュミスだった場合（ステップＳ５１０３：ＮＯ）、ブロックコマンド発行プログラム２０３は、ファイルキャッシュ制御プログラム２０２におけるキャッシュ階層判定処理を呼び出す（Ｓ５１０４）。キャッシュ階層判定処理は図１２および図１３で述べるが、データが、ファイルキャッシュ領域２２０、ブロックキャッシュ領域３２０のいずれのキャッシュ領域（階層）に格納されるべきかを判定する。
【００７８】
判定結果がブロック階層であった場合（ステップＳ５１０５：ＮＯ）、ブロックコマンド発行プログラム２０３はステップＳ５１１０に進み、ブロックコマンドへの応答からデータを呼び出し元に返送して終了する。当該データは、ファイルキャッシュ領域２２０に格納されない。
【００７９】
判定結果がファイル階層であった場合（ステップＳ５１０５：ＹＥＳ）、ブロックコマンド発行プログラム２０３は、まず、ファイルキャッシュ制御プログラム２０２におけるファイルキャッシュ確保処理を呼び出し、ファイルキャッシュ領域２２０にフリー領域を確保する（ステップＳ５１０６）。いずれの領域を確保するかは、例えば、ＬＲＵアルゴリズムによって判断される。例えば、ファイルキャッシュ情報テーブル２１１の最終アクセス時刻フィールドのアクセス時刻の最も古いキャッシュデータが削除されて、フリー領域が確保される。
【００８０】
ブロックコマンド発行プログラム２０３は、ファイルキャッシュ制御プログラム２０２によって、こうして確保した領域にデータを格納する（ステップＳ５１０７）。ファイルキャッシュ制御プログラム２０２は、ファイルキャッシュ領域２２０にデータを格納し、ファイルキャッシュ情報テーブル２１１に新規エントリを作成、当該データの情報で更新する。
【００８１】
次に、ブロックコマンド発行プログラム２０３は、通信領域４０２を介してブロックキャッシュ制御プログラム３０２を呼び出し、当該データをブロックキャッシュ領域３２０から削除させる（以下、これをパージという）（ステップＳ５１０８）。そののち、ブロックコマンド発行プログラム２０３は、ファイルキャッシュ領域２２０からデータを、ブロックコマンド発行プログラム２０３の呼び出し元に返送する（Ｓ５１０９）。これにより、二つのキャッシュ領域２２０、３２０で同一データがキャッシュされることを避ける。
【００８２】
また、ステップＳ５１０８において、ブロックコマンド発行プログラム２０３は、ブロックキャッシュ制御プログラム３０２にデータをパージさせるのではなく、当該データを優先的に解放させるよう情報を与えても良い。
【００８３】
具体的には、ブロックコマンド発行プログラム２０３は、当該データに対応するブロックキャッシュ情報テーブル３１１のエントリの属性情報フィールド３１１３に「優先解放」を加えるように、ブロックキャッシュ制御プログラム３０２に指示する。これにより、パージ機能をブロックキャッシュ制御プログラム３０２に実装することなく、ブロックキャッシュ制御プログラム３０２の本来のキャッシュ制御処理内で、重複キャッシュデータを削除することができる。
【００８４】
図１０は、ブロックコマンド発行プログラム２０３による、リードコマンド発行処理の処理フローの第二の例である。ブロックコマンド発行プログラム２０３は、まず、ファイルキャッシュ制御プログラム２０２を呼び出す（ステップＳ５０１４）。ファイルキャッシュ制御プログラム２０２は、要求されたデータがファイルキャッシュ領域２２０に存在するかどうか（キャッシュヒットかどうか）を、ファイルキャッシュ情報テーブル２１１を参照して、判定する（ステップＳ５０００）。
【００８５】
キャッシュヒットだった場合（ステップＳ５０００：ＹＥＳ）、ファイルキャッシュ制御プログラム２０２は、ファイルキャッシュ領域２２０からデータを読み込み、当該データを、コマンド発行元に返送する（ステップＳ５００８）。キャッシュミスだった場合（ステップＳ５０００：ＮＯ）、ブロックコマンド発行プログラム２０３は、対象データの格納先論理ボリュームが同筺体内か、外部ストレージ装置かを判定する（ステップＳ５０１３）。ステップＳ５０１３、Ｓ５１１２の処理は図９と同じなので説明を割愛する。
【００８６】
対象データが同筐体内に存在する場合（ステップＳ５０１３：ＹＥＳ）、ブロックコマンド発行プログラム２０３は、ファイルキャッシュ制御プログラム２０２におけるキャッシュ階層判定処理を呼び出す（ステップＳ５００２）。キャッシュ階層判定処理は図１２および図１３で述べる。
【００８７】
ブロックコマンド発行プログラム２０３は、上記判定の結果がファイル階層（ファイルキャッシュ領域２２０）かブロック階層（ブロックキャッシュ領域３２０）かを判定し（ステップＳ５００３）、ファイル階層であった場合（ステップＳ５００３：ＹＥＳ）、ブロックコマンド発行プログラム２０３は、ファイルキャッシュ制御プログラム２０２におけるファイルキャッシュ確保処理を呼び出し、ファイルキャッシュ領域２２０にフリー領域を確保する（Ｓ５００４）。
【００８８】
次に、ブロックコマンド発行プログラム２０３は、ブロックコマンドに非キャッシュの属性情報を付加した上で、通信領域４０２を経由してブロックコマンドをブロックコマンド制御プログラム３０２に発行する（Ｓ５００５）。これにより、ブロックキャッシュ領域３２０にデータがキャッシュされることを避けることができる。
【００８９】
この時指定する属性は、キャッシュしないことを示す「非キャッシュ」属性でもよく、またキャッシュしても優先的に解放する「優先解放」属性でもよい。また、この時の属性情報は、ブロックコマンドの中に格納してもよく、また通信領域４０２上の別領域に格納しても良い。ブロックコマンドに含めることで、属性指示のための処理を効率化できる。
【００９０】
ブロックコマンド処理プログラム３０１は、受信したブロックコマンドに従って、後述するブロックリードコマンド処理（図１４を参照）を実行する。ブロックコマンド発行プログラム２０３は、ブロックコマンド処理プログラム３０１から、応答を受け取る（Ｓ５００６）。
【００９１】
ブロックコマンド発行プログラム２０３は、ファイルキャッシュ制御プログラム２０２を呼び出し、ファイルキャッシュ制御プログラム２０２は受け取ったデータをファイルキャッシュ領域２２０へ格納し、ファイルキャッシュ情報テーブル２１１に新規エントリを作成、当該データの情報で更新する（Ｓ５００７）。ファイルキャッシュ制御プログラム２０２はファイルキャッシュ領域からデータを取得し、コマンド発行元に返送する（Ｓ５００８）。
【００９２】
ステップＳ５００３で判定結果がブロック階層であった場合（ステップＳ５００３：ＮＯ）、ブロックコマンド発行プログラム２０３は、ブロックコマンドに要キャッシュの属性情報を付加した上で、通信領域４０２を経由してブロックコマンドをブロックコマンド制御プログラム３０２に発行する（ステップＳ５００９）。ブロックコマンド制御プログラム３０２は、受信したブロックコマンドに従って、後述するブロックリードコマンド処理（図１４を参照）を実行する。
【００９３】
ブロックコマンド発行プログラム２０３は、ブロックコマンド処理プログラム３０１から、応答を受け取って（ステップＳ５０１０）、データをコマンド発行に返送する（Ｓ５０１１）。受け取られたデータは、ファイルキャッシュ領域２２０には格納されない。なお、ステップＳ５００９における属性付加は必ずしも必要ではない。なぜならば、ブロックキャッシュ制御プログラム３０２は、通常はリードデータをキャッシュするからである。
【００９４】
図１１は、ブロックコマンド発行プログラム２０３による、リードコマンド発行処理の処理フローの第三の例である。図１０の処理フローと異なるのは，ステップＳ５００９〜ステップＳ５０１１に代わり、ステップＳ５００３の判定結果が否定的（キャッシュ階層＝ブロック）の場合に、ステップＳ５０１５が追加されている点、さらに、ステップＳ５００３の判定結果にかかわらず、ステップＳ５００４〜Ｓ５００８が実行される点である。
【００９５】
ステップＳ５０１５は、ファイルキャッシュ領域における最古データ（最も最終アクセス時刻の古いデータ）をブロックキャッシュ領域３０２に移動する。具体的には、ブロックコマンド発行プログラム２０３は、ブロックキャッシュ制御プログラム３０２に対して通信領域４０２を介して通信し、ブロックキャッシュ領域３２０に当該ブロックをキャッシュする指示を出す。ブロックコマンド発行プログラム２０３は、このステップを行ったのち、ステップＳ５００４に進む。これにより、ファイルキャッシュ領域２２０とブロックキャッシュ領域３２０を横断的に管理ができる。
【００９６】
図１２は、ファイルキャッシュ制御プログラム２０２によるキャッシュ階層判定処理の一例を示すフローチャートである。本処理は、ファイルキャッシュ領域２２０とブロックキャッシュ領域３２０のいずれのキャッシュ領域を用いるべきであるかを判定する処理である。つまり既存キャッシュデータの一部を破棄して新たにデータをキャッシュするためのフリー領域を確保すべき領域（階層）を選択する処理である。
【００９７】
まず、ファイルキャッシュ制御プログラム２０２は、キャッシュ連携テーブル４０３のファイルキャッシュ空き領域フィールド４０３６を参照することで、ファイルキャッシュ領域３２０に空きがある（ファイルキャッシュ空き領域フィールド４０３６の格納値が０ではない）か否かを判定する（ステップＳ５２００）。空きがあれば（ステップＳ５２００：ＹＥＳ）、ファイルキャッシュ制御プログラム２０２は、「ファイルキャッシュ領域」を、判定結果として返す（ステップＳ５２０３）。ファイルでキャッシュする方が、ブロックでキャッシュするよりも容量効率が高く、ファイルキャッシュ領域２２０は、ブロックキャッシュ領域３２０よりもＮＡＳホスト３に近いため、応答時間を短縮することができる。
【００９８】
空きがなければ（ステップＳ５２００：ＮＯ）、ファイルキャッシュ制御プログラム２０２は、キャッシュ連携テーブル４０３のブロックキャッシュ空き領域フィールド４０３７を参照することで、ブロックキャッシュ領域３２０に空きがある（ブロックキャッシュ空き領域フィールド４０３７の格納値が０ではない）か否かを判定する（ステップＳ５２０１）。空きがあれば（ステップＳ５２０１：ＹＥＳ）ブロックキャッシュ領域を判定結果として返す（ステップＳ５２０４）。これにより、新たな空き領域を形成することなくデータをキャッシュできる。
【００９９】
いずれも空きがなければ（ステップＳ５２０１：ＮＯ）、ファイルキャッシュ制御プログラム２０２は、キャッシュ連携テーブル４０３のファイルキャッシュ最古最終アクセス時刻フィールド４０３０およびブロックキャッシュ最古最終アクセス時刻フィールド４０３２を参照することで、ファイルキャッシュ領域２２０とブロックキャッシュ領域３２０の最古データの最終アクセス時刻同士を比較し、より古い方を選択する（ステップＳ５２０２〜Ｓ５２０４）。
【０１００】
つまり、ファイルキャッシュ領域２２０の最古データの最終アクセス時刻が、ブロックキャッシュ領域３２０の最古データの最終アクセス時刻よりも古い場合（ステップＳ５２０２：ＹＥＳ）、ファイルキャッシュ制御プログラム２０２は、ファイルキャッシュ領域２２０を選択する（ステップＳ５２０３）。その逆又は最終アクセス時刻が同一の場合（ステップＳ５２０２：ＮＯ）、ファイルキャッシュ制御プログラム２０２は、ブロックキャッシュ領域３２０を選択する（ステップＳ５２０３）。同一である場合、いずれを選択してもよい。
【０１０１】
また、別の方法として、最古データの最終アクセス時刻ではなく平均の最終アクセス時刻を比較する方法もある。その場合はステップＳ５２０２において、ファイルキャッシュ制御プログラム２０２は、キャッシュ連携テーブル４０３のファイルキャッシュ平均最終アクセス時刻フィールド４０３４およびブロックキャッシュ平均最終アクセス時刻フィールド４０３５を参照することで、ファイルキャッシュ領域２２０とブロックキャッシュ領域３２０の平均の最終アクセス時刻同士を比較する。
【０１０２】
これにより、ファイルキャッシュ領域２２０とブロックキャッシュ領域３２０の双方のキャッシュデータから開放すべきデータを選択することができ、キャッシュヒット率を上げることができる。
【０１０３】
図１３はキャッシュ階層判定処理の別の例である。本処理は図１２に示したキャッシュ階層判定処理と、ステップＳ５２０２がステップＳ５２０５に置き換わっている点を除いて同一である。ステップＳ５２０５では、ファイルキャッシュ制御プログラム２０２は、キャッシュ連携テーブル４０３のファイルキャッシュヒット率フィールド４０３１およびブロックキャッシュヒット率フィールド４０３３を参照することで、ファイルキャッシュ領域２２０とブロックキャッシュ領域３２０のキャッシュヒット率を比較し、ヒット率がより低い方を選択する（ステップＳ５２０５、Ｓ５２０３、Ｓ５２０４）。
【０１０４】
つまり、ブロックキャッシュヒット率がファイルキャッシュヒット率よりも大きい場合（ステップＳ５２０５：ＹＥＳ）、ファイルキャッシュ制御プログラム２０２は、ファイルキャッシュ領域２２０を選択する（ステップＳ５２０３）。その逆又はキャッシュヒット率が同一の場合（ステップＳ５２０５：ＮＯ）、ファイルキャッシュ制御プログラム２０２は、ブロックキャッシュ領域３２０を選択する（ステップＳ５２０３）。キャッシュヒット率同一である場合、いずれを選択してもよい。
【０１０５】
これにより、ファイルキャッシュ領域２２０とブロックキャッシュ領域３２０の双方のキャッシュデータから開放すべきデータを選択することができ、キャッシュヒット率を上げることができる。
【０１０６】
図１４はブロックコマンド処理プログラム３０１のブロックリードコマンド処理の処理フローの例である。本処理は、リードのブロックコマンドを受け取ると実行される。ブロックコマンド処理プログラム３０１は、リード対象の論理ボリュームとボリューム内の論理アドレスを伴って呼び出される。また、ファイル処理プログラムのブロックコマンド発行プログラム２０３から通信領域４０２経由で発行されたブロックコマンドは、非キャッシュ属性、優先解放属性等、リード処理におけるキャッシング動作又はデータに関する属性情報を伴うことがある。
【０１０７】
ブロックコマンド処理プログラム３０１は、まず、ブロックキャッシュ制御プログラム３０２を呼び出して、ブロックキャッシュ領域３２０に対象データが格納されているかの判定（ヒットミス判定）を行う（ステップＳ５３００）。ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ情報テーブル３１１を参照し、対象データがブロックキャッシュ領域３２０に格納されているか確認することができる。
【０１０８】
キャッシュヒットの場合（ステップＳ５３００：ＹＥＳ）、ブロックキャッシュ制御プログラム３０２は、当該データをコマンド発行元に返送し、ブロックキャッシュ情報テーブル３１１を更新する（ステップＳ５３０７）。
【０１０９】
キャッシュミスの場合（ステップＳ５３００：ＮＯ）、ブロックコマンド処理プログラム３０１は、コマンドに「非キャッシュ」の属性が指定されているか否かを判定する（ステップＳ５３０１）。「非キャッシュ」の属性が指定されている場合（ステップＳ５３０１：ＹＥＳ）、ブロックコマンド処理プログラム３０１は、記憶ドライブ群１０９からデータを読み出し（ステップＳ５３０２）、ブロックキャッシュ領域３２０に格納せずにデータをコマンド発行元に返送する（ステップＳ５３０７）。
【０１１０】
「非キャッシュ」の属性が指定されていない場合（ステップＳ５３０１：ＮＯ）、ブロックコマンド処理プログラム３０１は、まず、後述するブロックキャッシュ制御プログラム３０２におけるブロックキャッシュフリー領域確保処理を呼び出して、ブロックキャッシュ領域３２０にフリー領域を確保する（ステップＳ５３０３）。
【０１１１】
ブロックコマンド処理プログラム３０１は、ブロックキャッシュ制御プログラム３０２を呼び出して、記憶ドライブ群１０９からデータを読み出し（ステップＳ５３０４）、読みだしたデータをブロックキャッシュ領域３２０に格納し（ステップＳ５３０５）、ブロックキャッシュ情報テーブル３１１を更新し（ステップＳ５３０６）、そしてデータをコマンド発行元に返送する（ステップＳ５３０７）。
【０１１２】
図１５はブロックコマンド処理プログラム３０１のブロックライトコマンド処理の処理フローの例である。本処理はライトのブロックコマンドを受け取ると実行される。ブロックコマンド処理プログラム３０１は、ライト対象の論理ボリュームとボリューム内の論理アドレスを伴って呼び出される。また、ライトコマンドは、リードコマンド同様に各種属性情報を伴う場合もある。
【０１１３】
ブロックコマンド処理プログラム３０１は、まず、ブロックキャッシュ制御プログラム３０２を呼び出し、ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ情報テーブル３１１を参照して、ブロックキャッシュのヒットミス判定を行う（ステップＳ５４００）。キャッシュミスならば（ステップＳ５４００：ＮＯ）、ブロックコマンド処理プログラム３０１は、後述するブロックキャッシュ制御プログラム３０２におけるブロックキャッシュフリー領域確保処理を呼び出して、フリー領域を確保して当該データ用に割り当てる（ステップＳ５４０１）。
【０１１４】
キャッシュヒットならば（ステップＳ５４００：ＹＥＳ）、ブロックコマンド処理プログラム３０１は、このステップは飛ばし、次のステップＳ５４０２に進む。ブロックコマンド処理プログラム３０１はブロックキャッシュ制御プログラム３０２を呼び出し、割り当てられた領域にライトデータを書き込み（ステップＳ５４０２）、ブロックキャッシュ情報テーブル３１１を更新する（ステップＳ５４０３）。また属性情報が付随する場合は、ブロックキャッシュ制御プログラム３０２は、これをブロックキャッッシュ情報テーブル３１１に反映する（ステップＳ５４０４）。
【０１１５】
そして、ブロックキャッシュ制御プログラム３０２は、コマンド発行元に書き込み完了の応答を返し（ステップＳ５４０５）、その後、ブロックコマンド処理プログラム３０１に呼び出されたブロックキャッシュ制御プログラム３０２は、記憶ドライブ群１０９にデータを書き込む（ステップＳ５４０６）。このステップＳ５４０６を実行するタイミングについては、完了応答後即時である必要はなく、複数コマンドについてまとめて実行するなどしてもよい。そうすることによって効率的にドライブに書き込むことができる。
【０１１６】
図１６は、ブロックキャッシュ制御プログラム３０２による、ブロックキャッシュ領域３２０におけるフリー領域を確保する処理（ブロックキャッシュフリー領域確保処理）の処理フローの例である。
【０１１７】
まず、ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ情報テーブル３１１を参照して、対象データを格納するために必要なフリー領域が既に存在するかどうかを判定し（ステップＳ５５００）、存在すれば（ステップＳ５５００：ＹＥＳ）、その領域を確保して（ステップＳ５５０２）、終了する。存在しなければ（ステップＳ５５００：ＮＯ）、ブロックキャッシュ制御プログラム３０２は、最も古い（最終アクセス時刻の古い）データを削除する等して領域を解放し（ステップＳ５５０１）、当該領域を確保する（ステップＳ５５０２）。
【０１１８】
図１７は、ブロックキャッシュ制御プログラム３０２による、ブロックキャッシュフリー領域確保処理の処理フローの第二の例である。図１６と異なるのは、ステップＳ５５００とステップＳ５５０１との間に、ステップＳ５５０３およびステップＳ５５０４が追加されている点である。
【０１１９】
ステップＳ５５０３では、ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ情報テーブル３１１を参照して、「優先解放」属性のついたデータが存在するかを判定する。存在すれば（ステップＳ５５０３：ＹＥＳ）、ブロックキャッシュ制御プログラム３０２は、そのうち最も古い（最終アクセス時刻の古い）データを削除する（ステップＳ５５０４）。存在しない場合（ステップＳ５５０３：ＮＯ）、ブロックキャッシュ制御プログラム３０２は、ステップＳ５５０１に進む。
【０１２０】
本実施例により、ファイル処理／ブロック処理それぞれの２つのキャッシュ制御が連携することで、容量効率の良いキャッシュ管理が実現できる。具体的には、ブロック処理プログラムとファイル処理プログラムのキャッシュ制御が連携することで、同一データを二重にキャッシュすることを避け、キャッシュ容量効率を上げることができる。
【０１２１】
また、ブロック処理用プログラムとファイル処理用プログラムとキャッシュ制御がそれぞれキャッシュ制御を行う場合において、キャッシュのリプレース対象をブロック処理プログラムのキャッシュデータとファイル処理プログラムのキャッシュデータから適切に選ぶことができる。これにより、ストレージ装置全体として所定アルゴリズムで制御した場合と同様に高いキャッシュ利用効率を実現し、性能を向上させることができる。
【０１２２】
上記実施例は、ファイルキャッシュ領域２２０にデータをキャッシュし、ブロックキャッシュ領域３２０にキャッシュしない、若しくは、ブロックキャッシュ領域３２０にデータ格納した後に当該データをパージ又はキャッシュ情報を使用してブロックキャッシュ制御において当該データを優先廃棄する。ＣＴＬ１００は、ファイルキャッシュ領域２２０にキャッシュしたデータの少なくとも一部を、外部からのブロックコマンドのデータと同様に、通常のブロックキャッシュ制御においてブロックキャッシュ領域３２０にキャッシュしてもよい。
【実施例２】
【０１２３】
本実施例では、ブロックコマンドの発行元ホストが内部ホスト（ファイル処理用プログラム）か外部ホスト（ＳＡＮホスト３）かに応じてキャッシングを変える例を示す。図１８は、本実施例におけるブロックキャッシュ情報テーブル３１１の構成例である。図７に示した実施例１のブロックキャッシュ情報テーブル３１１との違いは、アクセス元ホストフィールド３１１５を有する点のみである。
【０１２４】
アクセス元ホストフィールド３１１５は、そのデータにアクセスしているホストが内部ホストか外部ホストか識別するための情報を、格納する。例えば、その情報は、「内部」、「外部」という文字列である。複数の内部ホスト／外部ホストがある場合に、それを識別するための番号が付加されていてもよい。以下、アクセス元ホストフィールド３１１５に「内部」を含む文字列が格納されている場合に、そのデータの属性は内部属性であるといい、「外部」を含む文字列が格納されている場合には、そのデータの属性は外部属性であるという。
【０１２５】
図１９は、本実施例におけるブロックライトコマンド処理フローの例である。図１５との違いは、ステップＳ５４０７〜ステップＳ５４０９の追加のみである。ステップＳ５４００のキャッシュヒットミス判定の前に、ブロックコマンド処理プログラム３０１に呼び出されたブロックキャッシュ制御プログラム３０２は、ボリュームが内部ホストに対して定義されたものか判定する（ステップＳ５４０７）。例えば、不図示のボリューム情報テーブルは、この情報を格納している。
【０１２６】
その判定結果肯定的ならば（ステップＳ５４０７：ＹＥＳ）、ブロックキャッシュ制御プログラム３０２は、キャッシュデータに内部属性を付与（ステップＳ５４０８）する。その判定結果が否定的であるならば（ステップＳ５４０７：ＮＯ）、ブロックキャッシュ制御プログラム３０２は、外部属性を付与する（ステップＳ５４０９）。
【０１２７】
具体的には、ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ情報テーブル３１１のアクセス元ホストフィールド３１１５に「内部」、「外部」等の文字列、若しくは、それに加えて複数のホスト間を識別するための番号を含めた文字列を格納する。
【０１２８】
また、内部か外部かを識別する別の方法として、ブロックコマンド発行プログラム２０３は、発行するライトコマンドに、内部であることを示す情報を付加してもよい。前述の各キャッシュデータの属性情報のように、アクセス元ホストを示す識別子をコマンド自体に含めても良いし、通信領域４０２の別の領域を経由して伝達しても良い。
【０１２９】
図２０は、本実施例におけるブロックキャッシュフリー領域確保処理の処理フローの例である。図１６に対して、ステップＳ５５０１がステップＳ５５０６、ステップＳ５５０７、ステップＳ５５０８に置き換わっている点が異なる。まずステップＳ５５０６では、ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ情報テーブル３１１を参照し、内部属性のキャッシュデータがブロックキャッシュ領域３２０に存在するかどうかを判定する。
【０１３０】
内部属性のキャッシュデータが存在するならば（ステップＳ５５０６：ＹＥＳ）、ブロックキャッシュ制御プログラム３０２は、内部属性キャッシュデータの中で最も古い（最終アクセス時刻が古い）データを解放し（ステップＳ５５０７）、空き領域を確保する（ステップＳ５５０２）。内部属性のキャッシュデータが存在しない場合（ステップＳ５５０６：ＮＯ）、ブロックキャッシュ制御プログラム３０２は、外部属性データの最古データを解放する（ステップＳ５５０８）。
【０１３１】
この変更によって、内部属性のデータは、ブロックキャッシュ領域３２０では優先的に解放される。これは、内部ホストのデータは、外部ホストのデータと異なり、ファイルキャッシュ領域２２０にもキャッシュされるため、ブロックキャッシュ領域３２０内でＬＲＵアルゴリズムを適用すると、外部ホストのデータが相対的にキャッシュ領域を少なく使うことになるので、それを防ぐ効果がある。
【０１３２】
図２１は、ブロックキャッシュフリー領域確保処理の処理フローの別の例である。図２０に対して、ステップＳ５５０６がステップＳ５５０９に置き換わっている点が異なる。ステップＳ５５０９では、ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ情報テーブル３１１を参照し、内部属性の最古データの最終アクセス時刻から所定の値を引いた値と、外部属性の最古データの最終アクセス時刻とを比較する。
【０１３３】
外部属性の最古データの最終アクセス時刻が大きい（新しい）ならば（ステップＳ５５０９：ＹＥＳ）、ブロックキャッシュ制御プログラム３０２は、ステップＳ５５０７に進む。外部属性の最古データの最終アクセス時刻が小さい（古い）ならば（ステップＳ５５０９：ＮＯ）、ブロックキャッシュ制御プログラム３０２は、Ｓ５５０８に進む。本例では、それらが同一の値の場合、ブロックキャッシュ制御プログラム３０２は、Ｓ５５０８に進むが、いずれのステップに進んでもよい。
【０１３４】
図２０の方法では内部属性のデータが必ず優先的に解放されるが、この方式ではアクセス時刻を考慮するため、より厳密なＬＲＵ管理が可能になる。
【０１３５】
図２２は、ブロックキャッシュフリー領域確保処理の処理フローの別の例である。図２０に対して、ステップＳ５５０６とステップＳ５５０７の間にステップＳ５５１０、ステップＳ５５１１が追加されている点が異なる。
【０１３６】
ステップＳ５５１０では、ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ領域３２０の内部属性の最古データと、その最古データの内部ホストのファイルキャッシュ領域２２０のキャッシュデータの最古データとの間で最終アクセス時刻を比較する。
【０１３７】
図示しないが、ファイルキャッシュ情報テーブル２１１は、図１８に示すブロックキャッシュ情報テーブル３１１と同様に、各エントリのアクセス元ホストを示すアクセス元ホストフィールドを含む。ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ情報テーブル３１１から内部属性の最古ブロックキャッシュデータの情報を取得し、ファイルキャッシュ情報テーブル２１１から、同一内部ホストの最古ファイルキャッシュデータの情報を取得することができる。
【０１３８】
比較の結果、ファイルキャッシュ領域のキャッシュデータの最古データの方が古ければ（ステップＳ５５１０：ＹＥＳ）、ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ領域３２０の内部属性の最古データをファイルキャッシュ領域２２０に移動し（ステップＳ５５１１）、ステップＳ５５０７に進む。
【０１３９】
内部ホストが複数ある場合は、ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ情報テーブル３１１のアクセス元ホストフィールド３１１５に格納された内部ホスト番号によって内部ホストを識別し、各内部ホストに対応するファイルキャッシュ領域（ファイルキャッシュデータ）について上記の処理を行う。
【０１４０】
これによって、内部ホストがそれぞれ使用しているファイルキャッシュ領域のデータがアクセス時刻に応じてブロックキャッシュ領域のデータと入れ替わり、外部ホストとの間で公平なキャッシュリプレース順序が実現できる。
【０１４１】
なお、この図２２の変更点は、元を図２０ではなく図２１、つまりステップＳ５５０６がステップＳ５５０９に置き換えられたとしても同様に有効である。本実施例では、ブロック処理用プログラムが、ファイル処理用プログラムから、データが内部ホストのものであることを知らせてもらうことにより、外部ホストのキャッシュデータを不当に圧迫することなく、システム全体として効率の良いキャッシュ制御が可能になる。
【０１４２】
本実施例によれば、ブロック処理プログラムのキャッシュにおいて、アクセス元ホストを示す情報を管理することで、優先してキャッシュしておくべきデータをキャッシュ領域に残すことができる。図２０〜図２２を参照して説明したように、内部ホストのデータを外部ホストのデータよりも優先してブロックキャッシュ領域３２０から廃棄することで、ストレージ装置４におけるキャッシュ利用効率を上げることができる。
【０１４３】
本実施例のブロックキャッシュフリー領域確保処理は、他の実施例に示す構成のストレージ装置に適用できるほか、他の実施例の構成とは別にストレージ装置に適用する、例えば、キャッシュ階層判定を伴うキャッシュ制御を実行しないストレージ装置に適用してもよい。
【実施例３】
【０１４４】
本実施例では、ブロックキャッシュ領域３２０にキャッシュした内部ホストのデータについて、その属性情報に応じて解放優先度を変える例を示す。図２３は、本実施例における、ブロックコマンド発行プログラム２０３のライトコマンド発行処理の処理フローの例である。
【０１４５】
まず、ブロックコマンド発行プログラム２０３は、当該データがｉ−ｎｏｄｅか否か（ステップＳ５７０１）、次にユーザデータか否か（ステップＳ５７００）、次にジャーナルデータか否か（ステップＳ５７０２）を判定する。それぞれの判定結果がＹＥＳであれば、ブロックコマンド発行プログラム２０３は、ステップＳ５７０５、ステップＳ５７０６、ステップＳ５７０７に進む。
【０１４６】
例えば、不図示のボリューム情報テーブルは、ボリューム及びボリューム内アドレスとデータの属性（ｉ−ｎｏｄｅ、ユーザデータ、ジャーナルデータのいずれかの種別）とを関連付ける情報を格納している。ブロックコマンド発行プログラム２０３は、ボリューム情報テーブルを参照することで、対象データのボリューム及びボリューム内アドレスから、対象データの属性を決定することができる。
【０１４７】
ブロックコマンド発行プログラム２０３は、ステップＳ５７０５では、ブロックコマンドの属性情報フィールドに「ユーザデータ」を設定し、ステップＳ５７０６では「ｉ−ｎｏｄｅ」を設定し、ステップ５７０７では「ジャーナル」を設定する。さらに、ブロックコマンド発行プログラム２０３は、アクセス元ホストとして内部属性を設定し（ステップＳ５７０３）、ブロックコマンドを発行する（ステップＳ５７０４）。
【０１４８】
ブロックキャッシュ情報テーブル３１１は、各エントリ属性情報フィールド３１１３において、当該エントリが、ｉ−ｎｏｄｅ、ユーザデータ、ジャーナルデータのいずれの属性であるかを示す値を格納する。
【０１４９】
ブロックのサイズやファイルシステムの構造によっては、一つのブロックにｉ−ｎｏｄｅとユーザデータ、ユーザデータとジャーナル等が混ざっていることもありうる。本実施例は、キャッシングの優先度に従い、キャッシュに残す要求の高いｉ−ｎｏｄｅ、次にユーザデータ、最後に再参照可能性の低いジャーナルデータとこの順で判定することにより、一部でも優先度の高いデータが混じっていれば優先される方式を採っている。本発明はこの方式に限定されない。例えば、ブロックコマンド発行プログラム２０３は、ブロックコマンドの属性情報フィールドに、「ユーザデータ、ｉ−ｎｏｄｅ」等、複数の属性を設定することもできる。
【０１５０】
図２４は、本実施例におけるブロックキャッシュフリー領域確保処理の処理フローの例である。図１６と異なるのは、ステップＳ５５０１がステップＳ５５１５〜ステップＳ５５１９に置き換えられている点である。
【０１５１】
まず、ブロックキャッシュ制御プログラム３０２は、ブロックキャッシュ情報テーブル３１１を参照して、属性情報（属性情報フィールド３１１３の値）が、「ジャーナル」であるキャッシュデータ（エントリ）があるか判定し（ステップＳ５５１５）、あれば（ステップＳ５５１５：ＹＥＳ）、「ジャーナル」属性データの最古データを解放する（ステップＳ５５１６）。
【０１５２】
無ければ（ステップＳ５５１５：ＮＯ）、次に、ブロックキャッシュ制御プログラム３０２は、「ユーザデータ」属性のキャッシュデータ（エントリ）があるか判定し（ステップＳ５５１７）、あれば（ステップＳ５５１７：ＹＥＳ）、「ユーザデータ」属性の最古データを解放する（ステップＳ５５１８）。それも存在しなければ（ステップＳ５５１７：ＮＯ）、ブロックキャッシュ制御プログラム３０２は、「ｉ−ｎｏｄｅ」属性のデータを解放する（ステップＳ５５１９）。
【０１５３】
本実施例によれば、ブロック処理用プログラムのキャッシュにおいて、ファイル処理用プログラムにおける情報の種別を管理することで、優先してキャッシングしておくべき情報をキャッシュに残すことができる。特に、再参照性が高くキャッシュに残す効果の高いｉ−ｎｏｄｅが優先的にキャッシュに残されるようになり、逆に再参照性の低いジャーナル属性のデータが優先的に解放されるようになる。これによりシステムのキャッシュ利用効率が向上する。
【０１５４】
本実施例のブロックキャッシュフリー領域確保処理は、他の実施例に示す構成のストレージ装置に適用できるほか、他の実施例の構成とは別にストレージ装置に適用してもよい。
【実施例４】
【０１５５】
本実施例は、ブロック処理用プログラム、ファイル処理用プログラムの他に、仮想サーバが同じＭＰＵ、ＭＰＵメモリを共有して動作する構成の例である。図２５は、本実施例のメモリ構成例である。本構成例は、図２の構成に加えて、仮想サーバ用メモリ１３を有している。図２６は、仮想サーバ用メモリ１３の構成例であり、仮想サーバ用メモリ１３は、仮想サーバテキスト領域９００を備え、仮想サーバテキスト領域９００はブロックコマンド発行プログラム９０１を備えている。
【０１５６】
仮想サーバは、例えばユーザが何らかの業務アプリケーションを動作させる目的で設定する。このアプリケーションがアクセスするデータを格納した論理ボリュームをこのストレージ装置内に持つことが考えられる。
【０１５７】
この場合、仮想サーバも実施例１、２、３におけるファイル処理用プログラムと同様に、内部ホストとして扱える。すなわち、ブロック処理用プログラムは、実施例２で示したように、ボリュームの定義先またはブロックコマンドの付随情報に基づいて、格納したデータのアクセス元ホスト情報として「内部」属性を付加する。
【０１５８】
この時、仮想サーバをファイル処理用プログラムと区別する。本実施例では仮想サーバが一つの例を示したが、複数あってもよく、複数仮想サーバがある場合に互いを区別するため、「内部サーバ１」等、仮想サーバである旨を示す情報と番号を付加してもよい。内部／外部を意識したキャッシュ解放順序については、実施例３と同様である。
【実施例５】
【０１５９】
図２７は、本実施例におけるブロック処理用メモリ１１の構成例である。図３と異なるのは、ブロック処理用テキスト領域３００にブロックファイル間キャッシュ容量調整プログラム３０３が追加されている点である。キャッシュ容量調整プログラム３０３は、周期的に実行され、ファイルキャッシュ領域２２０とブロックキャッシュ領域３２０のバランスを調整するプログラムである。これにより、ヒット率が向上するように、両領域のキャッシュ容量を適切に制御することができる。
【０１６０】
図２８は、キャッシュ容量調整プログラム３０３によって実行される、容量割り当て変更処理の処理フローの例である。
【０１６１】
まず、キャッシュ容量調整プログラム３０３は、ブロックキャッシュ最古最終アクセス時刻からファイルキャッシュ最古最終アクセス時刻を引いた時、その差が予め定められた閾値より大きいかどうかを判定する（ステップＳ５８００）。具体的には、キャッシュ容量調整プログラム３０３は、キャッシュ連携情報テーブル４０３のファイルキャッシュ最古最終アクセス時刻フィールド４０３０とブロックキャッシュ最古最終アクセス時刻フィールド４０３２を参照することで判定する。
【０１６２】
ステップＳ５８００での判定結果がＹＥＳの場合、キャッシュ容量調整プログラム３０３は、ファイルキャッシュ領域２２０からブロックキャッシュ領域３２０へ容量を移動するため、移動量の決定を行う（ステップＳ５８０１）。移動量は例えば固定量でも良く、あるいは最古最終アクセス時刻の差に一定の係数をかける等しても良い。
【０１６３】
また、ステップＳ５８００での判定結果がＮＯの場合、キャッシュ容量調整プログラム３０３は、ファイルキャッシュ最古最終アクセス時刻からブロックキャッシュ最古最終アクセス時刻を引いた時、その差が予め定められた閾値より大きいかどうか判定する（ステップＳ５８０２）。
【０１６４】
ステップ５８０２での判定結果がＹＥＳの場合、キャッシュ容量調整プログラム３０３は、ブロックキャッシュ領域３２０からファイルキャッシュ領域２２０へ容量を移動するため、移動量の決定を行う（ステップＳ５８０３）。ステップＳ５８０２での判定結果がＮＯの場合、キャッシュ容量調整プログラム３０３は、処理を終了する。ステップＳ５８０１ないしステップＳ５８０３で移動量の決定を行った後は、キャッシュ容量調整プログラム３０３はステップＳ５８０４に進み、割り当て容量の変更を行う。
【０１６５】
割り当て容量を変更するには、例えばファイルキャッシュ領域２２０の容量の一部をブロックキャッシュ領域３２０に移動する場合、キャッシュ容量調整プログラム３０３は、ファイルキャッシュ制御プログラム２０２によるファイルキャッシュ領域２２０のフリー領域確保処理によって移動量分のフリー容量を確保して、移動先の領域に加える。
【０１６６】
ファイル処理用メモリ１０とブロック処理用メモリ１１の管理方式によっては、所定量の連続空間単位でしか割り当ての変更を行えない場合がある。その場合、確保したフリー容量が物理的に連続な領域になるようにキャッシュ領域のキャッシュデータを配置しなおし（キャッシュデータが格納されている領域と交換する等し）、当該領域を割り当て変更可能な単位にする。
【０１６７】
本実施例のブロックキャッシュフリー領域確保処理は、他の実施例に示す構成のストレージ装置に適用できるほか、他の実施例の構成とは別にストレージ装置に適用してもよい。
【０１６８】
以上、本発明の実施形態を説明したが、本発明が上記の実施形態に限定されるものではない。当業者であれば、上記の実施形態の各要素を、本発明の範囲において容易に変更、追加、変換することが可能である。ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、ある実施例の構成に他の実施例の構成を加えることも可能である。
【０１６９】
上記の各構成、機能、処理部、処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、不揮発性半導体メモリ、ハードディスクドライブ、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記憶デバイス、または、ＩＣカード、ＳＤカード、ＤＶＤ等の計算機読み取り可能な非一時的データ記憶媒体に格納することができる。
【図１】
0005938528.tif 000002
【図２】
0005938528.tif 000003
【図３】
0005938528.tif 000004
【図４】
0005938528.tif 000005
【図５】
0005938528.tif 000006
【図６】
0005938528.tif 000007
【図７】
0005938528.tif 000008
【図８】
0005938528.tif 000009
【図９】
0005938528.tif 000010
【図１０】
0005938528.tif 000011
【図１１】
0005938528.tif 000012
【図１２】
0005938528.tif 000013
【図１３】
0005938528.tif 000014
【図１４】
0005938528.tif 000015
【図１５】
0005938528.tif 000016
【図１６】
0005938528.tif 000017
【図１７】
0005938528.tif 000018
【図１８】
0005938528.tif 000019
【図１９】
0005938528.tif 000020
【図２０】
0005938528.tif 000021
【図２１】
0005938528.tif 000022
【図２２】
0005938528.tif 000023
【図２３】
0005938528.tif 000024
【図２４】
0005938528.tif 000025
【図２５】
0005938528.tif 000026
【図２６】
0005938528.tif 000027
【図２７】
0005938528.tif 000028
【図２８】
0005938528.tif 000029