(57)【要約】【課題】各コントローラに分散されたアクセス要求が、各コントローラのキャッシュブロック取得による排他で競合する場合、一方のアクセスのみがキャッシュブロックの全領域を占有してデータ転送を行っていたため、待ち時間が生じていた。【解決手段】データ転送の領域が重ならない限り同一キャッシュブロックであっても両コントローラが同一キャッシュブロックにデータ転送を可能とする排他制御を行うため、各コントローラからアクセス可能な共有メモリを使用して、キャッシュブロックの使用状況を管理する。【選択図】図１
2007188409.tif 000002
【特許請求の範囲】
【請求項１】
計算機と記憶装置とを接続する記憶装置コントローラであって、前記記憶装置に関するキャッシュ管理情報を備え、前記キャッシュ管理情報として、前記記憶装置のキャッシュ単位領域の識別情報とともに、前記計算機が前記記憶装置に対して指定可能なアクセス範囲を管理し、前記アクセス範囲は前記キャッシュ単位領域よりも粒度の細かいデータ単位で管理することを特徴とする記憶装置コントローラ。
【請求項２】
請求項１に記載の記憶装置コントローラにおいて、複数の前記記憶装置コントローラを互いにバスで接続することにより多重化し、第一の記憶装置コントローラは、前記記憶装置に関するキャッシュ管理情報として、自身が計算機から要求されたアクセスのアクセス範囲とともに、同一キャッシュ単位領域について他方の記憶装置コントローラが計算機から要求されたアクセスのアクセス範囲を管理することを特徴とする記憶装置コントローラ。
【請求項３】
請求項２に記載の記憶装置コントローラにおいて、複数の前記記憶装置コントローラを互いに接続したバス上に共有メモリを備え、前記共有メモリには、各々の記憶装置コントローラがもつキャッシュ管理情報のための検索テーブルを格納し、前記検索テーブルは、アクセス対象のキャッシュ単位領域について前記キャッシュ管理情報の中に該当情報があるかどうかを示す参照情報をもたせることを特徴とする記憶装置コントローラ。
【請求項４】
請求項３に記載の記憶装置コントローラにおいて、前記記憶装置に対するアクセスの際には、前記共有メモリ上の前記検索テーブルを検索し、前記アクセスに該当するキャッシュ単位領域に関して、他方の記憶装置コントローラがもつキャッシュ管理情報の中で該当情報があるかどうかを確認することを特徴とする記憶装置コントローラ。
【請求項５】
請求項４に記載の記憶装置コントローラにおいて、前記該当情報があることを確認した場合に、前記アクセスに該当するキャッシュ単位領域に関して、前記アクセス範囲が、前記他方の記憶装置コントローラによるアクセス範囲と重複しているときは、前記計算機と前記記憶装置とのデータ転送の開始を待ち、重複していないときには、前記他方の記憶装置コントローラがもつキャッシュ管理情報において、前記アクセスに該当するキャッシュ単位領域に関して、第一の記憶装置コントローラが計算機から要求されたアクセスについてのアクセス範囲を記憶させ、前記計算機と前記記憶装置とのデータ転送の開始を待たないことを特徴とする記憶装置コントローラ。
【請求項６】
計算機と記憶装置とを接続する記憶装置コントローラにおいて、前記記憶装置に関するキャッシュ管理情報として、前記記憶装置のキャッシュ単位領域の識別情報とともに、前記計算機が前記記憶装置に対して指定可能なアクセス範囲を管理するステップと、前記アクセス範囲は前記キャッシュ単位領域よりも粒度の細かいデータ単位で管理するステップとを含むことを特徴とするキャッシュ制御方法。
【請求項７】
請求項６に記載のキャッシュ制御方法において、複数の前記記憶装置コントローラを互いにバスで接続することにより多重化するステップと、第一の記憶装置コントローラは、前記記憶装置に関するキャッシュ管理情報として、自身が計算機から要求されたアクセスのアクセス範囲とともに、同一キャッシュ単位領域について他方の記憶装置コントローラが計算機から要求されたアクセスのアクセス範囲を管理するステップとをさらに含むことを特徴とするキャッシュ制御方法。
【請求項８】
請求項７に記載のキャッシュ制御方法において、複数の前記記憶装置コントローラを互いに接続したバス上の共有メモリに、各々の前記記憶装置コントローラがもつキャッシュ管理情報のための検索テーブルを格納するステップと、前記検索テーブルは、アクセス対象のキャッシュ単位領域について前記キャッシュ管理情報の中に該当情報があるかどうかを示す参照情報をもたせるステップとをさらに含むことを特徴とするキャッシュ制御方法。
【請求項９】
請求項８に記載のキャッシュ制御方法において、前記記憶装置に対するアクセスの際には、前記共有メモリ上の前記検索テーブルを検索するステップと、前記アクセスに該当するキャッシュ単位領域に関して、他方の記憶装置コントローラがもつキャッシュ管理情報の中で該当情報があるかどうかを確認するステップをさらに含むことを特徴とするキャッシュ制御方法。
【請求項１０】
請求項９に記載のキャッシュ制御方法において、前記該当情報があることを確認した場合に、前記アクセスに該当するキャッシュ単位領域に関して、前記アクセス範囲が、前記他方の記憶装置コントローラによるアクセス範囲と重複しているときは、前記計算機と前記記憶装置とのデータ転送の開始を待つステップと、重複していないときには、前記他方の記憶装置コントローラがもつキャッシュ管理情報において、前記アクセスに該当するキャッシュ単位領域に関して、第一の記憶装置コントローラが計算機から要求されたアクセスについてのアクセス範囲を記憶させ、前記計算機と前記記憶装置とのデータ転送の開始を待たないステップとをさらに含むことを特徴とするキャッシュ制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ディスクアレイ装置における二重化されたディスクコントローラおよび同装置に適用されるキャッシュ排他制御を行う記憶装置コントローラ及びキャッシュ制御方法に関する。
【背景技術】
【０００２】
ホストとディスクアレイ装置とは、ファイバチャネルインタフェースによる接続、またはSCSI（Small Computer System Interface）により接続され、ホストからの入出力要求をディスクアレイ装置が受け取り、その要求に従ったデータを転送することでアクセスを行う。システムの構成にもよるが、通常これらのインタフェースはホストとディスクアレイ装置との間で一対一に接続される。ホストとディスクアレイ装置とを接続するインタフェースが１本の場合、アクセス性能は接続するインタフェースの種類に依存する。また、接続するインタフェースに障害が発生すると、代替パスを別に設けない限りアクセス不可の状態となる。
【０００３】
これらを改善する考えの一つとして、二重化されたコントローラを用い、アクセスパスを２本のインタフェースで接続し、入出力要求を２本のアクセスパスに分散させることで性能向上を図ると同時に、１本が使用不可となっても残りの１本でアクセスを継続させる冗長化の考え方がある。
【０００４】
ホストからディスクアレイ装置内の論理ディスクにアクセスを行う場合、該当する領域をアクセスする入出力要求を二つに分割して、それぞれのコントローラに対して発行する。コントローラは、キャッシュメモリ上にデータを格納するバッファを確保し、ホストと論理ディスクとの間のデータ転送を仲介すると同時に、ディスクキャッシュとして一時的にデータを保持することで、同一領域へのアクセスに対する高速なデータ転送を制御する。
【０００５】
それぞれのコントローラにて管理されるキャッシュメモリは、一つの論理ディスクに対して透過なキャッシュメモリとして制御する。例えば、ホストから論理ディスクへのライトアクセスを第一のコントローラを経由して発行し、続けて同一領域のリードアクセスを第二のコントローラを経由して発行する場合、ライトデータは第一のコントローラのキャッシュメモリ上に格納されるが、同時に第二のコントローラのキャッシュメモリ上にも格納しデータの一致化を行う。続けてホストから第二のコントローラに対して発行したリードアクセスは、キャッシュメモリ上に既に格納（キャッシュヒット）されているため、論理ディスクからデータを読み出すことなく、キャッシュメモリ上のデータをホストに転送することができる。このように、二重化されたコントローラ上で透過なディスクキャッシュを提供することにより、ホストから論理ディスクへのアクセスを各コントローラに対して発行することで入出力を負荷分散しつつ、アクセスパスの冗長化が実現可能となる。
【０００６】
キャッシュメモリは、ある論理的な単位に分割し管理する。この分割された単位で、自由に論理ディスク上の位置に対応させることで、そのデータを格納することができる。この分割された一つの単位をキャッシュブロックと呼ぶ。ホストからのアクセスは、この取得したキャッシュブロックのメモリ領域を使用してデータ転送を行う。
【０００７】
図１６は、従来のコントローラにおけるキャッシュ排他制御のフローチャートである。図１６に示すように、コントローラ上のキャッシュブロックを取得するためには、コントローラ間で同一領域に対するキャッシュブロックの排他が必要となる。例えば第一のコントローラが処理を開始し、ホスト入出力要求を受信したとする。すると、コントローラ間通信で領域排他をし、キャッシュブロックを取得し、ホストとのデータ転送を行い、キャッシュブロック解放をし、コントローラ間通信で領域解放をするという一連の処理をする。
【０００８】
一方、第二のコントローラが処理を開始し、ホスト入出力を受信したとき、先ほど述べたように第一のコントローラがコントローラ間通信で領域排他をしていると、第二のコントローラはコントローラ間通信により割り込まれ、次に第一のコントローラがコントローラ間通信で領域解放するまでの間、処理が待たされる。その後に、第二のコントローラが自らコントローラ間通信で領域排他を行うことになる。すなわち、ここまでの間の待ち時間1601のために、複数のコントローラが同時にホストとのデータ転送をすることはできない。
【０００９】
第二のコントローラは、自らコントローラ間通信で領域排他をした後に、キャッシュブロックを取得し、ホストとのデータ転送を行い、キャッシュブロック解放をし、コントローラ間通信で領域解放をするという一連の処理をする。なお、前記したように第二のコントローラが自らコントローラ間通信で領域排他をしてコントローラ間通信で領域解放するまでの間は、第一のコントローラはコントローラ間通信で割り込まれるが、第一のコントローラとしてはすでにホストとのデータ転送は終わっているから、待ち時間ではない。
【００１０】
このように、従来の記憶装置コントローラおよびキャッシュ制御方法では、両コントローラでキャッシュブロックを取得するため、各コントローラのマイクロプロセッサにより通信制御部を通してコントローラ間通信を行い、該当する論理ディスクのアクセス領域を排他することで、同時にキャッシュブロックの排他を行う。
【００１１】
アクセス領域の排他は、キャッシュブロック単位で行う。図１７は、キャッシュブロック単位のアクセス要求の説明図である。Ａ１は第一のコントローラに発行されたアクセス領域であり、Ａ２は第二のコントローラに発行されたアクセス領域である。図１７に示すように、ホストからのアクセスがキャッシュブロックのアラインに一致する転送の場合は、同時に二つの転送が要求されても同時に転送可能である。すなわち、第一のコントローラはキャッシュブロック1701にデータ転送を行い、第二のコントローラはキャッシュブロック1702にデータ転送を行うというように、両コントローラ共に同時にデータ転送が可能である。
【００１２】
キャッシュブロックサイズよりも小さい転送の場合は、データ転送が待たされるときがある。図１８は、同一キャッシュブロックへのアクセス要求の説明図である。Ａ１は第一のコントローラに発行されたアクセス領域であり、Ａ２は第二のコントローラに発行されたアクセス領域である。図１８に示すように、一つのキャッシュブロック1801に二つの転送が同時に要求されることになるため、キャッシュブロック単位の排他では、必ずどちらか一方の転送が待たされる。すなわち、第一のコントローラのデータ転送が終了するまで、キャッシュブロック1801は排他された状態となるため、第二のコントローラのデータ転送は待たされる。
【００１３】
また、キャッシュブロックのアラインからずれた転送の場合も、データ転送が待たされるときがある。図１９は、同一キャッシュブロックへのアクセス要求であって、キャッシュブロックのアラインからずれた要求の説明図である。Ａ１は第一のコントローラに発行されたアクセス領域であり、Ａ２は第二のコントローラに発行されたアクセス領域である。図１９に示すように、一つのキャッシュブロック1902に二つの転送が同時に要求されることになるため、キャッシュブロック単位の排他では、必ずどちらか一方の転送が待たされる。すなわち、第一のコントローラのデータ転送が終了するまで、キャッシュブロック1901とキャッシュブロック1902は排他された状態となるため、第二のコントローラのデータ転送は待たされる。なお、キャッシュブロック1903は排他されていない。
【００１４】
従来の記憶装置コントローラおよびキャッシュ制御方法としては、キャッシュメモリ分割管理の技術として、キャッシュメモリをセグメントに分割し、セグメント内でLRU(Least Recently Used)を管理し追い出し制御を行う技術がある（例えば、特許文献１参照）。また、外部と内部のプロトコル変換を行い、キャッシュアクセスを分散させる技術もある（例えば、特許文献２参照）。また、キャッシュメモリの格納サイズをパーティション単位で動的に変更可能とし、ホストからのアクセスパターンに応じて最適な性能を得る技術もある（例えば、特許文献３参照）。また、構成情報の保存を停電時でも保障する技術もある（例えば、特許文献４参照）。
【特許文献１】特開２００４−１３９３４９号公報
【特許文献２】特開２００４−２４０９４９号公報
【特許文献３】特開２００４−０３００９０号公報
【特許文献４】特開２００３−３４５５２８号公報
【発明の開示】
【発明が解決しようとする課題】
【００１５】
しかし、上記した従来技術においては、キャッシュブロックサイズよりも小さい転送の場合や、キャッシュブロックのアラインからずれた転送の場合は、一つのキャッシュブロックに二つの転送が同時に要求されるため、キャッシュブロック単位の排他では、必ずどちらか一方の転送が待たされるので、データ転送が遅れるという問題点があった。
【００１６】
すなわち、各コントローラに分散されたアクセス要求が、各コントローラのキャッシュブロック取得による排他で競合する場合、どちらか一方のアクセスのみがキャッシュブロックの全領域を占有してデータ転送を行うので、他方のアクセスの転送処理が待たされる。
【００１７】
そこで、本発明の目的は、コントローラ間の通信によるキャッシュブロック単位の排他に必要な待ち時間をなくし、分散されたホスト入出力要求を高速に処理できる記憶装置コントローラ及びキャッシュ制御方法を提供することである。
【課題を解決するための手段】
【００１８】
本発明に係る記憶装置コントローラは、計算機と記憶装置と接続する記憶装置コントローラであって、前記記憶装置に関するキャッシュ管理情報を備え、前記キャッシュ管理情報として、前記記憶装置のキャッシュ単位領域の識別情報とともに、前記計算機が前記記憶装置に対して指定可能なアクセス範囲を管理し、前記アクセス範囲は前記キャッシュ単位領域よりも粒度の細かいデータ単位で管理することを特徴とする。
【００１９】
本発明に係るキャッシュ制御方法は、計算機と記憶装置と接続する記憶装置コントローラにおいて、前記記憶装置に関するキャッシュ管理情報をもつステップと、前記キャッシュ管理情報として、前記記憶装置のキャッシュ単位領域の識別情報とともに、前記計算機が前記記憶装置に対して指定可能なアクセス範囲を管理するステップと、前記アクセス範囲は前記キャッシュ単位領域よりも粒度の細かいデータ単位で管理するステップとを含むことを特徴とする。
【発明の効果】
【００２０】
本発明によれば、データ転送の領域すなわちアクセス範囲についてキャッシュブロック単位よりも細かいデータ単位で管理するので、データ転送においてキャッシュの排他をしなければならない場合が格段に減り、無駄な待ち時間が大幅に短縮される。
【００２１】
また、複数のコントローラにおけるアクセス要求が、同一のキャッシュブロックに対するものであっても、データ転送の領域すなわちアクセス範囲が重ならない限り、待たされることなく処理されるので、この待ち時間が減ることで、多重化されたコントローラによるディスクへのアクセス性能について、総合的なデータ転送能力が大幅に向上する。
【００２２】
また、複数のコントローラにおけるアクセス要求が、同一のキャッシュブロックに対するものであって、しかも、各々がキャッシュブロックのアラインからずれた要求であっても、データ転送の領域すなわちアクセス範囲が重ならない限り、待たされることなく処理されるので、この待ち時間が減ることで、多重化されたコントローラによるディスクへのアクセス性能について、総合的なデータ転送能力が大幅に向上する。
【００２３】
また、共有メモリにおけるサブエントリテーブルにより各々のコントローラのキャッシュテーブルのエントリの有無を管理し、また、サブエントリテーブルを参照すればエントリの有無が即座にわかるようになるので、従来のようなコントローラ間の通信による方式よりも、排他制御に必要な処理時間が格段に短縮される。
【発明を実施するための最良の形態】
【００２４】
本発明は、データ転送の領域が重ならない限り同一キャッシュブロックであっても両コントローラが同一キャッシュブロックにデータ転送を可能とする排他制御を行うことに着目してなされたものである。従来はキャッシュブロック単位でしかキャッシュ排他制御ができなかったが、データ転送の領域すなわちアクセス範囲についてキャッシュ単位領域よりも粒度の細かいデータ単位で管理することにより、データ転送においてキャッシュの排他をしなければならない場合が格段に減り、無駄な待ち時間が大幅に短縮される。
【００２５】
また、複数のコントローラにおけるアクセス要求が、同一のキャッシュブロックに対するものであっても、データ転送の領域すなわちアクセス範囲が重ならない限り、待たされることなく処理するので、この待ち時間が減ることで、多重化されたコントローラによるディスクへのアクセス性能について、総合的なデータ転送能力が大幅に向上する。
【００２６】
また、共有メモリにおけるサブエントリテーブルにより各々のコントローラのキャッシュテーブルのエントリの有無を管理し、また、サブエントリテーブルを参照すればエントリの有無が即座にわかるようにしたので、従来のようなコントローラ間の通信による方式よりも、排他制御に必要な処理時間が格段に短縮される。
【００２７】
図１は、本発明の実施の形態を示すブロック図である。ホスト101は、接続線102 を介して、第一のコントローラ103a および第二のコントローラ103b に、それぞれホストインタフェース104a、104b により接続される。
【００２８】
各コントローラ103a、103bは、記憶装置コントローラであって、それぞれディスクインタフェース105a、105b をもち、データ記憶装置106に接続される。各コントローラ103a、103bは、それぞれ、キャッシュブロック107a、107bをもち、これらはキャッシュテーブル108a、108b によって管理される。各キャッシュテーブル108a、108bは、そのエントリにおいて、ブロック番号、自側アクセス範囲、他側アクセス範囲を管理する。詳細は後述する。
【００２９】
各コントローラ103a、103bは、バス109 によって互いに接続され、バス109には共有メモリ110が接続される。共有メモリ110には、各キャッシュテーブル108a、108bに所望のエントリが有るかどうかを調べるためのサブエントリテーブル111が格納される。キャッシュテーブル108a、108b、およびサブエントリテーブル111は、バス109 によって接続されており、両コントローラ103a、103bからアクセス可能である。
【００３０】
図２は、コントローラの内部構成を示すブロック図である。コントローラ200は、記憶装置コントローラであって、ホストインタフェース201、マイクロプロセッサ202と、メモリ203と、キャッシュメモリ204と、ディスクインタフェース205とを備える。
【００３１】
ホストインタフェース201は、ホスト208を接続路206によりコントローラ200に接続し、ホスト208からのアクセスを制御するためのものである。ホストインタフェース201に接続されるものは、通常はホスト208 のようなコンピュータであるが、コンピュータの集合体や、もしくはデータ記憶装置207以外の図示しないデータ記憶装置であってもよい（以下、ホスト等という）。
【００３２】
マイクロプロセッサ202は、コントローラ200においてデータ記憶装置に関する必要処理を実行するためのものである。メモリ203は、マイクロプロセッサ202のプログラムとデータ領域とを格納するためのものであり、コントローラ200内に実装される。
【００３３】
キャッシュメモリ204は、接続路206を介してホスト等からデータ記憶装置207に対する入出力（データ転送）要求のバッファの役目を提供するためのものである。例えば、ホスト等からのデータ記憶装置207への書き込み処理では、一旦キャッシュメモリ204にエントリ（後述）を登録して、要求ホスト等に対して書き込み完了の旨を返却し、その後に、キャッシュメモリ204からデータ記憶媒体207に対して、実際に書き込みが行われる。これはライトバックキャッシュ方式である。
【００３４】
また、ホスト等からのデータ記憶装置207に対する読み込み処理では、キャッシュメモリ204にエントリが登録されているか否かを判定し、キャッシュメモリ204に該当エントリが登録されていれば、そのエントリが保持しているデータを返却し、キャッシュメモリ204にエントリが登録されていない場合は、データ記憶装置207からキャッシュメモリ204にデータを読み出して、その後にホスト等に前記読み出しデータを接続路206を介して返却する。これはリードキャッシュ方式である。
【００３５】
ディスクインタフェース205は、データ記憶装置へのアクセスを制御するためのものである。データ記憶装置207は、図示したように複数接続してよく、ディスクアレイとしても機能する。その場合、コントローラ200はディスクアレイコントローラとして機能する。
【００３６】
図３は、図２におけるコントローラを二重化した構成を示すブロック図である。コントローラ300a、300bは、コントローラ200と同様の機能をもつ。すなわち、各コントローラ300a、300bの内部構成は図２で示したものと同様となっており、それぞれ、ホストインタフェース301a、301b、マイクロプロセッサ302a、302b、メモリ303a、303b、キャッシュメモリ304a、304b、ディスクインタフェース305a、305b、接続路306a、306b、をもつ。
【００３７】
バス307は、二重化されたコントローラを結合するためのものであり、各コントローラ300a、300b内部のバスが延長されたものである。バス307を介して、コントローラ300aのマイクロプロセッサ302aは、コントローラ300a自身がもつメモリ303a、キャッシュメモリ304aにアクセス可能なだけでなく、バス307を介して、他方のコントローラ300bがもつメモリ303b、キャッシュメモリ304bにもアクセス可能である。同様に、コントローラ300bのマイクロプロセッサ302bは、コントローラ300b自身がもつメモリ303b、キャッシュメモリ304bにアクセス可能なだけでなく、バス307を介して、他方のコントローラ300aがもつメモリ303a、キャッシュメモリ304aにもアクセス可能である。
【００３８】
共有メモリ308は、バス307に接続され、ハードウェアの機能により、各コントローラ300a、300bのマイクロプロセッサ302a、302b からアクセス可能であり、各々から共有された一つのメモリとして使用される。
【００３９】
図４は、図３で示した各コントローラ300a、300bにおけるマイクロプロセッサ302a、302bから見たメモリマップの説明図である。メモリマップ400a、400bは、それぞれ、図３で示した一方のコントローラ300aと他方のコントローラ300bから見たメモリマップである。
【００４０】
メモリ401a、401bは、各々のコントローラのマイクロプロセッサを動作させるプログラムとデータとを格納する領域である。これらの領域には、キャッシュテーブルを高速に検索するためのエントリ情報も格納される（後述）。キャッシュメモリ402a、402bは、それぞれ、ホストとデータ記憶装置とのデータ転送を仲介するキャッシュメモリである。
【００４１】
共有メモリ403は、両コントローラから共有された一つのメモリとして使用できるメモリ領域であり、例えばハードウェアの機能により実現される。この共有メモリ403に、後述するように、本発明ではキャッシュブロック使用領域を管理するテーブルを格納する。
【００４２】
図５は、図４のメモリマップ400a、400bにおける各種テーブルの説明図である。メモリマップ400a 、400b は、図４で示したものと同じものであり、図５ではより詳細に図示している。メモリ401aには、ハッシュテーブル501a、第一のキャッシュテーブル502a、および第二のキャッシュテーブル503a が格納される。メモリ401bには、ハッシュテーブル501b、第二のキャッシュテーブル502b、および第一のキャッシュテーブル503b が格納される。
【００４３】
ハッシュテーブル501aは、第一のキャッシュテーブル502a と第二のキャッシュテーブル503a を高速に検索するためのものである。ハッシュテーブル501b は、第二のキャッシュテーブル502b と第一のキャッシュテーブル503b を高速に検索するためのものである。
【００４４】
個々のキャッシュテーブルは、それぞれ、キャッシュブロックを管理するためのものである。具体的には、第一のキャッシュテーブル502a は第一のキャッシュブロック領域505a を管理し、第二のキャッシュテーブル503a は第二のキャッシュブロック領域の写し 506a を管理し、第二のキャッシュテーブル502b は第二のキャッシュブロック領域506b を管理し、第一のキャッシュテーブル503b は第一のキャッシュブロック領域の写し 505b を管理する。
【００４５】
第一のディレクトリ情報504a と第二のディレクトリ情報504b は、リードキャッシュおよびライトバックキャッシュの管理情報を格納する領域であり、キャッシュブロックの有効なデータ位置を示す。
【００４６】
第一のキャッシュブロック領域505a および第二のキャッシュブロック領域506bは、ホストとデータ記憶装置との転送データを格納するキャッシュブロックが格納される領域であり、それぞれ、キャッシュメモリ402a、402bの半分の領域を割当てる。第二のキャッシュブロック領域の写し 506a および第一のキャッシュブロック領域の写し505bは、それぞれ、反対側（他側）のコントローラが持つ第二のキャッシュブロック領域の写し、および第一のキャッシュブロック領域の写しを格納する領域である。第一のサブエントリテーブル507a、第二のサブエントリテーブル507bは、各コントローラにて使用しているキャッシュブロックの取得状態を他のコントローラと共有し、同一キャッシュブロックに関する高速な検索開始位置を示すためのものである。
【００４７】
図６は、キャッシュメモリと論理ディスクとの対応関係の説明図である。キャッシュメモリ上におけるキャッシュブロック領域600は、16kB（キロバイト）単位のキャッシュブロック（例えばキャッシュブロック602 等）に分割され、縦m 個×横n 個のキャッシュブロックが配置される。本実施例の形態では、列（レベル）の数は32（0番目から31番目）としており、行（カラム）の数は j（0番目からj-1番目）としている。例えばカラムn のキャッシュブロックの集合601において、キャッシュブロック602は、カラム値が n、レベル値が m として指定される。
【００４８】
論理ディスク603 は、１つまたは複数のデータ記憶装置をまとめて一括的にアクセスされる論理的なディスクをあらわしたものである。論理ディスク603内の論理的なブロックの位置は、ブロック番号で指定される。当該ブロック番号は0番から始まり、ブロック604 については k番目である。なお、図示していないが論理ディスク自体を複数取り扱うことも可能であり、その場合、個々の論理ディスクは論理ディスク番号にて識別される。
【００４９】
キャッシュメモリ内のあるキャッシュブロックは、論理ディスク内のあるブロックと対応付けられる。図６では、キャッシュブロック602が、論理ディスク603内におけるブロック番号k のブロック604と対応付けられている。このように、キャッシュメモリは、セットアソシアティブ方式によるメモリマッピングで管理される。
【００５０】
キャッシュメモリ上のキャッシュブロックでは、論理ディスク上のデータに関し、リードキャッシュとライトバックキャッシュの２種類のデータが保持され、管理される。すなわち、ホスト等からのリードアクセスまたはライトアクセスによりキャッシュブロック領域を検索し、対象となるキャッシュブロックとホストまたはディスクとの間でデータ転送を行う。
【００５１】
図７は、キャッシュテーブルとハッシュテーブルとの構造の説明図である。キャッシュテーブル701は、図６で示したキャッシュブロックを高速に検索するためのものであり、複数のエントリからなる。エントリ702は、キャッシュブロックを高速に検索するためものであり、キャッシュブロックがどの論理ディスクのどの領域と対応付けられているかを管理する情報と、さらに、コントローラによる論理ディスクのアクセス範囲を管理する情報とを含むものである。
【００５２】
キャッシュテーブル701は、好ましくはLRU(Least Recently Used)方式によるキュー構造として管理される。キューの長さは、図６で示したキャッシュブロックの配置でいう列（レベル）の数に相当する。つまり本実施例の形態では一つのキューにLRU#0のエントリからLRU#31のエントリまでの32個のエントリが連なる。
【００５３】
キューのエントリは、図６で示したキャッシュブロックにおいて同じカラム番号とレベル番号とを持つキャッシュブロックの一つと対応づけられる。例えばエントリ702は、カラム番号n 、レベル番号 m であり、図６で示した同じカラム番号とレベル番号とを持つキャッシュブロック602と対応づけられる。なお、キャッシュテーブル701 におけるエントリの並びと、図６で示したカラムn のキャッシュブロックの並びとは、必ずしも並び方は一致しない。キャッシュテーブル701の方はLRU方式により順次並び替えられる。キャッシュテーブル701全体としては、ハッシュテーブル703における0番目からj-1番目の要素のいずれか（例えばn 番目）に繋がる。
【００５４】
ハッシュテーブル703の大きさは、図６で示したキャッシュブロックの配置でいう行（カラム）の数j に相当する。j の値は、キャッシュメモリ全体のサイズに依存し、好ましくは素数を採用する。
【００５５】
図８は、キャッシュテーブルのエントリの内容の説明図である。キャッシュテーブルのエントリ702の内容には、LRUキューポインタ801と、ブロック番号802と、論理ディスク番号803と、レベル番号804と、カラム番号805と、サブエントリ番号806と、自側アクセス範囲807と、他側アクセス範囲808と、が含まれる。
【００５６】
LRUキューポインタ801は、LRUキュー内において前後するエントリ同士を結ぶものであり、p であらわされる。ブロック番号802は、論理ディスク番号803で識別される論理ディスクにおける論理的なブロック番号であり、k であらわされる。なお、１ブロックは通常５１２バイトに相当する。論理ディスク番号803は、論理ディスクが複数あるときの論理ディスクの識別番号であり、l であらわされる。レベル番号804は、図７に示したように、キャッシュブロックの配置の行を特定するものであり、m であらわされる。カラム番号805は、図７に示したように、キャッシュブロックの配置の列を特定するものであり、n であらわされる。上記したレベル番号とカラム番号とにより、本エントリに対応するキャッシュブロックが特定される。サブエントリ番号806は、後述するように、本エントリを指しているサブエントリの番号を示すものであり、i であらわされる。自側アクセス範囲807は、本エントリに対応付けられる論理ディスクの当該位置に対し、自側のコントローラにアクセス要求をしたホスト等によるアクセス範囲を示すものであり、hs であらわされる。他側アクセス範囲808は、本エントリに対応付けられる論理ディスクの当該位置に対し、他側のコントローラにアクセス要求をしたホスト等によるアクセス範囲を示すものであり、ha であらわされる。
【００５７】
ところで、ホスト等から論理ディスクに対してアクセスされるとき、論理ディスク番号l と前記論理ディスク内のブロック番号k とが指定される。これらを用いて、ホスト等からアクセスされた方（自側）のコントローラは、ハッシュテーブル内の位置であるカラム番号nを、式（１）に示すハッシュ関数で算出する。
【００５８】
［数１］
n ＝ b mod j  ・・・  （１）
式（１）において、b mod j とあるのは、b を整数 j で割った余りである。図９に示すように、b は、”論理ディスク番号l ”と”ブロック番号k のキャッシュアライン単位”とを結合した値である。ブロック番号のキャッシュアライン単位とは、ブロック番号をキャッシュアライン値（例えば32）で割った値である。値 j は、すでに述べたように、ハッシュテーブルのカラム番号の最大値であり、好ましくは素数が使用される。このように、ハッシュテーブルは、キャッシュブロックの検索を高速に行うための検索開始位置を示すためのものとして構成される。
【００５９】
論理ディスク上の任意の位置は、キャッシュメモリに対応付ける際、ハッシュテーブルにおいて、アクセス対象位置に関して均等に対応付けられる。
【００６０】
図１０は、サブエントリテーブルとハッシュテーブルとの構造の説明図である。サブエントリテーブル1001は、ハッシュテーブル703とは別個のハッシュテーブルであり、ハッシュテーブル703の各要素につながっている。ハッシュテーブル703のカラムn を基点とし、キャッシュテーブル701とサブエントリテーブル1001とがそれぞれつながっており、そのことで両者は対応付けられている。なお、サブエントリテーブル1001は、図示していないが、論理ディスク番号毎にも存在する。
【００６１】
このサブエントリテーブル1001に関して、ホスト等からアクセスされた方（自側）のコントローラは、指定されたブロック番号k を使用して、（式１）で算出したカラム番号n とともに、前記カラム番号n におけるサブエントリテーブル1001内の位置 i を式（２）に示すハッシュ関数で算出する。
【００６２】
［数２］
i ＝ (k / 32) mod 511  ・・・  （２）
式（２）において 511 という値は、サブエントリテーブル1001の大きさであり、好ましくは素数が使用されるところ、好適な値として 511 となっている。
【００６３】
サブエントリ1002は、後述するように、キャッシュテーブル701のエントリ702を即座に参照可能とするか、または、ディレクトリ情報からキャッシュブロックを検索すべきとするかを判断するための各種情報を含むものである。上記したサブエントリテーブル1001を共有メモリ上に置くことで、各マイクロプロセッサから同一のサブエントリテーブルを使用してキャッシュ管理を行うことができる。
【００６４】
図１１は、サブエントリテーブルのサブエントリの内容の説明図である。サブエントリテーブルのサブエントリ1002の内容には、エントリ情報1101と、ブロック番号1102と、が含まれる。サブエントリのエントリ情報1101は、数値 e であらわされ、その値に応じて以下のような意味をもち、値が格納される。
【００６５】
(I) 0 の場合：
初期状態、すなわち、本サブエントリに対応付けられるキャッシュテーブルのエントリが無い状態である。
【００６６】
(II) 1〜32 の場合：
異なる複数のブロック番号k に対し、（式２）により同一のサブエントリ番号 i が重複している状態であり、そのときの重複数、すなわち、そのようなエントリがカラムn のキャッシュテーブルに存在する数を示す。
【００６７】
(III) 80 + m の場合：
（式２）により算出されるサブエントリ番号i として、唯一つのブロックがキャッシュされている状態であり、キャッシュテーブルのレベル番号 m にこれに対応するエントリが存在する。
【００６８】
ブロック番号1102は、サブエントリテーブルが属する論理ディスクにおける論理的なブロック番号であり、k であらわされる。なお、１ブロックは通常５１２バイトに相当する。
【００６９】
図１２は、サブエントリテーブルとキャッシュテーブルとキャッシュブロックとの対応関係の説明図である。ホスト等からのアクセス要求により、指定された論理ディスクのブロック番号から、カラム番号n と、カラムnのサブエントリテーブル1001におけるサブエントリ番号 iが定まる。このサブエントリ(i) 1002 の内容をみて、エントリ情報e の値が 80 以上（すなわち 80 + m）であれば、前記 m の値（すなわち e - 80）をカラムnのキャッシュテーブル701のレベル番号として、対応するエントリ702が存在することがわかる。このときのキャッシュデータはカラムn のキャッシュブロック601 におけるレベル番号m のキャッシュブロック602 に格納される。
【００７０】
サブエントリテーブルのサブエントリ(i)の値は、ハッシュによる分散により、通常はほとんど、初期状態の０であるか、または 80 + m であって相当するエントリm がキャッシュテーブルに存在する状態となる。サブエントリ(i)の値が 1 〜 32 である場合は、複数のエントリが存在することになり、高速な検索ではなくディレクトリ情報からキャッシュブロックを検索する。このサブエントリの情報をキャッシュサーチ時に参照することにより、他コントローラ側のキャッシュテーブルのどこにエントリがあるか、キャッシュブロックのどの領域を使用しているのかが自コントローラ側から即座に判断することができる。
【００７１】
図１３は、ホスト等からのアクセス要求により、キャッシュの使用を開始する場合のコントローラの処理のフローチャートである。ホスト等からのアクセス要求により、要求された側のコントローラにおいて本処理が開始される（S1301）。まず、ハッシュテーブルのカラム番号n が（式１）により算出される（S1302）。次に、前記カラム番号n におけるサブエントリテーブル内の位置 i が（式２）により算出される（S1303）。そして、他側のサブエントリテーブルのサブエントリi について、エントリ情報e の値、すなわち”他(i).e”が0 かどうかを調べる（S1304）。これは、同サブエントリi の内容を参照することで即座にわかる。
【００７２】
他(i).eが0の場合は（S1304:YES）、対応するエントリがキャッシュテーブルに無く、他側のコントローラは当該キャッシュブロックを使用していないことがわかるので、自側のキャッシュテーブルのカラムn においてエントリの検索、すなわちカラムサーチを行う（S1305）。ここでは、自側のキャッシュテーブルのカラムn の中から、アクセスの対象となるキャッシュブロックに該当するエントリ（すなわち”自エントリ”）が有るかどうか検索する（S1306）。すなわち、カラムn の中から、指定された論理ディスク番号と論理ディスク内のブロック番号のキャッシュアライン単位とをもとに、該当するエントリが有るかどうか検索する。
【００７３】
自エントリが無い場合は（S1306:NO）、当該ブロック番号がキャッシュされていないので、新たにキャッシュブロックを取得する（S1307）。そこで、自側のサブエントリテーブルのサブエントリi について、エントリ情報eの値、すなわち”自(i).e”が0 かどうかを調べる（S1308）。
【００７４】
自(i).eが0の場合は（S1308:YES）、対応するエントリがキャッシュテーブルに無いので、自(i).eに80+mを代入し、また自(i).k にk を代入する（S1309）。ここで、自(i).eに80+m を代入するとは、自側のサブエントリテーブルのサブエントリi のエントリ情報e として、80+m を代入することである。mは、カラムn のLRUキューにおいて、最後に参照されてから最も長い時間が経過したエントリのレベル番号である。また、自(i).kにk を代入するとは、自側のサブエントリテーブルのサブエントリi のブロック番号k の値に、ホスト等から指定されたブロック番号k の値を代入することである。これにより、当該ブロックがキャッシュされていることが即座にわかるようになる。そして、自側のキャッシュテーブルのレベル番号m のエントリにおける自側アクセス範囲すなわち”自(m).hs”に h を代入する（S1310）。つまり、アクセス範囲h は自側コントローラによって使用されていることを示すために、同エントリの内容を今回のアクセスによって置き換える。そして、本処理を終了する（S1311）。
【００７５】
ステップS1304で、他(i).eが0でない場合は(S1304:NO)、対応するエントリがキャッシュテーブルにあるので、当該サブエントリのブロック番号すなわち”他(i).k”がkであるかどうかを調べる（S1312）。これらは、当該サブエントリi の内容を参照すれば即座にわかる。
【００７６】
他(i).kがkでない場合は（S1312:NO）、他側のサブエントリテーブルには該当情報がないので、ディレクトリ情報から該当するキャッシュブロックがあるかどうかの検索、すなわちディレクトリサーチをする（S1313）。ここでは、他側のディレクトリ情報から、アクセスの対象となるキャッシュブロックに該当する有効なデータ位置が示されているエントリ（すなわち”他エントリ”）が有るかどうか検索する（S1314）。
【００７７】
ディレクトリ内に他エントリが無い場合は（S1314:NO）、他側のコントローラは当該キャッシュブロックを使用していないので、自側のキャッシュテーブルのカラムn においてエントリの検索、すなわちカラムサーチを行う（すでに述べたS1305）。
【００７８】
ディレクトリ内に他エントリが有る場合は（S1314:YES）、当該キャッシュブロックがキャッシュされているので、他側のキャッシュテーブルからの検索、すなわちリストサーチ（S1321）を行う（後述）。
【００７９】
ステップS1306で、自エントリが有る場合は（S1306:YES）、当該ブロック番号がキャッシュされているので、自側のキャッシュテーブルのレベル番号m のエントリにおける他側アクセス範囲すなわち”自(m).ha”が h であるかどうかを調べる（S1315）。これは、同エントリm の内容を参照することで即座にわかる。
【００８０】
自(m).ha が h でない場合は（S1315:NO）、アクセス範囲h が他側コントローラによって使用されていないので、自側アクセス範囲すなわち”自(m).hs”にh を代入する（S1310）。つまり、アクセス範囲h は自側コントローラによって使用されていることを示すために、同エントリの内容を今回のアクセスによって置き換える。
【００８１】
自(m).ha が h である場合は（S1315:YES）、アクセス範囲h が他側コントローラによって使用されているので、今回のアクセスはデータ転送開始待ちの状態となる（S1316）。これらは、同エントリm の内容を参照することで即座にわかる。
【００８２】
ステップS1308で、自(i).eが0でない場合は（S1308:NO）、サブエントリi に対応するエントリがキャッシュテーブルに有るので、さらに、自(i).eが80以上かどうかを調べる
（S1317）。
【００８３】
自(i).eが80以上でない場合は（S1317:NO）、自(i).eに自(i).e + 1 を代入する（S1318）。つまり、同サブエントリi に対応するエントリの数が１増加するために、そのエントリ数を新たに記憶させる。
【００８４】
自(i).eが80以上である場合は（S1317:YES）、自(i).eに2 を代入する（S1319）。つまり、同サブエントリi に対応するエントリが２個となる（すなわち一つだけでなくなる）ことになるためにそのエントリ数として２を記憶させる。上記の代入の後、自側のキャッシュテーブルのレベル番号m のエントリにおける自側アクセス範囲すなわち”自(m).hs”に h を代入する（S1310）。つまり、アクセス範囲h は自側コントローラによって使用されていることを示すために、同エントリの内容を今回のアクセスによって置き換える。
【００８５】
ステップS1312で、他(i).kがkである場合は（S1312:YES）、他側のサブエントリテーブルに該当情報があるので、さらに、他(i).eが80以上かどうかを調べる（S1320）。
【００８６】
他(i).eが80以上でない場合は（S1320:NO）、同サブエントリi に対応するエントリが複数あることになるので、他側のキャッシュテーブルのカラムn においてエントリの検索、すなわちリストサーチを行うことにより、該当するレベル番号m を取得する（S1321）。
【００８７】
他(i).eが80以上である場合は（S1320:YES）、同サブエントリi に対応するエントリは一つだけであり、その値を 80 + m としたとき m がキャッシュリストのレベル番号であるので、レベル番号m の値として他(i).e - 80 を代入する（S1322）。そして、他側のキャッシュテーブルのレベル番号m のエントリにおける自側アクセス範囲すなわち”他(m).hs”が h であるかどうかを調べる（S1323）。これは、同エントリm の内容を参照することで即座にわかる。
【００８８】
他(m).hs が h である場合は（S1323:YES）、アクセス範囲h が自側コントローラによって使用されているので、今回のアクセスはデータ転送開始待ちの状態となる（S1316）。他(m).hs が h でない場合は（S1323:NO）、アクセス範囲h が自側コントローラによって使用されていないので、自側アクセス範囲すなわち”他(m).ha”にh を代入する（S1324）。これらは、同エントリm の内容を参照することで即座にわかる。上記の後、本処理を終了する（S1311）。
【００８９】
図１４は、ホスト等からのアクセス要求に関する処理の終了により、キャッシュの使用を終了する場合のコントローラの処理のフローチャートである。ホスト等からのアクセス要求に関する処理の終了により、要求された側のコントローラにおいて本処理が開始される（S1401）。まず、自側のキャッシュテーブルに要求対象のエントリが有るかどうかを調べる（S1402）。
【００９０】
該当するエントリが有る場合（S1402:YES）、転送待ちであるかどうかを調べる（S1403）。
【００９１】
転送待ちでない場合は（S1403:NO）、キャッシュの使用を終了してよいので、自側のキャッシュテーブルのレベル番号m のエントリにおける自側アクセス範囲が未使用であることを示すために、”自(m).hs”に 0 を代入する（S1404）。そして、自ディレクトリ情報を更新し（S1405）、上記を反映するようにLRUを変更する（S1406）。そして、本処理を終了する（S1407）。
【００９２】
ステップ（S1402）で、該当するエントリが無い場合は（S1402:NO）、転送待ちであるかどうかを調べる（S1408）。
【００９３】
転送待ちでない場合は（S1408:NO）、キャッシュの使用を終了してよいので、他側のキャッシュテーブルのレベル番号m のエントリにおける他側アクセス範囲が未使用であることを示すために、”他(m).ha”に 0 を代入する（S1409）。そして、他ディレクトリ情報を更新する（1510）。そして、本処理を終了する（S1407）。
【００９４】
ステップ（S1403）で、転送待ちである場合は（S1403:YES）、データ転送再発行を行う（S1411）。
【００９５】
ステップ（S1408）で、転送待ちである場合は（S1408:YES）、データ転送再発行を行う（S1412）。
【００９６】
図１５は、キャッシュブロックを別のキャッシュブロックに割当て直す等により、キャッシュエントリを削除する場合のコントローラの処理のフローチャートである。ホスト等からのアクセス要求により、既存のキャッシュエントリを削除し、新たなアクセス要求で割り当て直す場合に、要求された側のコントローラにおいて本処理が開始される（S1501）。まず、自(i).eが80以上かどうかを調べる（S1502）。  自(i).eが80以上である場合は（S1502:YES）、自(i).eに0 を代入する（S1503）。つまり、同サブエントリi に対応するエントリが無いことを示すために0 を記憶させる。
【００９７】
自(i).eが80以上でない場合は（S1502:NO）、自(i).eに自(i).e - 1 を代入する（S1505）。つまり、同サブエントリi に対応するエントリの数が１減少するために、そのエントリ数を新たに記憶させる。上記の後、本処理を終了する（S1504）。
【００９８】
以上、本発明の実施の形態について、添付図面を参照しながら説明したが、本発明はかかる構成に限定されない。
【００９９】
なお、上記した本発明の実施の形態においてはコントローラを二重化したものについて説明したが、コントローラを三重化以上に多重化したものについても、当然に実施可能である。
【図面の簡単な説明】
【０１００】
【図１】本発明の実施の形態を示すブロック図である。
【図２】コントローラの内部構成を示すブロック図である。
【図３】コントローラを二重化した構成を示すブロック図である。
【図４】各コントローラにおけるマイクロプロセッサから見たメモリマップの説明図である。
【図５】メモリマップにおける各種テーブルの説明図である。
【図６】キャッシュメモリと論理ディスクとの対応関係の説明図である。
【図７】キャッシュテーブルとハッシュテーブルの構造の説明図である。
【図８】キャッシュテーブルのエントリの内容の説明図である。
【図９】論理ディスク番号とブロック番号とから値ｂを求める説明図である。
【図１０】サブエントリテーブルとハッシュテーブルとの構造の説明図である。
【図１１】サブエントリテーブルのサブエントリの内容の説明図である。
【図１２】サブエントリテーブルとキャッシュテーブルとキャッシュブロックとの対応関係の説明図である。
【図１３】キャッシュ使用開始時の処理のフローチャートである。
【図１４】キャッシュ使用終了時の処理のフローチャートである。
【図１５】キャッシュエントリ削除時の処理のフローチャートである。
【図１６】従来のコントローラにおけるキャッシュ排他制御のフローチャートである。
【図１７】キャッシュブロック単位のアクセス要求の説明図である。
【図１８】同一キャッシュブロックへのアクセス要求を説明図である。
【図１９】同一キャッシュブロックへのアクセス要求であって、キャッシュブロックのアラインからずれた要求の説明図である。
【符号の説明】
【０１０１】
１０１…ホスト、１０２…接続線、１０３ａ…第一コントローラ、１０３ｂ…第二コントローラ、１０４…ホストインタフェース、１０５…ディスクインタフェース、１０６…データ記憶装置、１０７…キャッシュブロック、１０８…キャッシュテーブル、１０９…バス、１１０…共有メモリ、１１１…サブエントリテーブル
【図１】
2007188409.tif 000003
【図２】
2007188409.tif 000004
【図３】
2007188409.tif 000005
【図４】
2007188409.tif 000006
【図５】
2007188409.tif 000007
【図６】
2007188409.tif 000008
【図７】
2007188409.tif 000009
【図８】
2007188409.tif 000010
【図９】
2007188409.tif 000011
【図１０】
2007188409.tif 000012
【図１１】
2007188409.tif 000013
【図１２】
2007188409.tif 000014
【図１３】
2007188409.tif 000015
【図１４】
2007188409.tif 000016
【図１５】
2007188409.tif 000017
【図１６】
2007188409.tif 000018
【図１７】
2007188409.tif 000019
【図１８】
2007188409.tif 000020
【図１９】
2007188409.tif 000021