(57)【特許請求の範囲】
【請求項１】
ホストコンピュータからのＩ／Ｏリクエストを受け付ける情報処理装置であって、
前記情報処理装置は、第１のメモリで構成された第１のキャッシュメモリと、
前記第１のメモリよりもアクセス性能が低い第２のメモリで構成された第２のキャッシュメモリと、
前記第１及び第２のキャッシュメモリに接続された制御デバイスとを備え、
前記制御デバイスは、
データが管理される１以上の論理ボリュームにおける所定の領域毎に、当該領域のデータに対するアクセスに関する情報を収集し、
前記アクセスに関する情報に基づいて、アクセス速度に関する閾値を決定し、
前記閾値よりも前記データに対するアクセス速度が高い場合には、前記第２のキャッシュメモリよりも前記第１のキャッシュメモリに優先的に前記データをキャッシュする、
情報処理装置。
【請求項２】
前記制御デバイスは、前記閾値よりも前記データに対するアクセス速度が遅い場合に、前記第１のキャッシュメモリよりも前記第２のキャッシュメモリに優先的に前記データをキャッシュする
請求項１に記載の情報処理装置。
【請求項３】
前記第２のキャッシュメモリよりもアクセス性能の高いバッファメモリを更に備え、
前記制御デバイスは、前記第２のキャッシュメモリに対して前記データを格納する際には、前記バッファメモリに前記データを格納し、その後、前記バッファメモリから前記第２のキャッシュメモリに格納する
請求項１に記載の情報処理装置。
【請求項４】
前記第１のメモリは、ＲＡＭ（Random  Access  Memory）であり、
前記第２のメモリは、フラッシュメモリである
請求項１に記載の情報処理装置。
【請求項５】
前記制御デバイスは、前記データがシーケンシャルアクセスの対象となるデータである場合に、前記第２のキャッシュメモリよりも前記第１のキャッシュメモリに優先的にキャッシュする
請求項１に記載の情報処理装置。
【請求項６】
前記制御デバイスは、
前記データが最終的に管理されるストレージデバイスが前記第２のメモリで構成されている場合には、前記第１のキャッシュメモリに優先的にキャッシュする
請求項１に記載の情報処理装置。
【請求項７】
前記制御デバイスは、前記データが一時的に使用されるデータである場合に、前記第１のキャッシュメモリに優先的にキャッシュする
請求項１に記載の情報処理装置。
【請求項８】
ホストコンピュータからのＩ／Ｏリクエストを受け付ける情報処理装置のキャッシュ制御方法であって、
前記情報処理装置は、第１のメモリで構成された第１のキャッシュメモリと、
前記第１のメモリよりもアクセス性能が低い第２のメモリで構成された第２のキャッシュメモリと、
前記第１及び第２のキャッシュメモリに接続された制御デバイスとを備え、
前記制御デバイスが、
データが管理される１以上の論理ボリュームにおける所定の領域毎に、当該領域のデータに対するアクセスに関する情報を収集し、
前記アクセスに関する情報に基づいて、アクセス速度に関する閾値を決定し、
前記閾値よりも前記データに対するアクセス速度が高い場合には、前記第２のキャッシュメモリよりも前記第１のキャッシュメモリに優先的に前記データをキャッシュする、
キャッシュ制御方法。
【請求項９】
前記制御デバイスは、前記閾値よりも前記データに対するアクセス速度が遅い場合、前記第１のキャッシュメモリよりも前記第２のキャッシュメモリに優先的に前記データをキャッシュする、
請求項８に記載のキャッシュ制御方法。
【請求項１０】
前記データがシーケンシャルアクセスの対象となるデータである場合は、前記第２のキャッシュメモリよりも前記第１のキャッシュメモリに優先的にキャッシュする
請求項８に記載のキャッシュ制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データのキャッシュ制御の技術に関する。
【背景技術】
【０００２】
メモリの一例として、半導体不揮発性メモリであるフラッシュメモリが知られている。フラッシュメモリは、ＤＲＡＭやＳＲＡＭ等の揮発性メモリ（以下、ＲＡＭと表記する。）に比べて記憶密度を高めやすく、容量当たりのコスト（ビットコスト）を安くすることが可能である。また、フラッシュメモリは、磁気ディスク等に比べて高速なデータアクセスが可能である。そのため、フラッシュメモリをディスクキャッシュとして利用することで安価な大容量ディスクキャッシュを作ることが可能となる。【０００３】
しかし、フラッシュメモリには次のような制限がある。まず、フラッシュメモリの各ビットの更新は１から０（または０から１）の一方向に限定される。そして、ビットに対して逆の変更が必要な場合は、ブロックからデータの消去を行って一旦ブロック全体を１（または０）にする必要がある。ここで、フラッシュメモリが有している複数のブロック（物理ブロック）をブロックと呼ぶ。各ブロックは、複数のページ（物理ページ）で構成されている。また、フラッシュメモリにおけるブロックの消去回数には上限があり、例えばＳＬＣ（Single  Level  Cell）のＮＡＮＤ型フラッシュメモリの場合には、消去回数の上限が、一万から十万回程度であり、ＭＬＣ（Multiple  Level  Cell）のＮＡＮＤ型フラッシュメモリの場合には、消去回数の上限が数千回程度である。そのため、フラッシュメモリをディスクキャッシュとして使用する場合、高頻度な書き換えを行うと、比較的短期間に消去回数が上限に達してしまい、使えなくなるおそれがある。【０００４】
また、フラッシュメモリのアクセス性能はＲＡＭに比べると低いため、ＲＡＭの代わりにフラッシュメモリをディスクキャッシュに用いると、ディスクキャッシュがシステム性能のボトルネックになるおそれがある。【０００５】
また、フラッシュメモリ以外にも相変化メモリ、磁気抵抗メモリ、抵抗変化メモリなどの不揮発性半導体メモリも開発されており、これらの不揮発性半導体メモリもＲＡＭに比べて記憶密度を高めやすく、ＲＡＭに比べて安価で大容量なメモリとなる可能性がある。しかしながら、これらの不揮発性半導体メモリも、一般的には、ＲＡＭに比べると低速であったり、あるいは短寿命であったりする。【０００６】
キャッシュに関する技術としては、例えば特許文献１に開示された技術のように、ＲＡＭなどの揮発性メモリを一時格納先とし、不揮発性メモリを補助的に使用する技術が知られている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】米国特許第８１３１９３０号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００８】
フラッシュメモリなどの不揮発性半導体メモリは、一般的にＲＡＭに比べてアクセス性能が低く、ＨＤＤに比べてアクセス性能が高い特性を有する。そのため、特許文献１のように、フラッシュメモリをＲＡＭキャッシュと、ＨＤＤ等のデータの最終格納先（最終ストレージデバイス）との間のキャッシュとして使用する方式が用いられている。【０００９】
しかしながら、先に述べたとおりフラッシュメモリなどの不揮発性半導体メモリは消去回数の制約があり、高頻度な書き換えが行われる場合、比較的短期間のうちに消去回数が上限に達し、使用できなくなる（つまり、短寿命である）。一般にディスクキャッシュのアクセス頻度は、ＨＤＤ等の最終ストレージデバイスのアクセス頻度よりも高いため、フラッシュメモリをディスクキャッシュとして用いる場合、フラッシュメモリを最終ストレージデバイスとして用いる場合に比べ、より早期に使用できなくなる（長期間の使用に耐えられない）可能性が高い。フラッシュメモリ部分が交換可能な装置構成であったとしても、フラッシュメモリ部分が短寿命であれば、当該部分の交換頻度が高くなるため、装置の保守管理コストを押し上げることになる。【００１０】
また、特許文献１のようにＲＡＭとフラッシュメモリとの階層構造を持つキャッシュ方式では、例えばリード対象データがフラッシュメモリに格納されていた場合、リード対象データを一旦ＲＡＭキャッシュにステージングした後に当該データをホスト計算機へ送信するため、ステージング処理のオーバヘッドが発生する。昨今のストレージシステムに対する要求性能の伸びを鑑みるに、この処理オーバヘッドは無視することのできないものであり、より処理オーバヘッドの小さいＩ／Ｏ処理方式が求められる。【００１１】
また、前述のとおり、フラッシュメモリなどの不揮発性半導体メモリのアクセス性能は一般的にＲＡＭに比べて低いため、不揮発性半導体メモリを用いたディスクキャッシュがシステム性能のボトルネックになるおそれがある。
【課題を解決するための手段】
【００１２】
本発明の情報処理装置は、特性の異なる複数種類のキャッシュメモリを有し、キャッシュ対象のデータのアクセス特性に基づいて、データのキャッシュ先とするキャッシュメモリの種類を決定し、決定した種類のキャッシュメモリにデータをキャッシュする。情報処理装置は、例えば、複数のストレージデバイスと、複数のストレージデバイスに接続されたコントローラとを有したストレージ装置であって良い。コントローラが、前述の複数種類のキャッシュメモリと、それら複数種類のキャッシュメモリに接続された制御デバイスとを有して良い。複数のストレージデバイスの各々は、例えば、後述の最終ストレージデバイスで良い。【００１３】
本発明の一実施形態では、特性の異なる複数種類のキャッシュメモリとして、フラッシュメモリとＲＡＭが用いられる。フラッシュメモリとＲＡＭの特性を比較すると、フラッシュメモリはＲＡＭと比べて、アクセス性能が低く、また書き換え回数に制限がある等の特性の違いがあるので、情報処理装置は、キャッシュメモリに格納されるデータが、ＲＡＭの特性に適合するデータは、ＲＡＭを用いたキャッシュメモリにキャッシュし、フラッシュメモリの特性に適合するデータは、フラッシュメモリを用いたキャッシュメモリにキャッシュする。具体的には、たとえば高スループットが求められる、あるいは更新頻度が高いと判断されるデータは、フラッシュメモリを用いたキャッシュメモリには書き込まず、ＲＡＭを用いたキャッシュメモリに直接キャッシュするよう制御する。
【発明の効果】
【００１４】
本発明によれば、高価なＲＡＭに加え、ＲＡＭよりも低価格でＨＤＤよりもアクセス性能が高いフラッシュメモリなどの記憶媒体をキャッシュとして適切に利用することができるようになるので、低価格で大容量のキャッシュを備えた情報処理装置を提供することができる。
【図面の簡単な説明】
【００１５】
【図１】図１は、本発明に係るキャッシング先選択処理の概要を示す概念図である。
【図２】図２は、実施例１に係る情報システムの第１の構成例を示す図である。
【図３】図３は、実施例１に係る情報システムの第２の構成例を示す図である。
【図４】図４は、実施例１に係るＦＭボードの構成図である。
【図５】図５は、実施例１に係るストレージコントローラのＲＡＭの構成図である。
【図６】図６は、実施例１に係るアクセスモニタテーブルの構成図である。
【図７】図７は、実施例１に係るキャッシュ管理データ構造の概念図である。
【図８】図８は、実施例１に係るキャッシュ管理データ構造の一部のデータ構造を示す図である。
【図９】図９は、実施例１に係るダーティキューおよびクリーンキューのデータ構造を示す図である。
【図１０】図１０は、実施例１に係るＦＭフリーキューおよびＲＡＭフリーキューのデータ構造を示す図である。
【図１１】図１１は、実施例１に係るリードコマンド処理のフローチャートである。
【図１２】図１２は、実施例１に係るステージング処理のフローチャートである。
【図１３】図１３は、実施例１に係るデータ送信処理のフローチャートである。
【図１４】図１４は、実施例１に係るキャッシュ割り当て処理のフローチャートである。
【図１５】図１５は、実施例１に係るＦＭ優先セグメント割り当て処理のフローチャートである。
【図１６】図１６は、実施例１に係るＲＡＭ優先セグメント割り当て処理のフローチャートである。
【図１７】図１７は、実施例１に係るアクセスモニタ集計処理のフローチャートである。
【図１８】図１８は、実施例１に係る判定用閾値算出方法を説明する図である。
【図１９】図１９は、実施例１に係るライトコマンド処理のフローチャートである。
【図２０】図２０は、実施例１に係るデータ受領処理（ＲＡＭ）のフローチャートである。
【図２１】図２１は、実施例１に係るデータ受領処理（ＦＭ）のフローチャートである。
【図２２】図２２は、実施例１に係るＦＭデータ読み出し処理のフローチャートである。
【図２３】図２３は、実施例１に係るＦＭデータ書き込み処理のフローチャートである。
【図２４】図２４は、実施例２に係る情報システムの構成図である。
【図２５】図２５は、実施例２に係るデータ入出力処理の概要を示す図である。
【図２６】図２６は、実施例３に係る情報システムの構成を示す図である。
【図２７】図２７は、実施例３に係るデータ入出力処理の概要を示す図である。
【図２８】図２８は、実施例４に係るジョブ制御テーブルの構成図である。
【図２９】図２９は、実施例４に係るリードコマンド処理の第１のフローチャートである。
【図３０】図３０は、実施例４に係るリードコマンド処理の第２のフローチャートである。
【図３１】図３１は、実施例４に係るステージング処理のフローチャートである。
【図３２】図３２は、実施例４に係るデータ送信処理のフローチャートである。
【図３３】図３３は、実施例５に係るメモリ種類見直し処理のフローチャートである。
【図３４】図３４は、本発明の実施例に係る、論理ボリュームとキャッシュ管理データとの関係を表した概念図である。
【発明を実施するための形態】
【００１６】
最初に、本発明の概要を説明する。図１は、本発明の情報処理装置の一例であるストレージシステムにおける、キャッシング先選択処理の概要を示す概念図である。
【００１７】
企業や組織で扱われる電子情報は急増していることから、大量のデータをより高速に処理するために、ユーザのＩＴシステムに対する要求性能は年々高くなってきている。一方でＩＴシステムのコストを削減したいというニーズも高く、ユーザからは、高性能であるとともに、低価格な情報処理装置が求められている。たとえば大量のデータアクセスが発生する計算機システムでは、データを格納するためのストレージシステムの性能の良し悪しが、システムの性能を大きく左右する。
【００１８】
ストレージシステムには、そのアクセス性能を向上させるために、キャッシュ（ディスクキャッシュ）が設けられる。一般にキャッシュには、データの最終的な格納先（最終ストレージデバイス）であるハードディスク等よりもアクセス性能の高い記憶媒体である、ＤＲＡＭやＳＲＡＭなどのランダムアクセスメモリ（以下、「ＲＡＭ」と呼ぶ）が用いられることが多い。ＲＡＭの欠点は、高価格（ビットコストが高い）ことであり、ＲＡＭを用いたキャッシュをストレージシステムに多く搭載すれば、ストレージシステムの平均的な性能を引き上げることはできるが、高価格になるという問題がある。
【００１９】
本発明におけるストレージシステムは、図１に示すように、ストレージコントローラ３０上にキャッシュとして、ＦＭ３２１とＲＡＭ３４を搭載し、最終ストレージデバイスであるＨＤＤ４０やＳＳＤ４１に格納されるデータを、ＦＭ３２１またはＲＡＭ３４のいずれかにキャッシュする。ＦＭはＲＡＭと比べて、低ビットコストであるため、低価格で大容量のキャッシュ記憶領域を提供することができる。
【００２０】
一方ＦＭとＲＡＭの特性を比較すると、ＦＭはＲＡＭと比べてアクセス性能が低く、また書き換え回数に制限がある等の特性の違いがあるので、ストレージコントローラ３０は、キャッシュ対象のデータのアクセス特性に応じて、ＲＡＭの特性に適合するデータは、キャッシュ先としてＲＡＭ３４を選択し、フラッシュメモリの特性に適合するデータは、キャッシュ先としてＦＭ３２１を選択する制御を行う。データのアクセス特性としては、例えば、キャッシュ対象データのアクセス頻度や、アクセスパターン等が用いられ、ストレージコントローラ３０はたとえば、高スループットが求められる、あるいは更新頻度が高いと判断されるデータは、フラッシュメモリを用いたキャッシュメモリには書き込まず、ＲＡＭ３４をキャッシュ先として選択する。
【００２１】
これにより、高価なＲＡＭに加え、ＲＡＭよりも低価格でＨＤＤよりもアクセス性能が高いフラッシュメモリなどの記憶媒体をキャッシュとして適切に利用することができるストレージシステムを実現できる。本発明におけるストレージシステムは特に、オンライントランザクション処理（ＯＬＴＰ）やＥＲＰ（Enterprise  Resource  Planning）等の大量のデータに対するデータアクセスを行う業務アプリケーションが実行される、計算機システムにおける利用に好適である。
【００２２】
以下では、いくつかの実施例について、図面を参照して説明する。なお、以後の説明では「ａａａテーブル」等の表現にて情報を説明する場合があるが、これら情報は、テーブル等のデータ構造以外で表現されていてもよい。そのため、データ構造に依存しないことを示すために「ａａａテーブル」等について「ａａａ情報」と呼ぶことがある。
【００２３】
また、以後の説明では「プログラム」を主語として説明を行う場合があるが、プログラムは、プロセッサ（典型的にはＣＰＵ（Central  Processing  Unit））を含む制御デバイスによって実行されることで、定められた処理をメモリ及びＩ／Ｆ（インタフェース）を用いながら行うため、プロセッサ又は制御デバイスを主語とした説明としてもよい。制御デバイスは、プロセッサであっても良いし、プロセッサとハードウェア回路を含んでいても良い。また、プログラムを主語として開示された処理は、ホスト計算機、ストレージシステムが行う処理としてもよい。また、プログラムの一部または全ては専用ハードウェアによって実現されてもよい。また、各種プログラムはプログラム配布サーバや、計算機が読み取り可能な記憶メディアによって各計算機にインストールされてもよい。記憶メディアとしては、例えば、ＩＣカード、ＳＤカード、ＤＶＤ等であってもよい。
【実施例１】
【００２４】
まず、実施例１に係る情報システムについて説明する。【００２５】
図２は、実施例１に係る情報システムの第１の構成例を示す図である。【００２６】
情報システムは、ホスト計算機１０と、ホスト計算機に直接あるいはネットワークを介して接続されるストレージシステム２０（情報処理装置の一例）とを有する。ストレージシステム２０は、ストレージコントローラ３０と、ストレージコントローラ３０に接続されるＨＤＤ（Hard  Disk  Drive）４０および／またはＳＳＤ（Solid  State  Drive）４１とを有する。ＨＤＤ４０および／またはＳＳＤ４１は、ストレージデバイスの一例である。ＨＤＤ４０および／またはＳＳＤ４１は、ストレージコントローラ３０に内蔵されていてもよい。【００２７】
ストレージコントローラ３０は、一つ以上のフロントエンドインタフェース（ＦＥ  Ｉ／Ｆ）３１、１つ以上のバックエンドインタフェース（ＢＥ  Ｉ／Ｆ）３５、１つ以上のＦＭ（フラッシュメモリ）ボード３２、ＣＰＵ３３、およびＲＡＭ（Random  Access  Memory）３４を含む。ＲＡＭ３４は、メモリ（メモリデバイス）であり、キャッシュメモリの一例である。【００２８】
本発明の実施例１に係るストレージコントローラ３０は、複数のストレージデバイス（ＨＤＤ４０やＳＳＤ４１）から１ないし複数の論理ボリューム（実体的な論理ボリューム）を形成して、ホスト計算機１０に提供する（ホスト計算機１０が当該形成された論理ボリュームを認識できるようにする）。あるいは、いわゆるシンプロビジョニング技術によって形成される論理ボリューム（仮想的な論理ボリュームであって、当該仮想的な論理ボリューム内の各領域には、動的に記憶領域が割り当てられる）をホスト計算機１０に提供する。ホスト計算機１０は、この提供された論理ボリューム（実体的な論理ボリュームまたは仮想的な論理ボリューム）及び論理ボリューム内の位置（論理ブロック番号。ＬＢＡと略記されることもある）を指定したＩ／Ｏコマンド（ライトコマンド又はリードコマンド）を発行して、論理ボリュームに対するデータのリード・ライト処理を行う。ただし、ストレージコントローラ３０が論理ボリュームを提供するものでない態様、たとえばストレージシステム２０が、各ＨＤＤ４０、各ＳＳＤ４１を、それぞれ単一の記憶デバイスとしてホスト計算機１０に提供する構成であっても、本発明は有効である。なお、ホスト計算機が認識する論理ボリュームのことを、論理ユニット（Logical  Unit。ＬＵと略記されることもある）と呼ぶこともあり、本明細書においては特に断りのない限り、論理ボリュームと論理ユニット（ＬＵ）の語は、いずれも同一の概念を意味するものとして用いられている。【００２９】
ＦＥ  Ｉ／Ｆ３１は、ホスト計算機１０と通信するためのインタフェースデバイスである。ＢＥ  Ｉ／Ｆ３５は、ＨＤＤ４０又はＳＳＤ４１と通信するためのインタフェースデバイスである。ＢＥ  Ｉ／Ｆ３５は、例えばＳＡＳやFibre  Channelのインタフェースデバイスである。ＦＭボード３２は、ＦＭチップ３２１（図４参照）を搭載したボードである。ＣＰＵ３３は、各種処理を実行する。ＲＡＭ３４は、ＣＰＵ３３で実行するプログラム及び各種テーブルを記憶する。ＲＡＭ３４は、キャッシュメモリ領域を含んでおり、キャッシュメモリ領域は、複数のキャッシュセグメントで構成される。キャッシュセグメントは、ＣＰＵ３３によって管理される単位領域である。例えば、ＲＡＭ３４におけるキャッシュメモリ領域では、キャッシュセグメント単位で、領域確保、データの読出し及びデータの書込みが行われて良い。キャッシュメモリ領域には、最終ストレージデバイスから読み出されるデータ、及び、最終ストレージデバイスに書き込まれるデータ（典型的には、ホスト計算機１０からのＩ／Ｏコマンド（ライトコマンド又はリードコマンド）に従うデータであるユーザデータ）がキャッシュされる（一時的に格納される）。最終ストレージデバイスとは、Ｉ／Ｏコマンドで指定されているＩ／Ｏ先に従いストレージコントローラ３０によってＩ／Ｏが行われるデータが格納されるストレージデバイスである。具体的には、例えば、Ｉ／Ｏコマンド（ライトコマンド）に従うデータは、一旦はキャッシュメモリ領域に格納されるが、その後、Ｉ／Ｏコマンドで指定されている論理ユニット（論理ボリューム）を構成しているストレージデバイスの領域（論理ボリュームが仮想的な論理ボリュームである場合には、当該論理ボリュームの領域に対して割り当てられているストレージデバイスの領域）に格納される。最終ストレージデバイスとは、この論理ボリュームを形成するストレージデバイスのことを意味する。本実施例では、最終ストレージデバイスは、ＨＤＤ又はＳＳＤであるが、他種のストレージデバイス、例えば、複数のストレージデバイスを有する外部ストレージシステムであっても良い。【００３０】
図２では、情報システムの各構成要素を１つずつ図示しているが、冗長化、高性能化、あるいは大容量化などのために、各構成要素を複数備えるようにしてもよい。また、各構成要素間はネットワークを介して接続されてもよい。ネットワークは、スイッチやエキスパンダなどを含んでいても良い。情報システムとしては、例えば図３のような構成が考えられる。【００３１】
図３は、実施例１に係る情報システムの第２の構成例を示す図である。【００３２】
図３に示す情報システムは、２つのストレージコントローラ３０（ストレージコントローラＡ、ストレージコントローラＢ）を含む、これらのストレージコントローラ３０は、ノードインタフェース（ノードＩ／Ｆ）３６を介して接続される。ノードインタフェース３６は、例えばInfiniband、Fibre  Channel（ＦＣ）、Ethernet（登録商標）等のネットワークインタフェースのデバイスでもよく、また、PCI  Expressのようなバスのインタフェースのデバイスでもよい。【００３３】
これらストレージコントローラ３０は、Fibre  Channel、Ethernet、Infiniband等のネットワーク５０を介してホスト計算機１０に接続される。図３では、ネットワーク５０をSAN(Storage  Area  Network)と総称する。【００３４】
情報システムは、ドライブエンクロージャ６０を有する。ドライブエンクロージャ６０は、複数のＨＤＤ４０やＳＳＤ４１を格納する。複数のＨＤＤ４０やＳＳＤ４１は、ドライブエンクロージャ６０内のエキスパンダ４２に接続される。エキスパンダ４２は、各ストレージコントローラ３０のＢＥ  Ｉ／Ｆ３５に接続される。ＢＥ  Ｉ／Ｆ３５がＳＡＳのインタフェースデバイスである場合には、エキスパンダ４２は、例えばSAS  Expanderであり、ＢＥ  Ｉ／Ｆ３５がFibre  Channelのインタフェースデバイスである場合、エキスパンダ４２は、例えばＦＣスイッチである。【００３５】
図３では、ストレージシステム２０は、ドライブエンクロージャ６０を１つ備えているが、複数のドライブエンクロージャ６０を備えてもよい。この場合、ＢＥ  Ｉ／Ｆ３５の複数のポートのそれぞれに対して各ドライブエンクロージャ６０を直接接続してもよいし、ＢＥ  Ｉ／Ｆ３５のポートに、スイッチを経由して複数のドライブエンクロージャ６０を接続してもよい。また、各ドライブエンクロージャ６０のエキスパンダ４２同士をカスケード接続することで複数のドライブエンクロージャ６０を数珠繋ぎにして、ＢＥ  Ｉ／Ｆ３５のポートに接続するようにしてもよい。【００３６】
図４は、実施例１に係るＦＭボードの構成図である。【００３７】
ＦＭボード３２は、一つ以上のフラッシュメモリ（ＦＭ）チップ３２１、ＦＭアダプタ３２０、バスコネクタ３２２、バッファメモリ３２３、及びバッテリ３２４を含む。なお、本実施例及び以降の実施例では、フラッシュメモリチップ３２１を備えたメモリボードであるＦＭボード３２を代表例として説明をするが、ＦＭボード３２に代えて、フラッシュメモリ以外の不揮発半導体メモリ、例えばＰＲＡＭ（相変化メモリ）やＭＲＡＭ（磁気抵抗メモリ）、ＲｅＲＡＭ（抵抗変化メモリ）のチップを備えたメモリボードを用いてもよい。ＦＭボード３２のようなメモリボードは、メモリ（メモリデバイス）であって、キャッシュメモリの一例である。【００３８】
ＦＭチップ３２１は、例えば、ＮＡＮＤ型のフラッシュメモリのチップである。本実施例では、複数のＦＭチップ３２１は、キャッシュメモリ領域として使用され、ＣＰＵ３３によって、複数のキャッシュセグメントとして管理される。１つのキャッシュセグメントのサイズは、例えば、ＦＭチップ３２１の消去単位であるブロックの複数個分のサイズである。ＦＭチップ３２１は、ＲＡＭ３４よりもアクセス性能が低く、また、データの消去回数に制限があるという特性を有している。１つのＦＭチップ３２１は、複数のブロック（物理ブロック）で構成されている。１つの物理ブロックは、複数のページ（物理ページ）で構成されている。【００３９】
バスコネクタ３２２は、ストレージコントローラ３０上のPCI  ExpressなどのバスにＦＭボード３２を接続するための接続端子である。例えば、ＦＭボード３２とストレージコントローラ３０の主基板とを一体のものとして実装する場合は、バスコネクタ３２２を省略する構成としてもよい。【００４０】
バッファメモリ３２３は、例えば、ＤＲＡＭやＳＲＡＭなどのＲＡＭであり、外部からＦＭチップ３２１へのデータ転送時や、ＦＭチップ３２１から外部へのデータ転送時のバッファとして用いられる。バッファメモリ３２３は、ＦＭプロセッサ３２０ｂが実行するプログラムや、ＦＭプロセッサ３２０ｂやＤＭＡＣ３２０ｄ等が使用するデータを格納してもよい。【００４１】
バッテリ３２４は、バッファメモリ３２３によるデータの記憶に必要な電力のバックアップを行うためのバッテリである。従って、バッファメモリ３２３は、外部からの電力供給が遮断された場合であっても、バッテリ３２４の電力により、継続してデータを記憶しておくことができる。【００４２】
ＦＭアダプタ３２０は、ＦＭコントローラ３２０ａ、ＦＭプロセッサ３２０ｂ、バスコントローラ３２０ｃ、ＤＭＡ（Direct  Memory  Access）コントローラ（ＤＭＡＣ）３２０ｄ、およびＲＡＭコントローラ３２０ｅを含む。ＦＭアダプタ３２０は、例えば、ＡＳＩＣなどの集積回路である。なお、本実施例では、ＦＭアダプタ３２０は、一つの集積回路に各構成の回路群を内蔵しているが、これらの回路を複数の集積回路に分割して実装してもよい。また、ある回路（例えばＤＭＡＣ３２０ｄ）の機能を別の回路（例えばＦＭプロセッサ３２０ｂ）で代替してもよい。【００４３】
図５は、実施例１に係るストレージコントローラのＲＡＭの構成図である。【００４４】
ＲＡＭ３４は、例えばＤＲＡＭやＳＲＡＭ等のランダムアクセスメモリである。ＲＡＭ３４は、ＣＰＵ３３が実行するストレージ制御プログラム３４０、キャッシュ制御情報３４１、アクセスモニタテーブル３４２、およびジョブ制御テーブル３４４を格納する。また、ＲＡＭ３４には、データをキャッシュして管理するための複数のキャッシュセグメント３４３が格納される。このキャッシュセグメント３４３に、ＨＤＤ４０又はＳＳＤ４１に格納されるデータ、又は、ＨＤＤ４０又はＳＳＤ４１から読み出されたデータをキャッシュすることができる。【００４５】
ストレージ制御プログラム３４０は、キャッシュ制御プログラムの一例であり、キャッシュに関わる各種制御処理を実行する。なお、処理の詳細については後述する。キャッシュ制御情報３４１は、キャッシュディレクトリ１００（図７参照）と、クリーンキュー（図９参照）と、ダーティキュー（図９参照）と、ＦＭフリーキュー２００（図７参照）と、ＲＡＭフリーキュー３００（図７参照）が含まれる。キャッシュ制御情報３４１に関するデータ構造については後述する。【００４６】
ＲＡＭ３４の実装方法としては、例えば基板上に複数のＲＡＭのメモリチップを搭載したＤＩＭＭのようなメモリモジュールを構成しておき、このメモリモジュールをストレージコントローラ３０の主基板上のメモリスロットに接続するようにしてもよい。なお、ストレージコントローラ３０の主基板と別の基板上にＲＡＭを搭載する構成とすることにより、ストレージコントローラ３０の主基板とは独立に保守交換やＲＡＭ容量増設を行えるようにすることができる。また、停電など不慮の障害が発生した場合に、ＲＡＭ３４上の記憶内容が消失することを避けるために、バッテリを設けて、停電時等にもＲＡＭ３４上の記憶内容を維持できるような構成にしてもよい。【００４７】
図６は、実施例１に係るアクセスモニタテーブルの構成図である。【００４８】
アクセスモニタテーブル３４２は、ストレージシステム２０における論理ユニット（論理ボリューム）内の各部分領域に対するアクセスの頻度や、データ読み出し・書き込みの速度を集計するための情報を記憶するとともに、集計結果を記憶するためのテーブルである。アクセスモニタテーブル３４２は、論理ユニット内の各部分領域のそれぞれに対して、例えば、リード速度３４２ａ、ライト速度３４２ｂ、リード頻度３４２ｃ、ライト頻度３４２ｄ、リード量(バイト数)カウンタ３４２ｅ、ライト量カウンタ３４２ｆ、リードコマンドカウンタ３４２ｇ、ライトコマンドカウンタ３４２ｈ、およびモニタ開始時刻３４２ｉを記憶する。部分領域（つまり１つのアクセスモニタテーブル３４２でアクセス頻度やアクセス速度を集計する単位）のサイズとしては、様々なサイズ（ただし論理ボリュームのサイズよりは小さいサイズ）を選択可能であるが、後述する通り、本発明におけるストレージシステムでは、アクセスモニタテーブル３４２の情報に基づいて、キャッシュセグメントの割り当てを行うので、部分領域のサイズを、キャッシュセグメントと同じサイズとする、あるいはキャッシュセグメントの整数倍とすることが、好ましい。【００４９】
リード速度３４２ａは、論理ユニット内の部分領域に対するリード速度（例えば、単位は、ＭＢ／Ｓｅｃ）である。ライト速度３４２ｂは、論理ユニット内の部分領域に対するライト速度（例えば、単位は、ＭＢ／Ｓｅｃ）である。リード頻度３４２ｃは、論理ユニット内の部分領域に対するリードの発生頻度である。ライト頻度３４２ｄは、論理ユニット内の部分領域に対するライトの発生頻度である。リード量カウンタ３４２ｅは、論理ユニット内の部分領域においてリードされたデータのデータ量のカウンタである。ライト量カウンタ３４２ｆは、論理ユニット内の部分領域においてライトされたデータのデータ量のカウンタである。リードコマンドカウンタ３４２ｇは、論理ユニット内の部分領域においてリードを行ったコマンドの数のカウンタである。ライトコマンドカウンタ３４２ｈは、論理ユニット内の部分領域においてライトを行ったコマンドの数のカウンタである。モニタ開始時刻３４２ｉは、論理ユニット内の部分領域に対するモニタを開始した時刻である。リード量カウンタ３４２ｅ、ライト量カウンタ３４２ｆ、リードコマンドカウンタ３４２ｇ、およびライトコマンドカウンタ３４２ｈが集計用のカウンタであり、リード速度３４２ａ、ライト速度３４２ｂ、リード頻度３４２ｃ、およびライト頻度３４２ｄが、集計結果である。ストレージシステム２０における論理ユニット内の各部分領域に対するアクセスの頻度（リード頻度、ライト頻度）や、データ読み出し・書き込みの速度（リード速度、ライト速度）を集計するアクセスモニタ集計処理（図１７参照）については後述する。【００５０】
続いて、図７以降では、実施例１に係るキャッシュ管理データ構造について説明するが、その前に、ボリューム（論理ボリューム）とキャッシュ管理データとの関係について、概要を説明する。図３４は、本発明の実施例における、論理ボリューム、スロット、キャッシュセグメントの関係を示す概念図である。ホスト計算機１０が論理ボリューム１０００にアクセスする際、最小アクセス単位はブロック（たとえば５１２バイト）であり、論理ボリュームの各ブロックには、論理ブロックアドレス（ＬＢＡ。あるいは本明細書では、論理アドレスと呼ぶこともある）が付与されている（図３４の要素１０１０は論理ブロックアドレスを表している）。また、ストレージシステム２０では、論理ボリューム上の記憶領域へのアクセス時等に排他制御を行うが、排他制御の単位として、スロット１１００という概念が定義されている。スロット１１００のサイズは、本発明の実施例では、２５６ＫＢ（つまり５１２ブロック）としているが、その他のサイズを採用しても良い。各スロット１１００には一意な識別番号が付与されており、それをスロットＩＤと呼ぶ。なお、図３４において、要素１１１０がスロットＩＤであり、論理ブロックアドレス１０１０とスロットＩＤ１１００との関係は図３４に示されたとおりである。例えばホスト計算機１０から受信したＩ／Ｏコマンドで指定されている論理ブロックアドレスをスロットＩＤに変換する時には、指定された論理ブロックアドレスを５１２で除算して得られた値がスロットＩＤになる。またこの除算を行った時に剰余が０の場合には、Ｉ／Ｏコマンドで指定されている論理ブロックアドレスは、（スロットＩＤで特定される）スロットの先頭位置であることが分かり、剰余が０でない値（仮に、この値をＲとする）の場合、この剰余Ｒは、論理ブロックアドレスで特定されるブロックが、（スロットＩＤで特定される）スロットの先頭ブロックからＲ番目の位置に存在するブロックであることを表す情報となる（以下、この情報Ｒのことを、スロット内相対アドレスと呼ぶ）。【００５１】
また論理ボリューム上のデータをキャッシュする場合、ＲＡＭ３４またはＦＭチップ３２１上の記憶領域をキャッシュ領域として確保するが、キャッシュセグメント（またはセグメント）(図３４中の要素１２０１、１２０２、１２０３、１２０４がキャッシュセグメントである。以下、キャッシュセグメント１２０１、１２０２、１２０３、１２０４を総称する場合、「キャッシュセグメント１２００」と表記する)という領域単位でキャッシュ領域を確保する。本発明の実施例においては、キャッシュセグメント１２００のサイズは６４ＫＢで、各スロットに対して４つのキャッシュセグメント１２０１、１２０２、１２０３、１２０４が対応付けられる。図３４は、ＲＡＭ３４あるいはＦＭチップ３２１上の領域（キャッシュセグメント１２００）がスロット１１００に対応付けられる概念を表している。ストレージシステム２０がこの対応付けを管理する方法の詳細は後述するが、ストレージシステム２０は、スロットを管理する情報としてスロット制御テーブル１１０（詳細は図７を説明する際に説明する。スロット制御テーブル１１０は、スロット１１００ごとに１つ存在する）を有しており、スロット制御テーブル１１０内に、当該スロットに対応付けられているキャッシュセグメント１２００の情報（正確には、キャッシュセグメント１２００を管理するための情報へのポインタ）が格納されている。ストレージシステム２０は、このスロット制御テーブル１１０を作成、管理することによって、スロット１１００とキャッシュセグメント１２００の対応付けを管理する。なお、キャッシュセグメント１２００のサイズを、６４ＫＢ以外のサイズにすることも可能であり、また１つのスロット１１００に対応付けられるキャッシュセグメント１２００の数を、４つ以外の値にすることも可能である。【００５２】
ホスト計算機１０が論理ボリューム１０００上の領域にアクセス（リードまたはライト等）する際の、キャッシュ領域の管理に関連する処理の概要は以下の通りである。ホスト計算機１０はストレージシステム２０に、論理ユニット番号（論理ユニット／論理ボリュームを特定する番号で、一般的にはＬＵＮ[Logical  Unit  Number]と略記される）と論理ブロックアドレス１０１０を指定したＩ／Ｏコマンドを発行する。ストレージシステム２０は、受信したＩ／Ｏコマンドに含まれる論理ブロックアドレスを、スロットＩＤ１１１０とスロット内相対アドレスの組に変換し、当該変換で得られたスロットＩＤ１１１０で特定されるスロット制御テーブル１１０を参照する。そしてスロット制御テーブル１１０の情報に基づき、Ｉ／Ｏコマンドで指定された論理ボリューム上の領域（論理ブロックアドレスで特定される領域）に対してキャッシュセグメント１２００が確保されているか否かを判定し、キャッシュセグメント１２００が確保されていなければ、新規にキャッシュセグメント１２００を確保する処理を行う。【００５３】
続いてキャッシュ管理データ構造についての説明を行う。図７は、実施例１に係るキャッシュ管理データ構造の概念図である。【００５４】
キャッシュ管理データ構造は、キャッシュディレクトリ１００と、ＦＭフリーキュー２００と、ＲＡＭフリーキュー３００と、ダーティキューおよびクリーンキュー（図９参照）とを含む。本実施例では、ＲＡＭ３４と、ＦＭチップ３２１とにキャッシュセグメント（３４３、３２５）が管理される。各キャッシュセグメントは、セグメント制御テーブル１２０（ＳＧＣＴ：Segment  Control  Table）で管理される。ＳＧＣＴ１２０は、ＲＡＭ３４および全てのＦＭチップ３２１で管理されている全てのキャッシュセグメントのそれぞれと一対一に対応して管理される。【００５５】
キャッシュディレクトリ１００は、キャッシュ対象データの論理アドレス（キャッシュセグメントに格納されたデータの格納先である、論理ボリュームの論理ブロックアドレス）とメモリ（ＲＡＭ３４およびＦＭチップ３２１）上の物理アドレスとの対応関係を管理するデータ構造である。キャッシュディレクトリ１００は、例えば、キャッシュ対象データの論理アドレス（又はスロットＩＤのような、論理アドレスから導かれる情報）をキーとするハッシュテーブルであり、ＳＧＣＴ１２０を示すためのポインタをエントリとして持っている。ＳＧＣＴ１２０は、そのＳＧＣＴ１２０に対応するキャッシュセグメント（３２５、３４３）へのポインタを管理している。したがって、キャッシュディレクトリ１００によると、キャッシュ対象データの論理アドレスに基づいて、当該論理アドレスに対応するデータがキャッシュされているキャッシュセグメントを特定することができる。なお、ＳＧＣＴ１２０の詳細な構成については、後述する。本実施例では、キャッシュディレクトリ１００は、ＲＡＭ３４のキャッシュセグメント３４３と、すべてのＦＭチップ３２１のキャッシュセグメント３２５とをまとめて管理している。このため、当該キャッシュディレクトリ１００を参照することにより、ＲＡＭ３４およびＦＭチップ３２１におけるキャッシュのヒット判定を容易に行うことができる。【００５６】
ＦＭフリーキュー２００は、ＦＭチップ３２１のフリーセグメント、すなわちいずれのデータも格納していないキャッシュセグメント３２５を管理する制御情報である。ＦＭフリーキュー２００は、例えばＦＭチップ３２１のフリーセグメントに対応するＳＧＣＴ１２０をエントリに持つ双方向のリンクリストとして構成される。なお、フリーセグメントを管理する制御情報のデータ構造は、必ずしもキューである必要はなく、スタックなどを用いてもよい。【００５７】
ＲＡＭフリーキュー３００は、ＲＡＭ３４のフリーセグメントを管理する制御情報である。ＲＡＭフリーキュー３００は、例えばＲＡＭ３４のフリーセグメントに対応するＳＧＣＴ１２０をエントリに持つ双方向のリンクリストとして構成される。なお、フリーセグメントを管理する制御情報のデータ構造は、必ずしもキューである必要はなく、スタックなどを用いてもよい。【００５８】
ＳＧＣＴ１２０は、そのＳＧＣＴ１２０に対応するキャッシュセグメントの状態および種類によって、キャッシュディレクトリ１００、ＦＭフリーキュー２００、又はＲＡＭフリーキュー３００のいずれかに接続された状態をとる。具体的には、ＦＭチップ３２１のキャッシュセグメント３２５に対応するＳＧＣＴ１２０は、当該キャッシュセグメント３２５が未使用時には、ＦＭフリーキュー２００に接続され、当該キャッシュセグメント３２５がデータ格納用に割り当てられると、キャッシュディレクトリ１００に接続される。一方、ＲＡＭ３４のキャッシュセグメント３４３に対応するＳＧＣＴ１２０は、当該キャッシュセグメント３４３が未使用時には、ＲＡＭフリーキュー３００に接続され、当該キャッシュセグメント３４３がデータ格納用に割り当てられると、キャッシュディレクトリ１００に接続される。【００５９】
図８は、実施例１に係るキャッシュ管理データ構造の一部のデータ構造を示す図である。【００６０】
キャッシュディレクトリ１００は、例えばスロットＩＤをキーとするハッシュテーブルである。キャッシュディレクトリ１００のエントリ１００ａ（ディレクトリエントリ）は、スロットＩＤに対応するスロット制御テーブル１１０（ＳＬＣＴ：Slot  Control  Table）を示すディレクトリエントリポインタを格納する。ここで、スロットは、排他制御を行うデータの単位（ロック単位）である。例えば、１つのスロットは、複数のキャッシュセグメントを含むことができる。なお、スロットの内の一部しかデータが格納されていない場合には、キャッシュセグメントが１つしか含まれていないこともある。【００６１】
ＳＬＣＴ１１０は、ディレクトリエントリポインタ１１０ａと、前方ポインタ１１０ｂと、後方ポインタ１１０ｃと、スロットＩＤ１１０ｄと、スロットステータス１１０ｅと、ＳＧＣＴポインタ１１０ｆとを含む。ディレクトリエントリポインタ１１０ａは、ハッシュテーブルの次のエントリに対応するＳＬＣＴ１１０を指すディレクトリエントリポインタである。前方ポインタ１１０ｂは、クリーンキュー又はダーティキューにおける前の順番のＳＬＣＴ１１０を示すポインタである。後方ポインタ１１０ｃは、クリーンキュー又はダーティキューにおける後の順番のＳＬＣＴ１１０を示すポインタである。スロットＩＤ１１０ｄは、ＳＬＣＴ１１０に対応するスロットの識別情報である。スロットステータス１１０ｅは、スロットの状態を示す情報である。スロットの状態としては、例えば、当該スロットがロックされていることを示す「ロック中」等がある。ＳＧＣＴポインタ１１０ｆは、当該スロットに含まれるキャッシュセグメントに対応するＳＧＣＴ１２０を指すポインタである。当該スロットにキャッシュセグメントが割り当てられていないときは、ＳＧＣＴポインタ１１０ｆは、ポインタ（アドレス）が無効であることを表す値（例えばＮＵＬＬ）となっている。またスロットに含まれるキャッシュセグメントが複数ある場合には、各ＳＧＣＴ１２０はリンクリストとして管理され、ＳＧＣＴポインタ１１０ｆは、リンクリストにおける先頭のキャッシュセグメントに対応するＳＧＣＴ１２０を指すポインタである。【００６２】
ＳＧＣＴ１２０は、ＳＧＣＴポインタ１２０ａと、セグメントＩＤ１２０ｂと、メモリ種類１２０ｃと、セグメントアドレス１２０ｄと、ステージングビットマップ１２０ｅと、ダーティビットマップ１２０ｆとを含む。【００６３】
ＳＧＣＴポインタ１２０ａは、同じスロットに含まれる次のキャッシュセグメントに対応するＳＧＣＴ１２０を指すポインタである。セグメントＩＤ１２０ｂは、キャッシュセグメントの識別情報で、スロット内の何番目に位置づけられるキャッシュセグメントであるかを表す情報である。本実施例では、１スロットに最大で４つのキャッシュセグメントが割り当てられるので、各キャッシュセグメントのセグメントＩＤ１２０ｂには、０、１、２、３のいずれかの値が格納される（スロットの先頭に位置するキャッシュセグメントのセグメントＩＤ１２０ｂは０となり、以下順に１、２、３のセグメントＩＤ１２０ｂが付与される。たとえば図３４におけるキャッシュセグメント１２０１〜１２０４を例にとると、スロット１１００の先頭に対応付けられているキャッシュセグメント１２０１のセグメントＩＤ１２０ｂは０で、以下キャッシュセグメント１２０２、１２０３、１２０４のセグメントＩＤ１２０ｂはそれぞれ、１、２、３となる）。メモリ種類１２０ｃは、このＳＧＣＴ１２０に対応するキャッシュセグメントが格納されているキャッシュメモリの種類である。キャッシュメモリの種類としては、ＦＭと、ＲＡＭとのいずれかがある。セグメントアドレス１２０ｄは、キャッシュセグメントのアドレスである。ステージングビットマップ１２０ｅは、キャッシュセグメントの中でクリーンデータ、つまりドライブ（４０、４１）のデータと一致しているデータがキャッシュされている領域を示すビットマップである。ステージングビットマップ１２０ｅでは、各ビットがキャッシュセグメントにおける各領域に対応し、有効なデータ（ドライブと同じデータ）がキャッシュされている領域に対応するビットはＯＮ（１）に設定され、有効なデータがキャッシュされていない領域に対応するビットはＯＦＦ（０）に設定される。ダーティビットマップ１２０ｆは、キャッシュセグメントの中でダーティデータ、つまりドライブのデータと不一致なデータ（まだドライブに反映されていないデータ）がキャッシュされている領域を示すビットマップである。ダーティビットマップ１２０ｆでは、各ビットがキャッシュセグメントにおける各領域に対応し、ダーティデータがキャッシュされている領域に対応するビットはＯＮ（１）に設定され、ダーティデータがキャッシュされていない領域に対応するビットはＯＦＦ（０）に設定される。【００６４】
図９は、実施例１に係るダーティキューおよびクリーンキューのデータ構造を示す図である。【００６５】
ダーティキューおよびクリーンキューは、キャッシュデータ管理構造の一部である。ダーティキューは、ダーティデータを含むスロットに対応するＳＬＣＴ１１０を接続するキューである。クリーンキューは、クリーンデータのみを含むスロットに対応するＳＬＣＴ１１０を接続するキューである。ダーティキューおよびクリーンキューは、キャッシュリプレースやデステージのスケジューリング等に用いられ、それぞれのキャッシュリプレースやデステージのスケジューリング方式等によってさまざまな構造を取りうる。本実施例では、キャッシュリプレースおよびデステージのスケジューリングに用いるアルゴリズムをＬＲＵ（Least  Recently  Used）として説明する。なお、ダーティキューおよびクリーンキューは、接続するＳＬＣＴ１１０が違うだけで、キューの基本的な構成は同様であるので、ここでは、ダーティキューを例に挙げて説明する。ダーティキューは、双方向のリンクリストとして構成されている。すなわち、ダーティキューは、ＭＲＵ（Most  Recently  Used）ターミナル１５０の前方ポインタに、最近使用したダーティデータを含むスロット（最終使用時刻の新しいスロット）に対応するＳＬＣＴ１１０を接続し、以降、ＳＬＣＴ１１０の前方ポインタ１１０ｂに、次の順番のスロット（次に最近使用したダーティデータを含むスロット）のＳＬＣＴ１１０を順次接続し、最後の順番のＳＣＬＴ１１０の前方ポインタ１１０ｂにＬＲＵターミナル１６０を接続する一方、ＬＲＵターミナル１６０の後方ポインタに最後の順番のＳＣＬＴ１１０を接続し、以降、後ろの順番のＳＣＬＴ１１０の後方ポインタ１１０ｃに対して、その前の順番のスロットのＳＬＣＴ１１０を順次接続し、最初の順番のＳＬＣＴ１１０をＭＲＵターミナル１５０に接続する。ダーティキューでは、ＭＲＵターミナル１５０側から、最終使用時刻の新しい順にＳＬＣＴ１１０が並ぶこととなる。【００６６】
図１０は、実施例１に係るＦＭフリーキューおよびＲＡＭフリーキューのデータ構造を示す図である。【００６７】
ＦＭフリーキュー２００は、ＦＭチップ３２１に格納されている空きキャッシュセグメント３２５を管理するためのキューであり、ＲＡＭフリーキュー３００は、ＲＡＭ３４の空きキャッシュセグメント３４３を管理するためのキューであり、それぞれ空きキャッシュセグメントのＳＧＣＴ１２０をポインタで接続したリンクリストである。ＦＭフリーキュー２００と、ＲＡＭフリーキュー３００とは、管理するＳＧＣＴ１２０が異なるだけであり、構成は同一である。ＦＭフリーキュー２００（ＲＡＭフリーキュー３００）のフリーキューポインタ２０１(３０１）は、キューの先頭のＳＧＣＴ１２０を指す。ＳＧＣＴ１２０のＳＧＣＴポインタ１２０ａは、次の空きキャッシュセグメントのＳＧＣＴ１２０を指す。【００６８】
次に、実施例１に係る情報システムにおける処理動作を説明する。【００６９】
図１１は、実施例１に係るリードコマンド処理のフローチャートである。【００７０】
リードコマンド処理は、ホスト計算機１０からストレージコントローラ３０がリードコマンドを受信した場合に実行される。【００７１】
まず、リードコマンドを受信したストレージコントローラ３０のＣＰＵ３３は、リードコマンドで指定されている、論理ボリューム上のリード対象ブロックの論理ブロックアドレス（以下、「リード対象アドレス」と呼ぶ）に対応するキャッシュセグメントが割り当て済みであるか否かを判定する（ステップＳ１）。具体的には、先に説明したとおり、論理ブロックアドレスをスロットＩＤとスロット内相対アドレスの組に変換し、当該変換により得られたスロットＩＤ１１０ｄを有するＳＬＣＴ１１０内のＳＧＣＴポインタ１１０ｆを参照する。ＳＧＣＴポインタ１１０ｆが無効（たとえばＮＵＬＬ）値である場合には、キャッシュセグメントが未割り当てであることが判明する。ＳＧＣＴポインタ１１０ｆに有効な値が含まれている場合、少なくともキャッシュセグメントが１つ割り当てられていることが判明するので、ＳＧＣＴポインタ１１０ｆをたどって、スロット内相対アドレスで特定されるスロット内の位置にキャッシュセグメントが割り当てられているかを確認する。具体的には、「スロット内相対アドレス÷１２８」で得られた結果（整数値）と同一のセグメントＩＤ１２０ｂを有するＳＧＣＴ１２０があるかを確認することで、キャッシュセグメントが割り当てられているかを確認することができる（スロット内相対アドレス÷１２８の計算を行うことで、０〜３のいずれかの整数値が得られるので、スロット内相対アドレスが、０〜３のいずれのセグメントＩＤが付与されたキャッシュセグメントに対応するアドレスであるかを知ることができる）。この結果、キャッシュセグメントが割り当て済みであれば（ステップＳ１：ＹＥＳ）、ＣＰＵ３３は、ステップＳ３へ処理を進める一方、キャッシュセグメントが未割り当てであれば（ステップＳ１：ＮＯ）、キャッシュ割り当て処理（図１４参照）を実行し（ステップＳ２）、ステップＳ３へ処理を進める。ステップＳ２のキャッシュ割り当て処理の詳細は後述するが、キャッシュ割り当て処理では、キャッシュされるデータのアクセス特性に応じて、ＦＭチップ３２１のキャッシュセグメント、またはＲＡＭ３４のキャッシュセグメントを割り当てる処理が行われる。【００７２】
ステップＳ３では、ＣＰＵ３３は、リード対象アドレスに対応するキャッシュセグメントを含むスロットをロックする。具体的には、ＣＰＵ３３は、このキャッシュセグメントを含むスロットのＳＬＣＴ１１０のスロットステータス１１０ｅの「ロック中」を表すビットをＯＮにすることで、当該スロットがロックされていることを表す。【００７３】
続いてＣＰＵ３３は、リード対象のデータがキャッシュセグメントに格納されているか否か、すなわち、キャッシュヒットか否かを判定する（ステップＳ４）。具体的には、ＣＰＵ３３は、リード対象のキャッシュセグメントに対応するＳＧＣＴ１２０のステージングビットマップ１２０ｅおよびダーティビットマップ１２０ｆを調べ、リード対象の全ブロックに関して、当該ブロックに対応するステージングビットマップ１２０ｅのビットもしくはダーティビットマップ１２０ｆのビットのいずれかがＯＮであれば、キャッシュヒットであると判断する。一方、ＣＰＵ３３は、リード対象の範囲内に、ダーティビットマップ１２０ｆとステージングビットマップ１２０ｅとの対応するビットがいずれもＯＦＦであるブロックが一つでもある場合は、キャッシュミスであると判断する。【００７４】
この結果、キャッシュヒットの場合（ステップＳ４：ＹＥＳ）は、ＣＰＵ３３は、処理をステップＳ６へ進める一方、キャッシュミスの場合（ステップＳ４：ＮＯ）は、ステージング処理（図１２参照）を実行し（ステップＳ５）、処理をステップＳ６に進める。ステージング処理では、ドライブ（ＨＤＤ４０、またはＳＳＤ４１）からキャッシュセグメント（３２５又は３４３）へデータが読み込まれる。ステージング処理が完了すると、リード対象のデータがキャッシュセグメント（３２５又は３４３）に格納された状態になる。【００７５】
ステップＳ６では、ＣＰＵ３３は、キャッシュセグメントに格納されたデータをホスト計算機１０に送信するデータ送信処理（図１３参照）を実行する。【００７６】
続いて、ＣＰＵ３３は、コマンドの完了ステータスをホスト計算機１０に送信する（ステップＳ７）。すなわち、ＣＰＵ３３は、コマンドの処理中にエラーが発生してリード処理が正常に完了しなかった場合はエラーステータス（例えばCHECK  CONDITION）を返す一方、リード処理が正常に完了した場合は正常ステータス（GOOD）を返す。【００７７】
続いて、ＣＰＵ３３は、ロックしているスロットを解放（アンロック）し（ステップＳ８）、アクセスモニタテーブル３４２を更新し（ステップＳ９）、リードコマンド処理を終了する。アクセスモニタテーブル３４２の更新とは、例えば、リード量カウンタ３４２ｅに今回のリードコマンドで読み出したデータ量を加算し、リードコマンドカウンタ３４２ｇをインクリメントする。【００７８】
図１２は、実施例１に係るステージング処理のフローチャートである。【００７９】
ステージング処理は、図１１のリードコマンド処理のステップＳ５の処理に対応する。【００８０】
まず、ＣＰＵ３３は、リード対象アドレスに対応するキャッシュセグメントのキャッシュメモリの種類を調べ、キャッシュセグメントがＲＡＭ３４上のキャッシュセグメント（ＲＡＭセグメント）３４３であるか否かを判定する（ステップＳ１１）。ここで、キャッシュセグメントの基になっているキャッシュメモリの種類は、対応するＳＧＣＴ１２０のメモリ種類１２０ｃを参照することにより特定することができる。【００８１】
この結果、キャッシュセグメントがＲＡＭセグメント３４３であれば（ステップＳ１１：ＹＥＳ）、ＣＰＵ３３は、処理をステップＳ１２に進める一方、キャッシュセグメントがＲＡＭセグメント３４３でなければ（ステップＳ１１：ＮＯ）、処理をステップＳ１３に進める。【００８２】
ステップＳ１２では、ＣＰＵ３３は、リード対象（ステージング対象）のデータをドライブ（ＨＤＤ４０またはＳＳＤ４１）から読み出して、ＲＡＭセグメント３４３に格納し、ステージング処理を終了する。【００８３】
ステップＳ１３以降の処理では、キャッシュセグメントがＲＡＭセグメント３４３でない、すなわちＦＭチップ３２１上のキャッシュセグメント（ＦＭセグメント）３２５であるので、ドライブから読み上げたデータを直接ＦＭチップ３２１に書くのではなく、一旦、ＦＭボード３２のバッファメモリ３２３に格納した後、バッファメモリ３２３からＦＭチップ３２１に書き込むようにする。これはＦＭチップ３２１の書き込み速度が遅いので、ドライブから読み上げたデータを直接ＦＭチップ３２１に書いてしまうと、その速度に引きずられてストレージコントローラ３０のＢＥ  Ｉ／Ｆ３５の動作が遅くなり、ストレージシステム２０のスループット性能を低くしてしまうことを防ぐためである。なお、本実施例では、ＢＥ  Ｉ／Ｆ３５が、ＣＰＵ３３の指示を受けて、ドライブからＦＭボード３２のバッファメモリ３２３に対してデータを格納するようにしている。したがって、ＣＰＵ３３は、ＢＥ  Ｉ／Ｆ３５に対して指示を行った後は、他の処理を実行することができる。また、ＢＥ  Ｉ／Ｆ３５は、ドライブからＦＭボード３２のバッファメモリ３２３に対してデータを格納した後には、この処理から解放されて、他の処理を実行することができるようになる。【００８４】
まず、ステップＳ１３では、ＣＰＵ３３は、バッファメモリ３２３にドライブから読み上げたデータを格納するための領域（バッファ）の確保を行う。すなわち、ＣＰＵ３３は、バッファメモリ３２３のうちステージング対象のデータを格納するのに十分な領域をバッファに割り当てる。【００８５】
次に、ＣＰＵ３３は、ステージング対象のデータをドライブから読み出してバッファに格納する（ステップＳ１４）。本実施例では、ＢＥ  Ｉ／Ｆ３５が、ＣＰＵ３３の指示を受けて、ドライブからＦＭボード３２のバッファメモリ３２３のバッファに対してデータを格納している。【００８６】
そして、ＣＰＵ３３は、ＦＭプロセッサ３２０ｂに対し、バッファメモリ３２３のバッファ上のデータをＦＭチップ３２１に格納するよう要求する（ステップＳ１５）。この要求に対してＦＭプロセッサ３２０ｂは、ＦＭデータ書き込み処理（図２３参照）を実行する。ＦＭプロセッサ３２０ｂは、ＦＭデータ書き込み処理を終了すると、その要求に対する完了応答をＣＰＵ３３に返す。【００８７】
続いて、ＣＰＵ３３は、その要求に対する完了応答をＦＭプロセッサ３２０ｂから受け取り（ステップＳ１６）、バッファメモリ３２３のバッファを解放し（ステップＳ１７）、ステージング処理を終了する。【００８８】
図１３は、実施例１に係るデータ送信処理のフローチャートである。【００８９】
データ送信処理は、図１１に示すリードコマンド処理のステップＳ６の処理に対応する。【００９０】
データ送信処理では、ＦＭセグメント３２５からデータを送信する場合に、一旦バッファメモリ３２３にデータを格納して、バッファメモリ３２３からホスト計算機１０へデータを転送する。これは、ＦＭチップ３２１の読み出し速度が遅いので、ＦＭチップ３２１から直接転送すると、その速度に引きずられてストレージコントローラ３０のＦＥ  Ｉ／Ｆ３１の動作が遅くなり、ストレージシステム２０のスループット性能を低くしてしまうことを防ぐためである。【００９１】
まず、ＣＰＵ３３は、リード対象アドレスに対応するキャッシュセグメントの基になっているキャッシュメモリの種類を調べ、キャッシュセグメントがＲＡＭセグメント３４３であるか否かを判定する（ステップＳ２１）。ここで、キャッシュセグメントの基になっているキャッシュメモリの種類は、対応するＳＧＣＴ１２０のメモリ種類１２０ｃを参照することにより特定することができる。【００９２】
この結果、キャッシュセグメントがＲＡＭセグメント３４３であれば（ステップＳ２１：ＹＥＳ）、ＣＰＵ３３は、処理をステップＳ２２に進める一方、キャッシュセグメントがＲＡＭセグメント３４３でなければ（ステップＳ２１：ＮＯ）、処理をステップＳ２３に進める。【００９３】
ステップＳ２２では、ＣＰＵ３３は、リード対象（送信対象）のデータをＲＡＭセグメント３４３からホスト計算機１０へ転送し、データ送信処理を終了する。【００９４】
ステップＳ２３では、ＣＰＵ３３は、バッファメモリ３２３に、ＦＭチップ３２１から読み出した送信対象のデータを格納するための領域（バッファ）の確保を行う。すなわち、ＣＰＵ３３は、バッファメモリ３２３のうち送信対象のデータを格納するのに十分な領域をバッファに割り当てる。【００９５】
次に、ＣＰＵ３３は、ＦＭプロセッサ３２０ｂに対し、ＦＭチップ３２１上のデータをバッファメモリ３２３に読み出すよう要求する（ステップＳ２４）。この要求に対してＦＭプロセッサ３２０ｂは、ＦＭデータ読み出し処理（図２２参照）を実行する。ＦＭデータ読み出し処理により、バッファメモリ３２３には、送信対象のデータが格納される。ＦＭプロセッサ３２０ｂは、ＦＭデータ読み出し処理を終了すると、その要求に対する完了応答をＣＰＵ３３に返す。【００９６】
続いて、ＣＰＵ３３は、その要求に対する完了応答をＦＭプロセッサ３２０ｂから受け取り（ステップＳ２５）、送信対象のデータをバッファメモリ３２３からホスト計算機１０に送信する（ステップＳ２６）。本実施例では、ＦＥ  Ｉ／Ｆ３１が、ＣＰＵ３３の指示（例えば、読み出すデータのバッファメモリ３２３上のアドレス等）を受けて、バッファメモリ３２３のバッファからホスト計算機１０に対して送信対象のデータを送信している。その後、ＣＰＵ３３は、バッファメモリ３２３のバッファを解放し（ステップＳ２７）、データ送信処理を終了する。【００９７】
図１４は、実施例１に係るキャッシュ割り当て処理のフローチャートである。【００９８】
キャッシュ割り当て処理は、図１１に示すリードコマンド処理のステップＳ２の処理、および後述する図１９に示すライトコマンド処理のステップＳ７２の処理に対応する。【００９９】
キャッシュ割り当て処理では、ＣＰＵ３３がキャッシュするデータに対して、当該データに対するアクセス特性に応じて、ＦＭチップ３２１のキャッシュセグメント、またはＲＡＭ３４のキャッシュセグメントを割り当てる。【０１００】
ここで、まず、割り当てるキャッシュセグメントのメモリ種類、すなわち、ＦＭチップ３２１またはＲＡＭ３４を選択する際の判断基準について説明する。ここで、ＦＭチップ３２１は、（１）アクセス性能がＲＡＭ３４に比べて低い、（２）書き換え回数に上限がある、という特性を有しているので、本実施例では、ＣＰＵ３３は、データの特性が、比較的ＲＡＭの特性に適合しているデータ（高性能を要求される、キャッシュセグメントの更新頻度が高くなる）は、ＲＡＭ３４を用いたキャッシュセグメントを選択し、フラッシュメモリの特性に適合するデータ（それほど高性能を要求されない、キャッシュセグメントの更新頻度が高くない）は、ＦＭチップ３２１を用いたキャッシュセグメントを選択する制御を行う。具体的には、次のような基準で割り当てるキャッシュセグメントのメモリ種類を選択する。
（ａ）アクセス頻度（リード頻度／ライト頻度）が高いデータや、高スループットが求められるデータの場合は、ＣＰＵ３３は、ＲＡＭ３４を優先的に選択する。特に、アクセス頻度が高いデータをＦＭチップ３２１のキャッシュセグメントに格納するようにすると、ＦＭチップ３２１の更新頻度が高くなる。更新頻度が高い場合、書き換えが多発しＦＭチップ３２１の寿命を短くしてしまうので、ＲＡＭ３４を優先的に選択した方がよい。これにより、ＦＭチップ３２１の寿命の短縮を適切に抑制することができる。また、高スループットが求められるデータとしては、例えば、インメモリデータベースで利用するために読み込む大量データが該当する。この用途のデータは、一般的に、転送長が長いデータやシーケンシャルアクセスのデータであることが多いため、転送長が長いと判断されるデータについてはＲＡＭ３４を優先的に選択する。これにより、高スループットを実現することができる。
（ｂ）ＦＭチップ３２１にキャッシュするとキャッシュヒットによる性能面の効果があまり得られないデータの場合は、ＣＰＵ３３は、ＲＡＭ３４を優先的に選択する。キャッシュヒットによる性能面の効果があまり得られないデータとしては、例えばＳＳＤ４１に格納されるデータがある。これによると、キャッシュヒットによる効果を適切に得られるようにすることができる。
（ｃ）アクセス単位が小さいデータがキャッシュ対象であれば、ＣＰＵ３３は、ＲＡＭ３４を優先的に選択する。これはＦＭチップ３２１における読み書き単位（ページ）の大きさがＲＡＭ３４の最小アクセス単位に比べて大きく（例えば８ＫＢ）、小さい単位のデータの参照・更新の効率が悪いためである。例えば、制御情報などのメタデータは、通常１６Ｂ程度のサイズであり、ＦＭチップ３２１の読み書き単位のサイズと比較すると小さいため、ＲＡＭ３４にキャッシュした方がよい。
（ｄ）すぐにキャッシュ上から破棄されるデータがキャッシュ対象の場合は、ＣＰＵ３３は、ＲＡＭ３４を優先的に選択する。その理由は、破棄に伴うＦＭチップ３２１の消去がすぐに発生することと、すぐ破棄するのであればＲＡＭ３４に置いても容量の消費が一時的であり影響が小さいことが挙げられる。どのようなデータを優先的に破棄するかについては、ストレージシステムのポリシーとして設定されている。例えばデータコピーのために割り当てられる一時的なキャッシュセグメントに格納されるデータは、コピー処理が完了するとキャッシュ上から破棄される。他の例としては、シーケンシャルリードが行われるデータや、シーケンシャルライトが行われるデータがある。シーケンシャルリードが行われるデータについては、先頭から順番に読んでいって、読み終わったら同じ部分のデータがすぐに読まれることは基本的にはない。また、シーケンシャルライトが行われるデータは、例えば、当該データがＲＡＩＤで格納される場合には、必要なパリティが揃った時点で、データがデステージされ、その後キャッシュから破棄される。
（ｅ）上記（ａ）−（ｄ）以外の条件に適合するデータがキャッシュ対象の場合は、ＣＰＵ３３は、ＦＭチップ３２１を優先的に選択する。【０１０１】
次に、以上の基準に基づいてキャッシュ割り当てを行うキャッシュ割り当て処理を、図１４を参照して説明する。【０１０２】
まず、ＣＰＵ３３は、アクセス対象（リード対象又はライト対象）のデータが高速にアクセスされるデータか否かを判定する（ステップＳ３１）。具体的には、ＣＰＵ３３は、例えば、予め求められたアクセス速度の閾値と、アクセスモニタテーブル３４２に記録されたアクセス対象のデータの格納される領域のリード速度３４２ａやライト速度３４２ｂとを比較して、アクセス対象のデータが高速にアクセスされるデータか否かを判定する。リード速度３４２ａやライト速度３４２ｂの集計方法は後述するが、データアクセス頻度が高い場合、あるいは転送長が長いデータのアクセスの場合、本実施例で集計されるリード速度３４２ａやライト速度３４２ｂは高くなるため、データのリード速度３４２ａやライト速度３４２ｂを閾値と比較することで、アクセス頻度が高いデータであるか、または転送長が長いデータであるかを判定することができる。あるいは別の実施形態として、アクセス頻度（アクセスモニタテーブル３４２に記録された、アクセス対象のデータの格納される領域のリード頻度３４２ｃやライト頻度３４２ｄ）を閾値と比較して判定してもよい。ステップＳ３１の判定の結果が、真であれば（ステップＳ３１：ＹＥＳ）、ＣＰＵ３３は処理をステップＳ３７に進める一方、偽であれば（ステップＳ３１：ＮＯ）、処理をステップＳ３２に進める。【０１０３】
ステップＳ３２では、ＣＰＵ３３は、アクセス対象のデータに対するアクセスパターンがシーケンシャルアクセスであるか否かを判定する。この判定は、ＣＰＵ３３が、処理対象のリードコマンドが、連続したアドレスを順にリードする一連のコマンドの一部であるか否かを判断することにより実現できる。具体的には、ＣＰＵ３３は、例えば、前回のリードコマンドの対象アドレスに当該コマンドの転送長を加えたアドレスが、今回のリードコマンドの対象アドレスであるか否かを判断するによって、シーケンシャルアクセスであるか否かを判定する。この結果、シーケンシャルアクセスであると判定した場合（ステップＳ３２：ＹＥＳ）は、ＣＰＵ３３は、処理をステップＳ３７に進める一方、偽であると判定した場合（ステップＳ３２：ＮＯ）は、ＣＰＵ３３は、処理をステップＳ３３に進める。【０１０４】
ステップＳ３３では、ＣＰＵ３３は、アクセス対象のデータが最終的にＳＳＤ４１に格納されるデータであるか否か、すなわち、アクセス対象データの最終ストレージデバイスがＳＳＤ４１であるか否かを判定する。ここで、アクセス対象データの最終ストレージデバイスがＳＳＤ４１であるか否かの判定は、例えば、予め記憶している論理ボリュームとデバイスとの対応関係を表す情報に基づいて、リードコマンドで指定された論理ボリュームに対応するデバイス種類を特定することにより実現できる。なお、シンプロビジョニングに従う論理ボリュームである場合には、論理ボリュームに割り当てられている実ページを提供するデバイスのデバイス種類を特定することにより、アクセス対象データの最終ストレージデバイスがＳＳＤ４１であるか否か判定することができる。この結果、真であれば（ステップＳ３３：ＹＥＳ）、ＣＰＵ３３は、処理をステップＳ３７に進める一方、偽であれば、処理をステップＳ３４に進める。【０１０５】
ステップＳ３４では、ＣＰＵ３３は、アクセス対象のデータがメタデータであるか否かを判定する。ここでいうメタデータには、ストレージコントローラ３０のＲＡＭ３４からドライブ（４０、４１）に退避・格納した又は退避・格納する制御情報を含む。ここで、アクセス対象のデータがメタデータであるか否かは、例えば、アクセス先が、その論理ボリュームにおける制御情報が格納される所定の領域であるか否かにより判定することができる。なお、論理ボリュームにおける制御情報が格納される領域のアドレスについては、論理ボリュームを使用するホスト計算機１０等から取得することができる。この結果、真であれば（ステップ３４：ＹＥＳ）、ＣＰＵ３３は、処理をステップＳ３７に進める一方、偽であれば、処理をステップＳ３５に進める。【０１０６】
ステップＳ３５では、ＣＰＵ３３は、アクセス対象のデータに対応するキャッシュセグメントが一時的なキャッシュセグメント（テンポラリセグメント）であるか否かを判定する。ここで、テンポラリセグメントとは、次のいずれかである。
（１）パリティ生成において旧データや旧パリティがキャッシュミスした場合に、当該旧データあるいは旧パリティを格納するために割り当てられるセグメント。
（２）ドライブ（例えば最終ストレージデバイス）のデータをコピーする処理のため一時的に割り当てられるセグメント。
（３）他ストレージ装置との間でデータを送受信する処理のため（例えば、リモートコピー処理のため）一時的に割り当てられるセグメント。【０１０７】
なお、ＣＰＵ３３は、データに対してキャッシュセグメントを割り当てる際に、ホスト計算機１０から高スループットか否かを示す情報、又は、Ｉ／Ｏの優先度を示す情報を受け付け、当該高スループットか否かを示す情報、又は、Ｉ／Ｏの優先度を示す情報をキャッシュセグメントに対応付けて記憶しておき、その情報に基づいて、キャッシュセグメントがテンポラリセグメントであるか否かを判断するようにしてもよい。【０１０８】
この結果、真であれば（ステップ３５：ＹＥＳ）、ＣＰＵ３３は、処理をステップＳ３７に進める一方、偽であれば、処理をステップＳ３６に進める。【０１０９】
ステップＳ３６では、ＣＰＵ３３は、ＦＭチップ３２１のキャッシュセグメント３２５を優先して割り当てるＦＭ優先セグメント割り当て処理（図１５参照）を実行し、キャッシュ割り当て処理を終了する。【０１１０】
ステップＳ３７では、ＣＰＵ３３は、ＲＡＭ３４のキャッシュセグメント３４３を優先して割り当てるＲＡＭ優先セグメント割り当て処理（図１６参照）を実行し、キャッシュ割り当て処理を終了する。【０１１１】
キャッシュ割り当て処理が完了すると、アクセス対象のデータに対して、ＦＭチップ３２１またはＲＡＭ３４のいずれか一方のキャッシュセグメントが割り当てられることとなる。【０１１２】
図１５は、実施例１に係るＦＭ優先セグメント割り当て処理のフローチャートである。【０１１３】
ＦＭ優先セグメント割り当て処理は、図１４に示すキャッシュ割り当て処理のステップＳ３６に対応する処理である。【０１１４】
まず、ＣＰＵ３３は、使用可能なＦＭセグメント３２５があるか否かを判定する（ステップＳ４１）。使用可能なＦＭセグメント３２５とは、フリーもしくは、クリーンかつロックされていないキャッシュセグメント３２５のことである。なお、使用可能なＦＭセグメント３２５があるか否かは、キャッシュ管理データ構造を参照することにより判定することができる。この判定結果が真の場合（ステップＳ４１：ＹＥＳ）は、ＣＰＵ３３は、処理をステップ４２に進める一方、偽の場合（ステップＳ４１：ＮＯ）は、処理をステップＳ４３に進める。【０１１５】
ステップＳ４２では、ＣＰＵ３３は、ＦＭセグメント割り当て処理を行う。ここで、クリーンなキャッシュセグメントを割り当てる場合は、ＣＰＵ３３は、当該キャッシュセグメントをクリーンキューおよびキャッシュディレクトリ１００から切り離してフリーセグメントにしたうえでＦＭセグメント割り当て処理を行う。【０１１６】
ＦＭセグメント割り当て処理では、まず、ＣＰＵ３３は、ＳＧＣＴ１２０に確保したキャッシュセグメントに対応するセグメントＩＤ１２０ｂ、メモリ種類１２０ｃ（ＦＭ）を設定する。そして、ＣＰＵ３３は、このキャッシュセグメントを含むスロットに対応するＳＬＣＴ１１０のＳＧＣＴポインタ１１０ｆに当該キャッシュセグメントのＳＧＣＴ１２０へのポインタを設定する。もし、対応するＳＬＣＴ１１０がキャッシュディレクトリ１００に接続されていない場合は、ＣＰＵ３３は、まずＳＬＣＴ１１０の内容を設定したうえ、当該ＳＬＣＴ１１０をキャッシュディレクトリ１００に接続して、その後にＳＬＣＴ１１０へＳＧＣＴ１２０を接続する。また、もし、確保したキャッシュセグメントに対応するＳＧＣＴ１２０以外のＳＧＣＴ１２０が既にＳＬＣＴ１１０に接続されている場合は、ＣＰＵ３３は、そのＳＬＣＴ１１０に接続されている終端のＳＧＣＴ１２０に、確保したキャッシュセグメントのＳＧＣＴ１２０を接続する。なお、ＦＭセグメント割り当て処理の終了後には、ＦＭ優先セグメント割り当て処理を終了する。【０１１７】
ステップＳ４３では、ＣＰＵ３３は、使用可能なＲＡＭセグメント３４３があるか否かを判定する。この判定結果が真の場合（ステップＳ４３：ＹＥＳ）は、ＣＰＵ３３は、処理をステップＳ４５へ進める一方、偽の場合（ステップＳ４３：ＮＯ）は、いずれかのキャッシュセグメントが使用可能になるまで待って（ステップＳ４４）、処理をステップＳ４１に進める。【０１１８】
ステップＳ４５では、ＣＰＵ３３は、ＲＡＭセグメント割り当て処理を行う。ＲＡＭセグメント割り当て処理は、ステップＳ４２におけるＦＭセグメント割り当て処理において、ＦＭセグメント３２５を割り当てていたものを、ＲＡＭセグメント３４３を割り当てるようにしたものである。ＲＡＭセグメント割り当て処理の終了後には、ＦＭ優先セグメント割り当て処理を終了する。【０１１９】
このＦＭ優先セグメント割り当て処理では、ＦＭセグメント３２５が優先して割り当てられる。【０１２０】
図１６は、実施例１に係るＲＡＭ優先セグメント割り当て処理のフローチャートである。【０１２１】
ＲＡＭ優先セグメント割り当て処理は、図１４に示すキャッシュ割り当て処理のステップＳ３７に対応する処理である。【０１２２】
ＲＡＭ優先セグメント割り当て処理は、図１５に示すＦＭ優先セグメント割り当て処理におけるＦＭセグメントと、ＲＡＭセグメントとを入れ替えた処理であるので、ここでは、簡単に説明を行う。【０１２３】
まず、ＣＰＵ３３は、使用可能なＲＡＭセグメント３４３があるか否かを判定する（ステップＳ５１）。この判定結果が真の場合（ステップＳ５１：ＹＥＳ）は、ＣＰＵ３３は処理をステップＳ５２に進める一方、偽の場合（ステップＳ５１：ＮＯ）は、処理をステップＳ５３に進める。【０１２４】
ステップＳ５２では、ＣＰＵ３３は、ＲＡＭセグメント割り当て処理を行う。このＲＡＭセグメント割り当て処理は、図１５のステップＳ４５と同様な処理である。ＲＡＭセグメント割り当て処理の終了後には、ＲＡＭ優先セグメント割り当て処理を終了する。【０１２５】
ステップＳ５３では、ＣＰＵ３３は、使用可能なＦＭセグメント３２５があるか否かを判定する。この判定結果が真の場合（ステップＳ５３：ＹＥＳ）は、ＣＰＵ３３は、処理をステップＳ５５に進める一方、偽の場合（ステップＳ５３：ＮＯ）は、いずれかのキャッシュセグメントが使用可能になるまで待って（ステップＳ５４）、処理をステップＳ５１に進める。【０１２６】
ステップＳ５５では、ＣＰＵ３３は、ＦＭセグメント割り当て処理を行う。このＦＭセグメント割り当て処理は、図１５のステップＳ４２と同様な処理である。ＦＭセグメント割り当て処理の終了後には、ＲＡＭ優先セグメント割り当て処理を終了する。【０１２７】
このＲＡＭ優先セグメント割り当て処理では、ＲＡＭセグメント３４３が優先して割り当てられる。【０１２８】
図１７は、実施例１に係るアクセスモニタ集計処理のフローチャートである。【０１２９】
アクセスモニタ集計処理は、例えば一定時間周期に実行され、その期間におけるリード・ライト量やリード・ライト頻度を集計してアクセスモニタテーブル３４２を更新する処理である。【０１３０】
まずＣＰＵ３３は、アクセスモニタテーブル３４２のリード速度３４２ａを更新する（ステップＳ６１）。すなわち、ＣＰＵ３３は、リード量カウンタ３４２ｅの値を、モニタ開始時刻３４２ｉから現在までの時間（以下、モニタ時間と称する）で割った値を、リード速度として、アクセスモニタテーブル３４２のリード速度３４２ａに設定する。【０１３１】
次に、ＣＰＵ３３は、アクセスモニタテーブル３４２のライト速度３４２ｂを更新する（ステップＳ６２）。すなわち、ＣＰＵ３３は、ライト量カウンタ３４２ｆの値を、モニタ時間で割った値を、ライト速度として、アクセスモニタテーブル３４２のライト速度３４２ｂに設定する。【０１３２】
続いて、ＣＰＵ３３は、アクセスモニタテーブル３４２のリード頻度３４２ｃを更新する（ステップＳ６３）。すなわち、ＣＰＵ３３は、リードコマンドカウンタ３４２ｇの値を、モニタ時間で割った値を、リード頻度として、アクセスモニタテーブル３４２のリード頻度３４２ｃに設定する。【０１３３】
その次に、ＣＰＵ３３は、アクセスモニタテーブル３４２のライト頻度３４２ｄを更新する（ステップＳ６４）。すなわち、ＣＰＵ３３は、ライトコマンドカウンタ３４２ｈの値を、モニタ時間で割った値を、ライト頻度として、アクセスモニタテーブル３４２のライト頻度３４２ｄに設定する。【０１３４】
そして、ＣＰＵ３３は、アクセスモニタテーブル３４２のモニタ開始時刻３４２ｉに現在時刻を設定し（ステップＳ６５）、リード量カウンタ３４２ｅ、ライト量カウンタ３４２ｆ、リードコマンドカウンタ３４２ｇ、およびライトコマンドカウンタ３４２ｈの値を０にリセットし（ステップＳ６６）、アクセスモニタ集計処理を終了する【０１３５】
このアクセスモニタ集計処理により、論理ユニット内の各部分領域についてのライト速度、リード速度、ライト頻度、およびリード頻度を適切に把握することができる。【０１３６】
上で説明したアクセスモニタ集計処理では、リード速度、ライト速度を、リード量・ライト量をモニタ時間で除算して算出しているが、別の実施形態として、アクセスモニタテーブル３４２に、リードコマンド、ライトコマンドの処理時間（コマンドを受信してから、ホスト計算機１０に応答を返すまでに要した時間）の累積を記憶するようにし、リード量・ライト量をそれぞれ、リードコマンド、ライトコマンドの処理時間の累積で除算するようにしてもよい。論理ユニット内のある部分領域に対して、コマンド（リードあるいはライトコマンド）が複数回発行された場合を想定すると、リード量・ライト量をモニタ時間で除算してアクセス速度を算出すると、転送長が長いデータへのアクセスであっても、発行されるコマンドの時間間隔が長い場合には、算出されるアクセス速度が低くなる。リード量・ライト量をそれぞれ、リードコマンド、ライトコマンドの処理時間の累積で除算した値をリード速度、ライト速度とすると、論理ユニット内のある部分領域に対して発行されるコマンドの時間間隔が長い、短いにかかわらず、転送長が長いデータへのアクセスの場合には、算出されるリード速度、ライト速度が高くなるので、論理ユニット内のある部分領域に対して発行されるコマンドの時間間隔が長い、短いにかかわらず、転送長が長いデータへのアクセスの場合にＲＡＭに優先的にキャッシュするようにしたい場合、リード量・ライト量をそれぞれ、リードコマンド、ライトコマンドの処理時間の累積で除算した値をリード速度、ライト速度とするとよい。【０１３７】
なお、アクセスモニタテーブル３４２は論理ユニット内の部分領域ごとに設けられ、部分領域ごとにアクセス頻度やアクセス速度が集計される。部分領域（つまり１つのアクセスモニタテーブル３４２でアクセス頻度やアクセス速度を集計する単位）のサイズとしては、先に述べたとおり様々なサイズを選択可能であるが、本発明におけるストレージシステムでは、アクセスモニタテーブル３４２の情報に基づいて、キャッシュセグメントとして割り当てるべきメモリ種類を決定するため、キャッシュセグメントとして割り当てるべきメモリ種類の決定される際、図１４等の処理はキャッシュセグメント単位で判定を行っているが、結果としては部分領域単位に割り当てられるメモリ種類が定まることになる。そのため、割り当てられるキャッシュメモリの種類を、できるだけ小さい領域ごとに選択したい場合、部分領域のサイズを小さくすることが好ましい。たとえば部分領域のサイズが、キャッシュセグメントと同じサイズであれば、キャッシュセグメントごとのアクセス特性に応じたメモリ割り当てが可能になる。ただし、部分領域のサイズが小さいと、維持管理すべきアクセスモニタテーブル３４２の量が増加するため、キャッシュセグメントサイズの整数倍（たとえばスロットのサイズでもよい）、あるいはスロットサイズの整数倍としてもよい。【０１３８】
また、本実施例１におけるアクセスモニタテーブル３４２とアクセスモニタ集計処理は、キャッシュ割り当て処理を行うために専用に設けられているものだが、別の実施形態として、ストレージシステム２０内に、キャッシュ割り当て処理以外の目的で、論理ボリュームの部分領域のアクセス頻度等の情報を集計する手段が設けられている場合、当該手段により集計された情報を用いるようにしてもよい。たとえば米国特許出願公開第２０１３／００３６２５０号明細書や、米国特許出願公開第２０１０／０２０５３９０号明細書には、いわゆるシンプロビジョニングに従う論理ボリュームを提供するストレージ装置が、論理ボリュームの各部分領域（ページと呼ばれる）に割り当てるべき記憶領域を決定するために、ページ毎にアクセス頻度などを集計する機能を有することが開示されている。本発明の実施例に係るストレージシステム２０がこのような機能を備えている場合には、上で説明したアクセスモニタテーブル３４２とアクセスモニタ集計処理に代えて、ページ毎に集計されたアクセス頻度情報を用いて、キャッシュ割り当ての判定を行うようにしてもよい。【０１３９】
図１８は、実施例１に係る判定用閾値算出方法を説明する図である。【０１４０】
図１４に示すキャッシュ割り当て処理のステップＳ３１において、対象データが高速にアクセスされるか否かを判定する際に基準とする閾値は、ＦＭボード３２で使用されるＦＭチップ３２１の寿命が過度に短くならないよう、つまりＦＭチップ３２１に対する更新・消去頻度が高くなりすぎないような値を設定することが望ましい。そのため、使用するＦＭチップ３２１の書き換え可能回数や容量、ストレージシステム２０の性能（たとえばホスト計算機１０からのライト頻度）などを考慮して、閾値を決定する。この閾値はあらかじめ定められた固定値としてもよいが、下記のようにアクセスモニタテーブル３４２の値を用いて動的に決めてもよい。このようにすると、より状況にあった閾値を設定することができる。【０１４１】
まず、ＣＰＵ３３は、図１８の左側のグラフに示すようなライト速度にある各領域(部分領域)について、ライト速度が遅い順にソートして図１８の右側のグラフに示すようにする。ここで、各領域は、アクセスモニタテーブル３４２で管理されている部分領域である。そして、各領域のライト速度を順に足していき、合計が式（１）で求められる許容総ライト速度を超えたら、当該領域のライト速度を対象データが高速にアクセスされるか否かを判定する際に基準とする閾値とする。つまり当該領域のライト速度未満のライト速度となる領域がＦＭチップ３２１でキャッシュするのに適した領域（ＦＭ適切領域）であり、この領域についてＦＭチップ３２１にキャッシュするようにし、それ以外の領域については、ＦＭチップ３２１にキャッシュしないようにする。【０１４２】
許容総ライト速度＝残りライト可能量／（残り使用期間×マージン）−その他のFM更新速度・・・（１）【０１４３】
ここで、残りライト可能量は、ＦＭチップ３２１の残り書き換え可能回数と容量、およびＷＡ（Write  Amplification：リクラメーションやウェアレベリングによってフラッシュメモリへのライト量が何倍に増幅されるかを表す指標）によって決まる。その他のＦＭ更新速度は、ホスト計算機１０からのライト以外の処理、例えばキャッシュリプレースやデステージなどによってＦＭチップ３２１が更新される速度である。残り使用期間は、ＦＭチップ３２１を交換するとして想定されている期日までの期間に相当する。【０１４４】
情報システムでは、ＦＭチップ３２１の残りライト可能量が少なくなった場合に、当該ＦＭチップ３２１を搭載するＦＭボード３２へのキャッシュ割り当てを止め、新しいＦＭボード３２に交換させることもできる。例えば、ＦＭチップ３２１の残りライト可能量が予め決められた閾値を下回った場合は、ＣＰＵ３３は、許容総ライト速度をゼロに設定する。こうすることで、ＦＭセグメントの割り当てが行われなくなる。さらに、ＣＰＵ３３は、ＦＭボード３２の交換を促すメッセージを管理端末に表示したり、管理者宛にメールを送信したりするなどの方法で、ＦＭボード３２の交換が必要であることを管理者に知らせる。【０１４５】
ＦＭボード３２の交換時には、ＣＰＵ３３は、まず古いＦＭボード３２上に残っているダーティデータをドライブに書き出した後に、抜去可能であるとの通知を、例えば管理端末に表示する。管理者が古いＦＭボード３２をストレージコントローラ３０から抜去して、新しいＦＭボード３２をストレージコントローラ３０に挿した後に、ＣＰＵ３３は新しいＦＭボード３２の初期化を行い、残りライト可能量を初期化し、上記同様に許容総ライト速度を計算する。これにより、以降においては、新しいＦＭボード３２を用いてＦＭセグメントの割り当てが行われることとなる。【０１４６】
図１９は、実施例１に係るライトコマンド処理のフローチャートである。【０１４７】
ライトコマンド処理は、ホスト計算機１０からストレージコントローラ３０がライトコマンドを受信した場合に実行される。【０１４８】
まず、ライトコマンドを受信したストレージコントローラ３０のＣＰＵ３３は、ライトコマンドで指定されている、ライト対象の論理ボリュームの論理ブロックアドレス(ライト対象アドレス)に対応するキャッシュセグメントが割り当て済みであるか否かを判定する（ステップＳ７１）。この処理はリード処理（図１１のＳ１）と同様であるので詳細な説明は省略する。この結果、キャッシュセグメントが割り当て済みであれば（ステップＳ７１：ＹＥＳ）、ステップＳ７３へ処理を進める一方、キャッシュセグメントが未割り当てであれば（ステップＳ７１：ＮＯ）、キャッシュ割り当て処理（図１４参照）を実行し（ステップＳ７２）、ステップＳ７３へ処理を進める。キャッシュ割り当て処理では、ライト対象アドレスに対して、ＲＡＭ３４またはＦＭチップ３２１からキャッシュセグメントが割り当てられる。なお、ライトされたデータを二重化することで信頼性を確保するために、キャッシュセグメントを２つ割り当てるようにしてもよい。【０１４９】
ステップＳ７３では、ＣＰＵ３３は、ライト対象アドレスに対応するキャッシュセグメントを含むスロットをロックする。具体的には、ＣＰＵ３３は、このキャッシュセグメントを含むスロットのＳＬＣＴ１１０のスロットステータス１１０ｅの「ロック中」を表すビットをＯＮにすることで、当該スロットがロックされていることを表す。【０１５０】
続いて、ＣＰＵ３３は、ホスト計算機１０に対し、例えば、XFER_RDYを送信することで、データ受領準備ができたことを通知する（ステップＳ７４）。【０１５１】
そして、ＣＰＵ３３は、割り当てたキャッシュセグメントがＲＡＭセグメント３４３であるか否かを判定する（ステップＳ７５）。この結果、割り当てたキャッシュセグメントがＲＡＭセグメント３４３であれば（ステップＳ７５：ＹＥＳ）、ＣＰＵ３３は、ホスト計算機１０から受領したデータをＲＡＭセグメント３４３に格納するデータ受領処理（ＲＡＭ）（図２０参照）を実行し（ステップＳ７６）、処理をステップＳ７８に進める。一方、割り当てたキャッシュセグメントがＦＭセグメント３２５であれば（ステップＳ７５：ＮＯ）、ＣＰＵ３３は、ホスト計算機１０から受領したデータをＦＭセグメント３２５に格納するデータ受領処理（ＦＭ）（図２１参照）を実行し（ステップＳ７７）、処理をステップＳ７８に進める。【０１５２】
ステップＳ７８では、ＣＰＵ３３は、アクセスモニタテーブル３４２を更新する。すなわち、ＣＰＵ３３は、アクセスモニタテーブル３４２のライト量カウンタ３４２ｆに、今回のライトコマンドで受領したデータ量を加算し、ライトコマンドカウンタ３４２ｈをインクリメントする。その後、ＣＰＵ３３は、ライトコマンド処理を終了する。【０１５３】
図２０は、実施例１に係るデータ受領処理（ＲＡＭ）のフローチャートである。【０１５４】
データ受領処理（ＲＡＭ）は、図１９に示すライトコマンド処理のステップＳ７６の処理に対応する。【０１５５】
まず、ＣＰＵ３３は、ホスト計算機１０から受領したデータを、ＲＡＭセグメント３４３に書き込む（ステップＳ８１）。【０１５６】
次にＣＰＵ３３は、書き込んだデータがダーティデータであると設定する（ステップＳ８２）。すなわち、ＣＰＵ３３は、ＳＧＣＴ１２０のダーティビットマップ１２０ｆにおける受領したデータが書き込まれたブロックに対応するビットをＯＮに設定する。【０１５７】
続いて、ＣＰＵ３３は、コマンドの完了ステータスをホスト計算機１０に送信し、ＲＡＭセグメント３４３を含むスロットを解放（アンロック）し（ステップＳ８４）、データ受領処理（ＲＡＭ）を終了する。【０１５８】
図２１は、実施例１に係るデータ受領処理（ＦＭ）のフローチャートである。【０１５９】
データ受領処理（ＦＭ）は、図１９に示すライトコマンド処理のステップＳ７７の処理に対応する。【０１６０】
まず、ＣＰＵ３３は、ホスト計算機１０から受領したデータを、ＦＭボード３２のバッファメモリ３２３に書き込む（ステップＳ９１）。【０１６１】
次に、ＣＰＵ３３は、書き込んだデータをバッファメモリ３２３から読み出すことができるかテストする（ステップＳ９２）。このとき、ＣＰＵ３３は、例えばデータに付加されたＣＲＣ（Cyclic  Redundancy  Check）などの保証コードをチェックすることで、データが正常であることを確認してもよい。【０１６２】
次に、ＣＰＵ３３は、書き込んだデータがダーティデータであると設定する（ステップＳ９３）。すなわち、ＣＰＵ３３は、ＳＧＣＴ１２０のダーティビットマップ１２０ｆにおける、受領したデータが書き込まれたブロックに対応するビットをＯＮにする。【０１６３】
続いて、ＣＰＵ３３は、コマンドの完了ステータスをホスト計算機１０に送信し、ＦＭセグメント３２５を含むスロットを解放する（ステップＳ９５）。【０１６４】
次に、ＣＰＵ３３は、ＦＭプロセッサ３０２ｂに対して、バッファメモリ３２３上のデータをＦＭチップ３２１のキャッシュセグメント３２５に格納するよう要求し（ステップＳ９６）、データ受領処理（ＦＭ）を終了する。【０１６５】
図２２は、実施例１に係るＦＭデータ読み出し処理のフローチャートである。【０１６６】
ＦＭデータ読み出し処理は、図１３に示すデータ送信処理のステップＳ２４における、ＦＭチップ３２１上のデータをバッファに読み出す要求をＦＭプロセッサ３２０ｂが受信した場合に実行される。【０１６７】
まず、ＦＭプロセッサ３２０ｂは、ストレージコントローラ３０のＣＰＵ３３から指定された論理アドレスを、ＦＭチップ３２１上のデータ格納位置を表す物理アドレスに変換する（ステップＳ１０１）。なお、論理アドレスから物理アドレスへの変換は、バッファメモリ３２３に格納されている論理アドレスと物理アドレスとの対応関係を示すマッピングテーブルに基づいて行うことができる。【０１６８】
次に、ＦＭプロセッサ３２０ｂは、ＦＭチップ３２１の物理アドレスに対応する領域から対象データを読み出し、バッファメモリ３２３に格納する（ステップＳ１０２）。【０１６９】
そして、ＦＭプロセッサ３２０ｂは、完了応答をストレージコントローラ３０のＣＰＵ３３に対して送信し（ステップＳ１０３）、ＦＭデータ読み出し処理を終了する。【０１７０】
図２３は、実施例１に係るＦＭデータ書き込み処理のフローチャートである。【０１７１】
ＦＭデータ書き込み処理は、図２１に示すデータ受領処理（ＦＭ）のステップＳ９６における、バッファメモリ３２３上のデータをＦＭチップ３２１のキャッシュセグメント３２５に格納する要求を、ＦＭプロセッサ３２０ｂが受信した場合に実行される。【０１７２】
まず、ＦＭプロセッサ３２０ｂは、データ格納先のＦＭチップ３２１のページ（ＦＭページともいう。）を確保する（ステップＳ１１１）。ここで、ＦＭチップ３２１は、同一のページに対してデータを上書きできないので、ＦＭプロセッサ３２０ｂは、既に消去済みのＦＭページをデータ格納先として選ぶ。もし消去済みのＦＭページが無い場合は、ＦＭプロセッサ３２０ｂは、ＦＭチップ３２１の空きブロック（空きＦＭブロックともいう）、すなわち有効データが格納されていないＦＭチップ３２１のブロック（ＦＭブロックともいう）を消去して、そのＦＭブロックの先頭から必要な量のＦＭページをデータ格納先として選ぶ。【０１７３】
次に、ＦＭプロセッサ３２０ｂは、バッファメモリ３２３上のデータを、確保したＦＭページに書き込む（ステップＳ１１２）。【０１７４】
そして、ＦＭプロセッサ３２０ｂは、今回処理対象とした論理アドレスが、新たにデータを格納したＦＭページの物理アドレスに対応するよう、論理アドレスと物理アドレスとの対応関係を表すマッピングテーブルを更新し、また、古いデータが格納されているＦＭページが無効であることを記憶する（ステップＳ１1３）。このとき、ＦＭプロセッサ３２０ｂは、無効になったＦＭページが含まれるＦＭブロックの全ＦＭページが無効である場合には、当該ＦＭブロックを空きＦＭブロックとして管理する。この時点で、空きＦＭブロックのデータを消去してもよいし、後でバックグラウンド処理として空きＦＭブロックのデータを消去してもよい。【０１７５】
そして、ＦＭプロセッサ３２０ｂは、完了応答をストレージコントローラ３０のＣＰＵ３３に対して送信し（ステップＳ１１４）、ＦＭデータ書き込み処理を終了する。
【実施例２】
【０１７６】
次に、実施例２に係る情報システムについて説明する。その際、前述の実施例のうちの少なくとも１つの実施例との相違点を主に説明し、前述の実施例のうちの少なくとも１つの実施例との共通点については説明を省略あるいは簡略化する。これは、実施例２に限らず、実施例３以降についても同様である。【０１７７】
図２４は、実施例２に係る情報システムの構成図である。なお、実施例１に係る情報システムと同様な構成に対しては、同一の符号を付している。【０１７８】
実施例２に係る情報システムと、実施例１に係る情報システムとの主な違いは、ＦＭボード３２がホスト計算機８０に搭載されることにある。このホスト計算機８０が、情報処理装置の一例である。【０１７９】
実施例２に係る情報システムは、ホスト計算機８０と、ホスト計算機８０に直接あるいはネットワークを経由して接続されるＨＤＤ４０、ＳＳＤ４１、またはストレージシステム２０とを含む。【０１８０】
ホスト計算機８０は、ＣＰＵ８１と、ＲＡＭ８４と、ＦＭボード３２と、ストレージインタフェース８２と、ネットワークインタフェース８３とを含む。【０１８１】
ストレージインタフェース８２は、ＨＤＤ４０又はＳＳＤ４１を接続するためのインタフェースである。ネットワークインタフェース８３は、ネットワークを介してストレージシステム２０と接続するためのインタフェースである。ＦＭボード３２は、図４に示す実施例１に係るＦＭボードと同様な構成である。【０１８２】
ＲＡＭ８４は、ＣＰＵ８１が実行するアプリケーションプログラム８４１と、オペレーティングシステム８４２（オペレーティングシステムＡ、オペレーティングシステムＢ）と、ハイパーバイザプログラム８４３と、ストレージ制御プログラム３４０と、キャッシュ制御情報３４１とを格納する。また、ＲＡＭ８４は、データをキャッシュするためのキャッシュセグメント３４３を格納する。【０１８３】
ハイパーバイザプログラム８４３は、ホスト計算機８０で構築する仮想マシン（ＶＭ）を管理するプログラムである。なお、ハイパーバイザプログラム８４３の機能を、ハードウェアとして実装してもよい。【０１８４】
図２５は、実施例２に係るデータ入出力処理の概要を示す図である。【０１８５】
本実施例に係るホスト計算機８０においては、一番下の階層には、ＣＰＵ８１がハイパーバイザプログラム８４３を実行することにより構築されるハイパーバイザＨＶが位置する。ハイパーバイザＨＶは、仮想化機構の一種である。仮想化機構は、プログラムを実行するプロセッサを有した計算機であっても良い。ハイパーバイザＨＶによって、１以上の仮想マシン（図２５では、仮想マシンＡ（ＶＭＡ）及び仮想マシンＢ（ＶＭＢ）が実現される。仮想マシンＡでは、オペレーティングシステムＡが動作し、その上でアプリケーションプログラム８４１が動く。また、仮想マシンＢでは、オペレーティングシステムＢが動作し、その上でストレージ制御プログラム３４０が動く。ストレージ制御プログラム３４０は、ＲＡＭ３４のキャッシュセグメント３４３およびＦＭチップ３２１のキャッシュセグメント３２５を用いて、実施例１と同様なキャッシュを制御する。なお、ストレージ制御プログラム３４０はホスト計算機８０に接続されたＨＤＤ４０、ＳＳＤ４１、またはストレージシステム２０に対するデータ入出力の制御も行う。【０１８６】
仮想マシンＡのアプリケーションプログラム８４１と、仮想マシンＢのストレージ制御プログラム３４０とは、仮想マシン間通信によって互いに通信を行う。なお、この仮想マシン間通信は、ハイパーバイザＨＶあるいは各オペレーティングシステム８４２によって仮想化され、アプリケーションプログラム８４１やストレージ制御プログラム３４０にとっては、例えばＳＣＳＩのようなストレージインタフェースを介した通信と同様の仮想的なインタフェースを用いて行ってもよい。【０１８７】
実施例２に係る情報システムによると、ホスト計算機８０において、ＲＡＭキャッシュセグメント３４３と、ＦＭキャッシュセグメント３２５とを用いて、適切にデータのキャッシュを行うことができる。
【実施例３】
【０１８８】
次に、実施例３に係る情報システムについて説明する。【０１８９】
図２６は、実施例３に係る情報システムの構成を示す図である。【０１９０】
実施例３に係る情報システムは、実施例２に係る情報システムとは、ホスト計算機におけるＲＡＭで管理する内容が異なっている。【０１９１】
実施例３に係るホスト計算機９０は、ＲＡＭ９１を含む。このホスト計算機９０は、情報処理装置の一例である。ＲＡＭ９１は、オペレーティングシステム９１１を格納する。オペレーティングシステム９１１は、ストレージ制御プログラム３４０およびキャッシュ制御情報３４１をドライバとして含む。【０１９２】
図２７は、実施例３に係るデータ入出力処理の概要を示す図である。【０１９３】
実施例３に係るホスト計算機９０では、アプリケーションプログラム８４１がストレージ（ＨＤＤ４０、ＳＳＤ４１、またはストレージシステム２０）に対する入出力を行う際、オペレーティングシステム９１１に含まれるストレージ制御プログラム３４１がこの入出力要求を処理し、実施例１と同様に、ＲＡＭキャッシュセグメント３４３やＦＭキャッシュセグメント３２５へのキャッシングを行う。また、ストレージ制御プログラム３４１は、ストレージに対して入出力を行うために、各種デバイスドライバ（９１２、９１３）にストレージに対する入出力要求を渡す。デバイスドライバＡ９１２は、入出力要求に基づいて、ストレージインタフェース８２を制御する。デバイスドライバＢ９１３は、入出力要求に基づいて、ネットワークインタフェース８３を制御する。【０１９４】
実施例３に係る情報システムによると、ホスト計算機９０のオペレーティングシステム９１１が、ＲＡＭキャッシュセグメント３４３と、ＦＭキャッシュセグメント３２５とを用いて、適切にデータのキャッシュを行うことができる。
【実施例４】
【０１９５】
次に、実施例４に係る情報システムについて説明する。【０１９６】
実施例４に係る情報システムと実施例１に係る情報システムとの違いは、リードコマンド処理の手順である。実施例４に係る情報システムでは、ドライブからステージングしたデータを、バッファメモリ３２３からＦＭチップ３２１に書き込む前に、まずバッファメモリ３２３からホスト計算機１０へ送信し、その後でＦＭチップ３２１に書き込む。こうすることでリードコマンド完了までの所要時間（レスポンスタイム）を短くすることができる。【０１９７】
図２８は、実施例４に係るジョブ制御テーブルの構成図である。【０１９８】
ジョブ制御テーブル３４４は、ジョブ種類３４４ａと、論理ユニット番号３４４ｂと、論理ブロックアドレス３４４ｃと、転送長３４４ｄと、バッファアドレス３４４ｅとを記憶する。ジョブ種類３４４ａは、ジョブが行う処理の種類を表す。ジョブ種類３４４ａは、例えば、リードコマンド処理であれば「１」、ライトコマンド処理であれば「２」などのジョブを示すＩＤである。論理ユニット番号３４４ｂ、論理ブロックアドレス３４４ｃ、及び転送長３４４ｄは、それぞれ、ホスト計算機１０から受信したリード・ライトコマンドに指定された、アクセス対象についての論理ユニットの番号、論理ブロックアドレス（ＬＢＡ）、転送長を表す。バッファアドレス３４４ｅは、このジョブが確保しているバッファのアドレスを表す。バッファアドレス３４４ｅは、バッファが確保されてないときは、アドレスが無効であることを表す値（例えばＮＵＬＬ）となっている。【０１９９】
図２９は、実施例４に係るリードコマンド処理の第１のフローチャートであり、図３０は、実施例４に係るリードコマンド処理の第２のフローチャートである。図２９のフローチャートの符号Ａは、図３０のフローチャートの符号Ａに繋がっていることを示している。【０２００】
リードコマンド処理は、ホスト計算機１０からストレージコントローラ３０がリードコマンドを受信した場合に実行される。【０２０１】
まず、リードコマンドを受信したストレージコントローラ３０のＣＰＵ３３は、リードコマンドで指定されているリード対象アドレスに対応するキャッシュセグメントが割り当て済みであるか否かを判定する（ステップＳ１）。この結果、キャッシュセグメントが割り当て済みであれば（ステップＳ１：ＹＥＳ）、ＣＰＵ３３は、ステップＳ３へ処理を進める一方、キャッシュセグメントが未割り当てであれば（ステップＳ１：ＮＯ）、キャッシュ割り当て処理（図１４参照）を実行し（ステップＳ２）、ステップＳ３へ処理を進める。キャッシュ割り当て処理は、実施例１で説明した通りである。【０２０２】
ステップＳ３では、ＣＰＵ３３は、リード対象アドレスに対応するキャッシュセグメントを含むスロットをロックする。具体的には、ＣＰＵ３３は、このキャッシュセグメントを含むスロットのＳＬＣＴ１１０のスロットステータス１１０ｅの「ロック中」を表すビットをＯＮにすることで、当該スロットがロックされていることを表す。【０２０３】
続いてＣＰＵ３３は、リード対象のデータがキャッシュセグメントに格納されているか否か、すなわち、キャッシュヒットか否かを判定する（ステップＳ４）。具体的には、ＣＰＵ３３は、リード対象のキャッシュセグメントに対応するＳＧＣＴ１２０のステージングビットマップ１２０ｅおよびダーティビットマップ１２０ｆを調べ、リード対象の全ブロックに関して、当該ブロックに対応するステージングビットマップ１２０ｅのビットもしくはダーティビットマップ１２０ｆのビットのいずれかがＯＮであれば、キャッシュヒットであると判断する。一方、ＣＰＵ３３は、リード対象の範囲内に、ダーティビットマップ１２０ｆとステージングビットマップ１２０ｅとの対応するビットがいずれもＯＦＦであるブロックが一つでもある場合は、キャッシュミスであると判断する。【０２０４】
この結果、キャッシュヒットの場合（ステップＳ４：ＹＥＳ）は、ＣＰＵ３３は、処理をステップＳ１２２へ進める一方、キャッシュミスの場合（ステップＳ４：ＮＯ）は、ステージング処理（図３１参照）を実行し（ステップＳ１２１）、処理をステップＳ１２２に進める。ステージング処理では、ドライブ（ＨＤＤ４０、またはＳＳＤ４１）からキャッシュセグメント（３２５又は３４３）へデータが読み込まれる。ステージング処理が完了すると、リード対象のデータがキャッシュセグメント（３２５又は３４３）に格納された状態になる。【０２０５】
ステップＳ１２２では、ＣＰＵ３３は、キャッシュセグメントに格納されたデータをホスト計算機１０に送信するデータ送信処理（図３２参照）を実行する。【０２０６】
続いて、ＣＰＵ３３は、コマンドの完了ステータスをホスト計算機１０に送信する（ステップＳ７）。すなわち、ＣＰＵ３３は、コマンドの処理中にエラーが発生してリード処理が正常に完了しなかった場合はエラーステータス（例えばCHECK  CONDITION）を返す一方、リード処理が正常に完了した場合は正常ステータス（GOOD）を返す。【０２０７】
次に、ＣＰＵ３３は、ＦＭチップ３２１へのライトを実施中か否かを判定する（ステップＳ１２３）。「ＦＭチップ３２１へのライトを実施中」とは、バッファメモリ３２３からＦＭチップ３２１へのデータ書き込み要求をＦＭプロセッサ３２０ｂに送信した後、まだＦＭプロセッサ３２０ｂから完了通知を受信していない状態を意味する。この結果、真であれば（ステップＳ１２３：ＹＥＳ）、ＣＰＵ３３は、ＦＭプロセッサ３２０ｂからの完了通知を待ち（ステップＳ１２４）、処理をステップＳ１２５に進める。一方、偽であれば（ステップＳ１２３：ＮＯ）、ＣＰＵ３３は、処理をステップＳ１２５に進める。【０２０８】
ステップＳ１２５では、ＣＰＵ３３は、バッファを解放する。次いで、ＣＰＵ３３は、ロックしているスロットを解放（アンロック）し（ステップＳ８）、アクセスモニタテーブル３４２を更新し（ステップＳ９）、リードコマンド処理を終了する。アクセスモニタテーブル３４２の更新とは、例えば、リード量カウンタ３４２ｅに今回のリードコマンドで読み出したデータ量を加算し、リードコマンドカウンタ３４２ｇをインクリメントする。【０２０９】
図３１は、実施例４に係るステージング処理のフローチャートである。【０２１０】
ステージング処理は、図２９のリードコマンド処理のステップＳ１２１の処理に対応する。【０２１１】
まず、ＣＰＵ３３は、リード対象アドレスに割り当てられたキャッシュセグメントの基になっているキャッシュメモリの種類を調べ、キャッシュセグメントがＲＡＭ３４上のキャッシュセグメント（ＲＡＭセグメント）３４３であるか否かを判定する（ステップＳ１１）。ここで、キャッシュセグメントの基になっているキャッシュメモリの種類は、対応するＳＧＣＴ１２０のメモリ種類１２０ｃを参照することにより特定することができる。【０２１２】
この結果、キャッシュセグメントがＲＡＭセグメント３４３であれば（ステップＳ１１：ＹＥＳ）、ＣＰＵ３３は、処理をステップＳ１２に進める一方、キャッシュセグメントがＲＡＭセグメント３４３でなければ（ステップＳ１１：ＮＯ）、処理をステップＳ１３に進める。【０２１３】
ステップＳ１２では、ＣＰＵ３３は、リード対象（ステージング対象）のデータをドライブ（ＨＤＤ４０またはＳＳＤ４１）から読み出して、ＲＡＭセグメント３４３に格納し、ステージング処理を終了する。【０２１４】
ステップＳ１３以降の処理では、キャッシュセグメントがＲＡＭセグメント３４３でない、すなわちＦＭチップ３２１上のキャッシュセグメント（ＦＭセグメント）３２５であるので、ドライブから読み上げたデータを直接ＦＭチップ３２１に書くのではなく、一旦、ＦＭボード３２のバッファメモリ３２３に格納した後、バッファメモリ３２３からＦＭチップ３２１に書き込むようにする。【０２１５】
まず、ステップＳ１３では、ＣＰＵ３３は、バッファメモリ３２３にドライブから読み上げたデータを格納するための領域（バッファ）の確保を行う。すなわち、ＣＰＵ３３は、バッファメモリ３２３のうちステージング対象のデータを格納するのに十分な領域をバッファに割り当てる。【０２１６】
次に、ＣＰＵ３３は、ステージング対象のデータをドライブから読み出してバッファに格納する（ステップＳ１４）。本実施例では、ＢＥ  Ｉ／Ｆ３５が、ＣＰＵ３３の指示を受けて、ドライブからＦＭボード３２のバッファメモリ３２３のバッファに対してデータを格納している。【０２１７】
そして、ＣＰＵ３３は、ＦＭプロセッサ３２０ｂに対し、バッファメモリ３２３のバッファ上のデータをＦＭチップ３２１に格納するよう要求する（ステップＳ１５）。この要求に対してＦＭプロセッサ３２０ｂは、データ送信処理（図３２参照）を実行する。【０２１８】
その後、ＣＰＵ３３は、ステージング処理を終了する。【０２１９】
図３２は、実施例４に係るデータ送信処理のフローチャートである。【０２２０】
データ送信処理は、図２９に示すリードコマンド処理のステップＳ１２２の処理に対応する。【０２２１】
まず、ＣＰＵ３３は、リード対象アドレスに割り当てられたキャッシュセグメントの基になっているキャッシュメモリの種類を調べ、キャッシュセグメントがＲＡＭセグメント３４３であるか否かを判定する（ステップＳ２１）。ここで、キャッシュセグメントの基になっているキャッシュメモリの種類は、対応するＳＧＣＴ１２０のメモリ種類１２０ｃを参照することにより特定することができる。【０２２２】
この結果、キャッシュセグメントがＲＡＭセグメント３４３であれば（ステップＳ２１：ＹＥＳ）、ＣＰＵ３３は、処理をステップＳ２２に進める一方、キャッシュセグメントがＲＡＭセグメント３４３でなければ（ステップＳ２１：ＮＯ）、処理をステップＳ１３１に進める。【０２２３】
ステップＳ２２では、ＣＰＵ３３は、リード対象（送信対象）のデータをＲＡＭセグメント３４３からホスト計算機１０へ転送し、データ送信処理を終了する。【０２２４】
ステップＳ１３１では、ＣＰＵ３３は、リード・ライトコマンドに対応するジョブ制御テーブル３４４のバッファアドレス３４４ｅが有効であるか否かをチェックする。この結果、バッファアドレス３４４ｅが有効であれば（ステップＳ１３１：ＶＡＬＩＤ）、ＣＰＵ３３は、処理をステップＳ１３２に進める一方、バッファアドレス３４４ｅが無効であれば、処理をステップＳ２３に進める。【０２２５】
ステップＳ２３では、ＣＰＵ３３は、バッファメモリ３２３にバッファの確保を行う。すなわち、ＣＰＵ３３は、バッファメモリ３２３から送信対象のデータを格納するのに十分な領域を割り当てる。【０２２６】
次に、ＣＰＵ３３は、ＦＭプロセッサ３２０ｂに対し、ＦＭチップ３２１のデータをバッファメモリ３２３のバッファに読み出すよう要求する（ステップＳ２４）。この要求に対してＦＭプロセッサ３２０ｂは、ＦＭデータ読み出し処理（図２２参照）を実行する。ＦＭデータ読み出し処理により、バッファメモリ３２３には、送信対象のデータが格納される。ＦＭプロセッサ３２０ｂは、ＦＭデータ読み出し処理を終了すると、その要求に対する完了応答をＣＰＵ３３に返す。【０２２７】
続いて、ＣＰＵ３３は、その要求に対する完了応答をＦＭプロセッサ３２０ｂから受け取り（ステップＳ２５）、処理をステップＳ１３２に進める。【０２２８】
ステップＳ１３２では、ＣＰＵ３３は、送信対象のデータをバッファメモリ３２３からホスト計算機１０に送信する。
【実施例５】
【０２２９】
次に、実施例５に係る情報システムについて説明する。【０２３０】
実施例５に係る情報システムと実施例１に係る情報システムとの違いは、実施例５に係る情報システムが、キャッシュセグメントが割り当てられているメモリ種類の見直しを行い、データのアクセス特性等に応じて、割り当て済のキャッシュセグメントから、異なるメモリ種類のキャッシュセグメントへデータを移動させるようにしたことである。これにより、データをそのデータのアクセス特性に応じた適切なキャッシュセグメントに格納することができる。【０２３１】
図３３は、実施例５に係るメモリ種類見直し処理のフローチャートである。【０２３２】
メモリ種類見直し処理は、例えば割り当て済の各セグメントに対して定期的に行ってもよいし、データをあるドライブから別のドライブへ移す際に、当該データが格納されているセグメントに対して行ってもよい。【０２３３】
まず、ＣＰＵ３３は、処理対象のキャッシュセグメント（図３３の説明において処理対象セグメントという）を含むスロットをロックする（ステップＳ１５１）。【０２３４】
次に、ＣＰＵ３３は、処理対象セグメントのメモリ種類が適切であるか否かを判定する（ステップＳ１５２）。この判定の基準には、図１４に示したキャッシュ割り当て処理の判定基準の一部あるいは全部を用いることができる。例えばアクセス頻度が高い場合や、ＳＳＤのデータを格納している場合などは、ＲＡＭセグメント３４３が適切であり、それ以外の場合は、ＦＭセグメント３２５が適切であると判定する。【０２３５】
この判定の結果が真、すなわちメモリ種類が適切な場合（ステップＳ１５２：ＹＥＳ）は、ＣＰＵ３３は、スロットを解放し（ステップＳ１５３）、メモリ種類見直し処理を終了する。一方、判定の結果が偽、すなわちメモリ種類が不適切な場合（ステップＳ１５２：ＮＯ）は、以下の処理に進む。【０２３６】
すなわち、ＣＰＵ３３は、適切なメモリ種類の空きセグメントがあるか調べる（ステップＳ１５４）。この結果、適切なメモリ種類の空きセグメントが無ければ（ステップＳ１５４：ＮＯ）、ＣＰＵ３３は、スロットを解放し（ステップＳ１５３）、メモリ種類見直し処理を終了する。【０２３７】
一方、適切なメモリ種類の空きセグメントが有れば（ステップＳ１５４：ＹＥＳ）、ＣＰＵ３３は、処理対象セグメントのデータに対して、適切なメモリ種類のセグメントを新しく割り当てる（ステップＳ１５５）。次に、ＣＰＵ３３は、データを古いキャッシュセグメントから新しいキャッシュセグメントにコピーし（ステップＳ１５６）、古いキャッシュセグメントを解放し（ステップＳ１５７）、スロットを解放し（ステップＳ１５３）、メモリ種類見直し処理を終了する。【０２３８】
以上、いくつかの実施例を説明したが、これらは、本発明の説明のための例示であって、本発明の範囲をこれらの実施例にのみ限定する趣旨ではない。すなわち、本発明は、他の種々の形態でも実施する事が可能である。
【符号の説明】
【０２３９】
２０：ストレージシステム
３０：ストレージコントローラ
３２：ＦＭボード
３４：ＲＡＭ
３２１：ＦＭチップ 
【図１】
0006000376.tif 000002
【図２】
0006000376.tif 000003
【図３】
0006000376.tif 000004
【図４】
0006000376.tif 000005
【図５】
0006000376.tif 000006
【図６】
0006000376.tif 000007
【図７】
0006000376.tif 000008
【図８】
0006000376.tif 000009
【図９】
0006000376.tif 000010
【図１０】
0006000376.tif 000011
【図１１】
0006000376.tif 000012
【図１２】
0006000376.tif 000013
【図１３】
0006000376.tif 000014
【図１４】
0006000376.tif 000015
【図１５】
0006000376.tif 000016
【図１６】
0006000376.tif 000017
【図１７】
0006000376.tif 000018
【図１８】
0006000376.tif 000019
【図１９】
0006000376.tif 000020
【図２０】
0006000376.tif 000021
【図２１】
0006000376.tif 000022
【図２２】
0006000376.tif 000023
【図２３】
0006000376.tif 000024
【図２４】
0006000376.tif 000025
【図２５】
0006000376.tif 000026
【図２６】
0006000376.tif 000027
【図２７】
0006000376.tif 000028
【図２８】
0006000376.tif 000029
【図２９】
0006000376.tif 000030
【図３０】
0006000376.tif 000031
【図３１】
0006000376.tif 000032
【図３２】
0006000376.tif 000033
【図３３】
0006000376.tif 000034
【図３４】
0006000376.tif 000035