(57)【要約】【課題】データ記憶アレイ・コントローラ（１０８）のキャッシュ・メモリ（１２４）などの、メモリ空間内でデータを効率的に配列し検索するための装置および方法を提供する。【解決手段】データ構造（２００）は正方向ポインタ（２１０）のアレイを有するノード（２０６）のスキップ・リストを含む。各ノード（２０６）はそのノード（２０６）をメモリ空間内のテーブル（２０２）内に記憶するためのインデックスから導かれるノード・レベルを有する。ノード（２０６）の利用可能な総数はインデックスのビット数で表すことができる最大の２の累乗の半分より小さくなるように選択し、またノード（２０６）はテーブルの偶数インデックスまたは奇数インデックスにだけ記憶される。この場合、ノード（２０６）のフリー・リストは利用可能なノード（２０６）を識別するためのカウントおよびインデックスの対のアレイから生成する。【選択図】図３
2007004801.tif 000002
【特許請求の範囲】
【請求項１】
メモリ空間内に常駐するデータ構造であって、正方向ポインタのアレイを有するノードのスキップ・リストを含み、前記スキップ・リスト内の各ノードは前記ノードに関連する前記アレイからの正方向ポインタの数に関係するノード・レベルを有し、また各ノード・レベルは前記ノードを前記メモリ空間内のテーブル内に記憶するためのインデックスから導かれる、データ構造。
【請求項２】
最高のノード・レベルのノードが前記テーブルの利用可能なインデックスの最低の集合でグループ化されるように、前記ノードはノード・レベルにより前記テーブル内に配列される、請求項１記載のデータ構造。
【請求項３】
各ノードのノード・レベルは前記関連するインデックス内の先行ゼロの数に関係して決定される、請求項１記載のデータ構造。
【請求項４】
前記スキップ・リストのノードの利用可能な総数は多数のビットのインデックスで表すことができる最大の２の累乗の半分より小さくなるように選択する、請求項１記載のデータ構造。
【請求項５】
比較的低いノード・レベルのノードはｍビットのフォーマットで構成し、比較的高いノード・レベルのノードはｎビットのフォーマットで構成し、ｍはｎより小さい、請求項１記載のデータ構造。
【請求項６】
前記テーブルの利用可能なインデックスは順次に偶数および奇数のインデックスを含み、前記ノードは前記偶数インデックスまたは奇数インデックスの選択された１つにだけ記憶する、請求項１記載のデータ構造。
【請求項７】
カウントおよびインデックスの対のアレイから生成されるテーブルからのノードのフリー・リストを更に含む、請求項６記載のデータ構造。
【請求項８】
前記テーブルは第１の１次テーブルとして特徴づけられ、また前記データ構造は前記第１の１次テーブル内の比較的高いノード・レベルのノードの分布が減少したときに追加のノードを記憶するための第２の１次テーブルを更に備える、請求項１記載のデータ構造。
【請求項９】
前記スキップ・リストのノードは第１のタイプの情報を含むものとして特徴づけられ、また前記データ構造は前記第１のタイプの情報に関連する第２のタイプの情報を与えるための2次テーブルを更に含む、請求項１記載のデータ構造。
【請求項１０】
ノードの検索動作を容易にするためのそれぞれのアップ・キューおよびダウン・キューを更に含む、請求項１記載のデータ構造。
【請求項１１】
正方向ポインタのアレイを有するノードのスキップ・リストを生成するステップであって、前記スキップ・リスト内の各ノードは前記ノードに関連する前記アレイからの多数の正方向ポインタに関係するノード・レベルを含む、前記スキップ・リストを生成するステップと、最高のノード・レベルのノードがテーブルの利用可能なインデックスの最低の集合でグループ化されるように、メモリ空間内のテーブル内のノードにノード・レベルによりインデクシングするステップと、を含む方法。
【請求項１２】
前記インデクシングするステップは、前記テーブル内の前記ノードのアドレスに関連するインデックス値内の先行ゼロの数に関係して各ノードのノード・レベルを導くことを含む、請求項１１記載の方法。
【請求項１３】
前記インデクシングするステップのインデックス値は２の累乗である、請求項１２記載の方法。
【請求項１４】
前記生成するステップの前記スキップ・リストのノードの総数は、前記インデクシングするステップのテーブルをアドレス指定するのに用いられるインデックス・フィールドのビット数により表すことができる最大の２の累乗の半分より小さくなるように選択する、請求項１１記載の方法。
【請求項１５】
前記生成するステップは、比較的低いノード・レベルのノードにｍビットのフォーマットを与え、比較的高いノード・レベルのノードにｎビットのフォーマットを与え、ｍはｎより小さい、請求項１１記載の方法。
【請求項１６】
前記テーブルの利用可能なインデックスは順次に偶数および奇数のインデックスを含み、また前記インデクシングするステップ中は、前記ノードは前記偶数インデックスまたは奇数インデックスの選択された１つにだけ記憶する、請求項１１記載の方法。
【請求項１７】
前記インデクシングするステップはカウントおよびインデックスの対のアレイからノードのフリー・リストを生成することを更に含む、請求項１６記載の方法。
【請求項１８】
メモリ空間と、前記メモリ空間内のデータを効率的に配列し検索するための第１の手段とを含む装置。
【請求項１９】
前記第１の手段は正方向ポインタのアレイを有するノードのスキップ・リストを含み、前記スキップ・リスト内の各ノードは前記ノードに関連するアレイからの正方向ポインタの数に関係するノード・レベルを有し、また各ノード・レベルは前記ノードを前記メモリ空間内のテーブル内に記憶するためのインデックスから導かれる、請求項１８記載の装置。
【請求項２０】
前記メモリ空間はデータ記憶アレイ・コントローラのキャッシュ・メモリを含む、請求項１９記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は一般にデータ構造の分野に関するもので、より詳しく述べると、ディジタル・コンピュータ・メモリ環境内でアドレス関連テーブル構造を持つノードのスキップ・リストを与える装置および方法に関するものであるが、これに限定されるものではない。
【背景技術】
【０００２】
スキップ・リストは、データ記憶装置内のアレイ・コントローラのキャッシュ・メモリなどの、メモリ空間内でデータを配列するための有用なタイプのデータ構造である。スキップ・リストは連結リストの一形式であって、リスト内の各項目（すなわちノード）はランダムな数の特別のあるいは追加の正方向ポインタ（ｅｘｔｒａ  ｆｏｒｗａｒｄ  ｐｏｉｎｔｅｒｓ）を有する。かかるリストの検索（ｓｅａｒｃｈｉｎｇ）は２進ツリーの検索の実行に似ているが、維持（ｍａｉｎｔｅｎａｎｃｅ）の点で２進ツリーに比べてコストが大幅に低い。
【０００３】
一般に、スキップ・リストは各ノード内のキー・フィールドの比較により決まる順序に維持される。この比較は随意に選択され、昇順または降順、数字または英数字、などでよい。新たなノードをリスト内に挿入するとき、一般に或る手順を用いて正方向ポインタの数を実質的にランダムにそのノードに割り当てる。各ノードに関連する特別のあるいは追加の正方向ポインタの数をノード・レベルと呼ぶ。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
スキップ・リストは多くのデータ構造管理アプリケーションで動作できることがわかっているが、メモリの使用および検索の効率を高める改善のニーズが引き続き存在する。本発明は一般にかかる改善に関するものである。
【課題を解決するための手段】
【０００５】
本発明の好ましい実施の形態は一般に、データ記憶アレイ・コントローラのキャッシュ・メモリなどの、メモリ空間内でデータを効率的に配列し検索するための装置および方法に関する。
或る実施の形態では、データ構造はメモリ空間内に常駐し、正方向ポインタのアレイを有するノードのスキップ・リストを含む。スキップ・リスト内の各ノードは、前記ノードに関連するアレイからの正方向ポインタの数に関連するノード・レベル（ａ  ｎｏｄｅ  ｌｅｖｅｌ  ｉｎ  ｒｅｌａｔｉｏｎ  ｔｏ  ａ  ｎｕｍｂｅｒ  ｏｆ  ｆｏｒｗａｒｄ  ｐｏｉｎｔｅｒｓ）を有する。各ノード・レベルはメモリ空間内のテーブル内に記憶されたノードのインデックス（ｉｎｄｅｘ：索引）から導かれる。
【０００６】
好ましくは、最高のノード・レベルのノード（ｎｏｄｅｓ）がテーブルの利用可能なインデックス（ｉｎｄｉｃｅｓ）の最低の集合でグループ化されるように、ノードはノード・レベルによりテーブル内に配列される。各ノードのノード・レベルは、好ましくは関連するインデックス内の先行ゼロの数に関連して決定される。更に好ましくは、スキップ・リストのノードの利用可能な総数は、インデックスのビット数で表すことができる最大の２の累乗の半分より小さくなるように選択する（例えば、１６ビットのインデックスでは２14ノードを用い、３２ビットのインデックスでは２30ノードを用いる）。
【０００７】
好ましくは、比較的低いノード・レベルのノードはｍビットのフォーマット（８バイトなど）で構成し、比較的高いノード・レベルのノードはｎビットのフォーマット（１６バイトなど）で構成する。ただし、ｍはｎより小さい。
テーブルの利用可能なインデックスは好ましくは順次に偶数および奇数のインデックス（ｓｅｑｕｅｎｔｉａｌｌｙ  ｅｖｅｎ  ａｎｄ  ｏｄｄ  ｉｎｄｉｃｅｓ）を含み、ノードは前記偶数インデックスまたは奇数インデックスの選択された１つにだけ記憶する。この場合、ノードのフリー・リストは好ましくはカウントおよびインデックスの対のアレイからのテーブルから生成する。
【０００８】
更に、このテーブルは好ましくは第１の1次テーブルとして特徴づけてよく、データ構造は更に、好ましくは第１の1次テーブル内の比較的高いノード・レベルのノードの分布が減少したときに追加のノードを記憶するための第２の1次テーブルを備える。1次ノードにより記憶される第１のタイプの情報に関連する第２のタイプの情報を記憶するための２次テーブルも備えてよい。この構造は更に、好ましくはノードのエレベータ検索（ｅｌｅｖａｔｏｒ  ｓｅａｒｃｈ）を容易にするためのアップ・キューおよびダウン・キューを含む。
【０００９】
別の実施の形態の方法は、好ましくは正方向ポインタのアレイを有するノードのスキップ・リストを生成することを含み、スキップ・リスト内の各ノードは前記ノードに関連するアレイからの正方向ポインタの数に関係するノード・レベルを含む。ノードは、最高のノード・レベルのノードがテーブルの利用可能なインデックスの最低の集合でグループ化されるように、メモリ空間内のテーブル内にノード・レベルによりインデクシングされる（ｉｎｄｅｘｅｄ）。
好ましくは、インデクシング・ステップ（ｉｎｄｅｘｉｎｇ  ｓｔｅｐ：インデクシングするステップ）は、テーブル内の前記ノードのアドレスに関連するインデックス値内の先行ゼロの数に関係して各ノードのノード・レベルを導くことを含む。インデックス値は好ましくは２の累乗（例えば、１６ビット、３２ビットなど）で構成する。
【００１０】
前と同様に、生成するステップのスキップ・リストのノードの総数は、好ましくはインデクシング・ステップのテーブルをアドレス指定するのに用いられるインデックスフィールドのビット数で表すことができる最大の２の累乗の半分より小さくなるように選択する（例えば、１６ビットのインデックスでは２14ノードを用い、３２ビットのインデックスでは２30ノードを用いる）。
【００１１】
生成するステップは更に、好ましくは比較的低いノード・レベルのノードにｍビットのフォーマットを与え、比較的高いノード・レベルのノードにｎビット・フォーマットを与えることを含む。ただし、ｍはｎより小さい。テーブルの利用可能なインデックスは好ましくは順次に偶数および奇数のインデックスを含み（ｓｅｑｕｅｎｔｉａｌｌｙ  ｅｖｅｎ  ａｎｄ  ｏｄｄ  ｉｎｄｉｃｅｓ）、インデクシング・ステップ中は、ノードは好ましくはフリー・ノード生成ルーチンを用いて前記偶数インデックスまたは奇数インデックスの選択された１つにだけ記憶する。
本発明を特徴づけるかかる機能および利点は、以下の詳細な説明を読みまた関連する図面を参照すれば明らかになる。
【実施例】
【００１２】
本発明の好ましい実施の形態を実施する例示的な環境を与えるために、大容量記憶装置を用いる広域ネットワーク（ＷＡＮ）として特徴づけられるコンピュータ・ベースのシステム１００を図１に示す。
システム１００は、それぞれホストＡ，Ｂ，Ｃで示す多数のホスト・コンピュータ１０２を含む。ホスト・コンピュータ１０２は相互に、またファブリック（ｆａｂｒｉｃ）１０６を介して一対（ＡおよびＢ）のデータ記憶アレイ１０４と、相互作用する。ファブリック１０６は好ましくはファイバ・チャンネル・ベースのスイッチング・ネットワークとして特徴づけられる。ただし、インターネットを含む他の構成を用いてもよい。
【００１３】
各アレイ１０４は一対のコントローラ１０８（Ａ１，Ａ２およびＢ１，Ｂ２で示す）と、好ましくはＲＡＩＤとして動作するディスク・ドライブとして特徴づけられる一組のデータ記憶装置１１０とを含む。コントローラ１０８およびデータ記憶装置１１０は好ましくは故障許容構成（ｆａｕｌｔ  ｔｏｌｅｒａｎｔ  ａｒｒａｎｇｅｍｅｎｔ）を用いるので、種々のコントローラ１０８は並列の、冗長な連結を用い、システム１００により記憶されユーザ・データの少なくともいくつかはデータ記憶装置１１０の少なくとも一組内に冗長なフォーマットで記憶される。ホスト・コンピュータ１０２は、それぞれのアレイ１０４に物理的に隣接してまたは離れて設けてよい。
【００１４】
図２は選択された１つのコントローラ１０８の詳細を示す。コントローラ１０８は単一の集積回路内に、または必要に応じて多数のディスクリート回路の間に分散して、実現してよい。
好ましくは１つ以上のプログラム可能なコンピュータ処理ユニット（ＣＰＵ）で構成するプロセッサ・ブロック１１２は、好ましくは不揮発性メモリ１１４(フラッシュ・メモリなど)およびダイナミック・ランダム・アクセス・メモリ（ＤＲＡＭ）１１６内に記憶されているプログラミング・ステップおよび処理データに従って制御を行う。好ましくは、プロセッサ・ブロック１１２は後で説明するインテリジェントな記憶およびキャッシュ管理の機能を行う。
【００１５】
ファブリック・インターフェース（Ｉ／Ｆ）回路１１８はファブリック１０６を介して他のコントローラ１０８およびホスト・コンピュータ１０２との通信を容易にし、また装置Ｉ／Ｆ回路（ｄｅｖｉｃｅ  Ｉ／Ｆ  ｃｉｒｃｕｉｔ）１２０は記憶装置１１０との通信を容易にする。Ｉ／Ｆ回路１１８，１２０および経路コントローラ（ｐａｔｈ  ｃｏｎｔｒｏｌｌｅｒ）１２２は、キャッシュ・メモリ１２４を用いるなどして、記憶アレイ１０４とホスト１０２との間にコマンドおよびデータを通す通信路を形成する。
動作中、キャッシュ・メモリ１２４はホスト１０２と記憶装置１１０との間のＩ／Ｏ転送に関連するユーザ・データおよびその他の情報を記憶する。装置１１０から検索された読取りデータ（投機的なデータ（ｓｐｅｃｕｌａｔｉｖｅ  ｄａｔａ）を含む）は後で「キャッシュ・ヒット」することを予想してキャッシュ・メモリ１２４内に一時的に保持されるので、後でデータが要求されたときには装置１１０とのアクセス動作を計画する必要がなく、データはキャッシュから直接転送される。
【００１６】
同様に、ライト・バック・キャッシュ方式（ｗｒｉｔｅ−ｂａｃｋ  ｃａｃｈｅ  ｐｏｌｉｃｙ）を用いて、装置１１０に書き込むべきデータをキャッシュに入れ、開始したホスト１０２に書込み完了コマンドを送り返し、該当する装置１１０に実際にデータを書き込むよう後で計画することができる。
このように、一般にプロセッサ・ブロック１１２は、各項目の状態を追跡するなど、キャッシュの内容を正確に制御することが望ましい。かかる制御は、好ましくは本発明の好ましい実施の形態に係るアドレス関係テーブル構造を用いるスキップ・リスト配列により行う。スキップ・リストは好ましくはキャッシュ・メモリ１２４の一部内に保持するが、必要に応じて他のメモリ空間を用いてもよい。
【００１７】
スキップ・リストの一般化された構造を図３の２００で示す。これは図に示すようにインデックス・テーブル２０２、リスト・ヘッド２０４、ノード２０６の母集団（ｐｏｐｕｌａｔｉｏｎ  ｏｆ  ｎｏｄｅｓ  ２０６）（最初の３つを一般にＡ，Ｂ，Ｃで示す）、ヌル・ポインタ・ブロック２０８を含む。０からＮまでの正方向ポインタ（ｆｏｒｗａｒｄ  ｐｏｉｎｔｅｒｓ：ＦＰ）を一般にライン２１０で表す。
各ノード２０６は、好ましくはキャッシュ・メモリ１２４内の或る量のデータ（ａ  ｑｕａｎｔｕｍ  ｏｆ  ｄａｔａ）および／または情報（メタデータなど）に関連する。各ノード２０６は、論理ブロック・アドレス（ＬＢＡ）値などの個別のキーを有する。各ノード２０６に関連する正方向ポインタ２１０の数は、リスト２００内に挿入するときに実質的にランダムに割り当てる。ノード毎の追加（ｅｘｔｒａ）の正方向ポインタの数をそのノードのノード・レベルと呼ぶ。
好ましくは、正方向ポインタ２１０の数はリストのサイズに関係して選択する。表１は多数の種々のノード・レベルのそれぞれにおけるノードの代表的な分布を示す。ここで、Ｎノードの中の１つはｘ以上のレベルを有する。
【００１８】
【表１】
2007004801.tif 000003
【００１９】
ＬＺ（先行ゼロ）欄の値は一般に、関連するレベルの各ノードをアドレス指定することのできるインデックス値のビット数に対応する（例えば、２ビットはレベル１の４ノードをアドレス指定し、４ビットはレベル２の１６ビットをアドレス指定する、など）。
表１は３０ビットのインデックスを用いて１，０７３，７４１，８２４（０ｘ４０００００００）の可能なノードという最大のプールを与える。このサイズのプールは、例えば米国内で発行される「社会保障番号」（ＳＳＮ）を全てカバーするのに十分である。
【００２０】
好ましい実施の形態では、各ノードのノード・アドレスは好ましくはインデックス値から導かれる。関連するノード・レベルも好ましくはインデックス値から導かれる。ここで、レベルを決定するのにインデックス内の先行ゼロの数を用いる。これについて以下に詳細に説明する。
表１から分かるように、一般に、４ノードの中の１つは「０」より大きなレベルを有する。すなわち、ノードの全母集団の２５％は１つ以上の追加の正方向ポインタを有する。逆に、４ノードの中の３つ（７５％）は一般に「０」のレベル（追加の正方向ポインタがない）を有する。同様に１６ノードの中の３つは一般に「１」のレベルを有し、６４ノードの中の３つは「２」のレベルを有する。以下同様である。
【００２１】
このリストが非常に大きくまたポインタの最大数が限られている（ｂｏｕｎｄｅｄ）場合は、リストを検索するのに一般に最大レベルで平均約ｎ/２回の比較を必要とする。ただし、ｎはそのレベルのノードの数である。例えば、ノードの数が１６，３８４に限られかつ最大レベルが５の場合は、平均してレベル５に１６ノードある（１０２４の中の１つ）。したがって、各検索はレベル４での比較に来る前に一般に平均して８回の比較を必要とし、レベル４から０までは平均して２回の比較である。
【００２２】
スキップ・リスト２００の検索では一般に、サポートされた最大レベルまでの正方向ポインタ２１０を識別するリスト・ヘッド２０４を用いる。ヌル・ポインタ２０８として特殊の値を用いてよい。これはリストの終わりより先を指すものと解釈される。インデックスからレベルを導くことは、ヌル・ポインタ値が「０」のときにリストがやや不均衡になる（ｉｍｂａｌａｎｃｅｄ）ことを意味する。これは、「０」というインデックスはさもなければ最大レベルにおける特定のノードを参照するからである（ａｎ  ｉｎｄｅｘ  ｏｆ  “０”  ｗｏｕｌｄ  ｏｔｈｅｒｗｉｓｅ  ｒｅｆｅｒｅｎｃｅ  ａ  ｐａｒｔｉｃｕｌａｒ  ｎｏｄｅ  ａｔ  ｔｈｅ  ｍａｘｉｍｕｍ  ｌｅｖｅｌ）。
【００２３】
しかしノードの総数は、好ましくはインデックス・フィールド内のビットの数で表すことのできる最大の２の累乗の半分より小さくなるように選ばれるとみなすことができる。これにより、最高のビット集合を持つ任意の値でヌル・ポインタを表すことができる。例えば、１６ビットを用いてインデックスおよび最大３２，７６８ノード（インデックス範囲は０ｘ００００−０ｘ７ＦＦＦ）を記憶すると、０ｘ８０００と０ｘＦＦＦＦの間の任意の値をヌル・ポインタとして用いることができる。
【００２４】
ノード・レベルをノード・アドレスから得ることの利点は、好ましくはメモリの異なるセクション内の所定のノード・レベルの各ノードをグループ化して密に束ねる（ｄｅｎｓｌｙ  ｐａｃｋｉｎｇ）ことにより、利用可能なメモリを効率的に用いることができることである。図３に示すように、インデックステーブル２０２は一般に、テーブル内の最大レベルのノードが最小のインデックス（ｉｎｄｉｃｅｓ）を有し、続いて次のレベルが下にくる（ｆｏｌｌｏｗｅｄ  ｂｙ  ｔｈｅ  ｎｅｘｔ  ｌｅｖｅｌ  ｄｏｗｎ）というようにノードを配列する。
キャッシュ・ライン（ｃａｃｈｅ  ｌｉｎｅｓ）に基づいてデータ・キャッシングを用いるＣＰＵ(例えば、ブロック１１２)では、より高いレベルのノードが一般にキャッシュ内に残る傾向がある。また、検索は一般に低いレベルでメモリ参照をトリガする。
【００２５】
ノードの数が１６，３８４で、各「１次」ノードが、４バイトのキー情報および６つの２バイトの正方向ポインタインデックス（ＦＰＩ）から成る１６バイトを占める例を考える。表１から、一般に１０２４ノード（１６の中の１つ）だけが「１」より大きなレベルを有する。かかるノードは好ましくはテーブル２０２内の１６ＫＢという密な領域内に置かれる。３２ＫＢのデータ・キャッシュを持つシステムでは、「１」より大きなレベルを持つノードを保持するのにキャッシュの半分が用いられた場合は、レベル「１」まで検索して下るときにはメモリを参照する必要がない。その後で、レベル「１」で２回とレベル「０」で２回の参照を行う。もちろんこれは理想的な場合であるが、これから認識されるように、参照の頻度のために、より高いレベルが一般にキャッシュ内に残る傾向がある。
【００２６】
データ・キャッシングを用いる検索では、テーブル構造を最適化することによりメモリ参照の平均回数を最小にすることが望ましい。しかし、図３の構造は、キャッシングが動作の一部として明示的に用いられる媒体（例えば、図１の記憶装置１１０）を検索するのにも用いてよいことに注意していただきたい。すなわち、媒体から読み取られたデータはキャッシュに入れてよく、またキーおよびポインタを密に記憶し、大量のノード（または「記録」）データは「２次」テーブル内に記憶するように媒体上のデータを構造化してよい。これらの実施の形態のそれぞれの例を以下に示す。
【００２７】
シーク・キューの例
ここに示すスキップ・リスト構造の第１の例示的な実施の形態について、図２のコントローラ１０８のシーク・キュー（ｓｅｅｋ  ｑｕｅｕｅ）管理に関して以下に説明する。
この例では、シーク・キュー(ノード)の全集合にわたるホスト要求の最大数は１６，３８４（２14）とする。ノードの追加および削除がメモリ参照に関して効率的であることが望ましい。なぜなら、この動作はそれぞれのホスト要求を扱うクリティカル・パスにあるからである。また時には、或るキューはほとんど空であるが他のキューは何千もの要求が並んでいるとする。また、スキップ・リストの検索および記憶に用いられるメモリを最小にすることが望ましい。
【００２８】
したがって、各１次ノードは、検索に用いられるキー値と、ノードに関連する正方向ポインタの識別とを少なくとも含むよう形成される。例示的な最小の１次ノード・フォーマットを表２に示す。
【００２９】
【表２】
2007004801.tif 000004
【００３０】
このフォーマットは８バイトのノード長を形成し、ノード・レベルが「０」または「１」のときに用いてよい。これはサイズが２の累乗であることに注意していただきたい。レベル「０」から「５」について別の提案されたノード・フォーマットを表３に示す。
【００３１】
【表３】
2007004801.tif 000005
【００３２】
このフォーマットは更に長い１６バイトのノード長を形成する。検索動作は一般にどのサイズのノードに関するかを考慮する必要はない。なぜなら、比較を行う現在のレベルに基づいてポインタを参照するからである。１次ノードのテーブル２０２は、好ましくはそのサイズに揃ったメモリのブロック（例えば、１２８ＫＢ）を含む。
表１から、１６，３８４ノードの中の１０２４（１６の中の１つ）はレベル２以上であると一般に予想される。アドレスから導かれたレベルに基づいて、これらのノードにはこれに従ってテーブル２０２内の０ｘ００００から０ｘ０３ＦＦの範囲のインデックスが割り当てられる。
【００３３】
全てのノードが同じサイズ（例えば、表３のフォーマットに従って１６バイト）の場合は、インデックスにノード・サイズを掛けて（左に４つシフトして）テーブルのベースを加算するかまたはＯＲを用いる（テーブルが揃っている場合）ことにより、ノード・アドレスはインデックスから導くことができる。しかし、レベルが「０」または「１」のときに小さいノード・フォーマットの表２を用いる場合はかなりの量のメモリを節約することができる（例えば、１６，３８４＊８＊１５／１６＝１２２，８８０バイト）。これにより、或る期間の検索のアマルガム（ａｍａｌｇａｍ  ｏｆ  ｓｅａｒｃｈｅｓ）を考慮すると、参照するメモリの量はほぼ半分になる。前と同様に、左シフト＋加算の操作を行って、小さなフォーマットを持つ（例えば、表２）ノードのインデックスからノード・レベルを導くことができる。
【００３４】
別の好ましい方法では、テーブル２０２内の０ｘ００００から０ｘ０３ＦＥの範囲内の偶数インデックスだけを用いる。所定の偶数インデックスに対応する奇数インデックスは所定の偶数インデックスを持つノードのすぐ先の同じサイズのノードにマップする。これにより、同じ動作（この場合は、インデックスを左に３つシフト＋加算）を用いて両サイズのノードのアドレスが導かれる。なぜなら、偶数インデックスは１６バイト・ノードのアドレスを実際に作るからである。または、必要に応じて偶数インデックスの代わりに奇数インデックスだけを選んでよいことが認識される。
【００３５】
しかしこの方法の限界は、高いレベルのノードの数が望ましい数の一般に半分しかないことである。すなわち、一般に「１」より高い各レベルでの比較の平均回数は２ではなく４である。
これは、ノードの「フリー・リスト（ｆｒｅｅ  ｌｉｓｔ）」を作ることにより対処することができる。フリー・リストを作る好ましい方法は、一般に図４のフリー・リスト生成ルーチン２２０により与えられる。ステップ２２２で、或るレベルをランダムに選択し、ステップ２２６のカウントおよびインデックスの対のアレイから、ステップ２２４で、選択されたレベルでの次の利用可能なインデックスを選択する。ステップ２２８で、識別されたノードがフリー・リストの終わりに連結され、ステップ２３０で流れは戻る。
【００３６】
ステップ２３２で、選択されたレベルが空になると、ステップ２３４でレベルを変える。例えば、次に低いレベルに下がるか、またはうまくゆかない（しかし、別のノードが利用可能である）場合は次に高いレベルに移る。ステップ２３６で、全てのインデックス値がなくなるまでこれを続けた後、プロセスは終わる（ステップ２３８）。
【００３７】
表４は上の方法のカウントおよびインデックスの対（ステップ２２６）の例示的な初期値を示す。０ｘ００００から０ｘ０３ＦＦまでの奇数インデックスと値０ｘ００００とを除いて、１６，３８４の初期母集団から全部で１５，８７１の有効なインデックス値が利用できると考えられる。
【００３８】
【表４】
2007004801.tif 000006
【００３９】
上の文脈で「選択する（“ｐｉｃｋｉｎｇ”）」とは生成されたレベルでのカウントをチェックすることを意味することに注意していただきたい。カウントが非ゼロの場合は、選択されたインデックスを取り出し、カウントは減分し、インデックスは、レベルが「０」または「１」の場合は「１」だけ減分し、レベルが「１」より大きい場合は「２」だけ減分する。したがって、図４のルーチン２２０は１５，８７１のカウントを持つ実行ループ（ｄｏ−ｌｏｏｐ）として特徴づけられる。
【００４０】
このことから、ルーチン２２０はカウントの合計に基づいて正確に１５，８７１のインデックスを生成する。カウントが「０」の場合は現在のレベルは生成されたレベル以下であり、現在のレベルが「０」でない場合はレベルは減分され、プロセスは繰り返される。カウントが「０」でかつ現在のレベルが「０」の場合はレベルは生成されたレベル＋１にセットされ、プロセスは繰り返される。カウントが「０」でかつ現在のレベルが生成されたレベルより大きい場合はレベルは増分され、プロセスは繰り返される。このようにして、使用可能である間はインデックスはループ内にある。
【００４１】
この方法を用いると、当業者が認識するように、高いレベルのノードはプロセスのほぼ半ばに空になる。割当てがリストの前の方から行われかつ割当て解除がリストの前の方で行われる場合は、これは必ずしも問題ではない。これは一般に、選択されたレベルのランダムさを保存し、また半分より多くのノードが用いられるまで望ましい分布を作る。
【００４２】
ごく稀な場合だけに、他の半分のノードが要求されるとみなしうる。この場合は性能は低下するが、一般にシステムの通常の重負荷性能の２倍を超えることはない。他方で、軽負荷は一般にシーク要求の比較的小さなキューを有する傾向がある。大きな負荷要求は必ずしも重いベンチマーク負荷を含まない。むしろ、かかる大きな負荷要求は、シーキングのためにシステムが飽和する場合に存在すると考えられる（シーク遅れに伴う量のアイドル・タイムがある）。
【００４３】
各レベルでのノードの分布が実質的に「正常」（確率分布により予測される）のときは、この状態をここで「同等重み（ｅｑｕａｌ  ｗｅｉｇｈｔ）」と呼ぶ。他方で、「低い重み（ｕｎｄｅｒｗｅｉｇｈｔ）」の状態は用いられる高いレベルのノードの数が通常より少ないときに起こる。
低い重みの状態は、図５の２４０で示すような、０ｘ００００から０ｘ０３ＦＦの範囲内の奇数インデックスを持つノードを保つように第２の１次テーブル（８ＫＢ、すなわち５１２＊１６など）を割り当てることにより補償することができる。レベルが２より大きくかつインデックスが奇数のときは、ノード・アドレスの計算に第１のベース・アドレスではなく第２のベース・アドレスを用いる。
【００４４】
各ノードのノード・レベルは、好ましくはポインタ（３２ビットの数として処理される）の先行ゼロを数え、１８を引き、２で割り、レベルを６から５にすることにより導かれる。ＰｏｗｅｒＰＣなどのいくつかの市販のプロセッサは値の中の先行ゼロを数える命令を有する（ＧＮＵコンパイラは内蔵の関数呼出しにより命令を使用可能にする）ので、この動作は簡単である。インデックス「０」を持つノードを「ヌル・ポインタ」としての使用から外すのが好ましい。なぜなら、「０」の値を検出するのはビットがセットされているかどうか調べるより一般に効率が高いからである。
【００４５】
このシーク・キューの例を続けると、多くの場合に、要求に関する状態情報やイニシエータ（例えば、ホスト１０２）に返すべき構造へのポインタなどの、キー値（ＬＢＡ）以外の追加の情報が必要であることが認識される。この情報は、図５の２４２などの２次テーブル内に配列された追加のデータの量（例えば、４バイト）内に記憶してよい。２次テーブル２４２は１次インデックス・テーブル２０２のインデックスを介して参照することができる。２次テーブル２４２内の全ての項目のサイズが均一の場合は、全テーブル・サイズはやはり２の累乗（例えば、この場合は６４ＫＢ）である。
【００４６】
再び図３を参照して、各シーク・キューは好ましくは全部で６つの正方向ポインタ２１０を持つリスト・ヘッド２０４を有する。各リストは昇順または降順に保ってよい。検索動作は好ましくは現在の順序に基づいて選択される。「のこぎり（ｓａｗ−ｔｏｏｔｈ）形」方式（「Ｃスキャン」と呼ぶことがある）を用いるときは、順序は必ず昇順でよい。
【００４７】
効率を高めるためにエレベータ方式を用いるときは、キューの最後の項目を除くときに順序を逆にしてよい。通常、検索動作はリスト内の現在位置の前と後の両方に項目を挿入しながらリスト内を移動する。しかしここで提案する逆の手順では、好ましくはレベル０ポインタを探し出してリスト・ヘッドをゼロにすることにより、リストから残りの項目を取る。次に、レベル０ポインタを介して連結リストの中を移動し、ヘッド２０４の各項目を挿入することにより、項目を連続的に挿入する。
【００４８】
この動作は簡素化することができる。なぜなら、これはノード２０６のノード・レベルを決定し、リスト・ヘッド２０４内のそのレベル以下のポインタ２１０をノード２０６にコピーし、そのレベル以下のリスト・ヘッド内のポインタを所定のノードへのポインタにセットすることになるからである。
エレベータ検索方式の逆の手順の好ましい別の方法は、図６の２５０，２５２に示すように２つのキューを用いることである。アップ・キュー２５０は「現在」位置より高い全ての要求を保持して昇順のＬＢＡに維持される。ダウン・キュー２５２は現在位置より低い全ての要求を保持して降順のＬＢＡに維持される。
【００４９】
このようにして、現在位置からの検索を増分するときはアップ・キュー２５０を用い、現在位置からの検索を減分するときはダウン・キュー２５２を用いる。現在位置はキュー２５０，２５２の使用中の方の第１の項目を参照する。どちらかのキューで終点に達すると、検索は残りのキューに切替わり、要素を順に取りだす。
【００５０】
要約すると、ここに説明したシーク・キューの例示的な実施の形態は、好ましくはアドレス関係テーブル構造（例えば、テーブル２０２，２４０）を持つスキップ・リスト２００を用いる。ノード・レベルはアドレスから導かれ、また好ましくは図４に示すようなフリー・リストから導かれるレベル分布が得られる。２次テーブル２４２は、好ましくは１次ノードに関連する関係（２次）データを連結するのに用いられる。更に、逆の手順を持つエレベータ方式を用いるか、またはアップ・キュー２５０およびダウン・キュー２５２を用いるシーク方式が好ましくは用いられる。
【００５１】
メディア・スキップ・リストの例
アドレス関係テーブル構造を持つスキップ・リストの第２の例示的な実施の形態について、メディア（データ記憶装置１１０）上に保持される比較的大きなデータベースを参照して以下に説明する。この実施の形態では、データベース内の種々のレコードの検索オーバーヘッドを最小にするためにスキップ・リスト２００が一般に用いられる。
かかるデータベース内でのレコードの割当ておよび割当て解除に関係する問題は、以下の説明では大部分省略する。ただし、上に説明した方式（例１）を調整して、大きな割当て解除作業を必要としないデータベースの最小メタデータ（すなわち、単なるテーブル）を用いてノードを直接割り当てるように容易にすることができることに注意していただきたい。
【００５２】
前に述べたように、表１は、例えば米国連邦政府が発行した社会保障番号（ＳＳＮ）全部を処理するのに十分な、１０億ノードを超える母集団をサポートする最大のインデックスを与える。今回の例では、データベースは拡張されて最大約４０億ＳＳＮをサポートする。これは３２ビットのインデックス値（すなわち、２32＝４，２９４，９６７，２９６）を用いることにより容易になる。一般に、２の累乗の値は処理が容易であることが分かっている。したがって、装置１１０内に記憶されるデータベースは、この説明では約２30（１，０７３，７４１，８２４）レコードを含むと考える。
【００５３】
この例のメディア上の各レコードは２キロバイト（ＫＢ）を含むと考える。したがって全データベースは装置１１０の中に約２テラバイト（ＴＢ）のディスク空間を必要とする。
この説明を助けるベンチマークとして、アクセス方法はレコード毎に４バイトのポインタの従来のフラット・マップ構造（ｆｌａｔ  ｍａｐ  ａｒｃｈｉｔｅｃｔｕｒｅ）を用いてよい。これは一般に、装置１１０上に４ギガバイト（ＧＢ）のディスク空間と、レコード毎にデータを見つけてアクセスするための２つのディスク・アクセスＩ／Ｏ動作（１つのＩ／Ｏは関連するレコード自体のデータを検索することである）とを必要とする。
【００５４】
しかし、別の方法として図３−６に係るキャッシュに入れたスキップ・リストを設けて、装置１１０内のそれぞれのレコードに対応するローカル・メモリ内でノードの母集団を生成することが望ましい。前のように、各ノード・アドレスによりアクセスを行うことができる。
ここで、この例で２30（１，０７３，７４１，８２４）の可能な全レコードをサポートするために３２ビットのインデックスが選択されたのと同様に、割当て可能なノードの総数より大きくなるようにインデックス値が選択される場合は、特別の処理が必要であることに注意していただきたい。ここで起こる１つの問題は、ノード・レベルを決定するのにインデックス内の先行ゼロの「正しい」数をどのようにして識別するかである。
この例では、同等重み分布は１５番目のレベル（０−１４を用いるレベル１４）の中に０，１，２，３のインデックスを持つ正確に４つのノードを与える。表５はこれらのインデックス値の関連する３２ビット表現を示す。
【００５５】
【表５】
2007004801.tif 000007
【００５６】
表５から分かるように、先行ゼロ（ＬＺ）の数は一般にＬＺを定義するのに用いられる規則（ｃｏｎｖｅｎｔｉｏｎ）に依存する。インデックス値２および３の３２ビット表現は明らかにそれぞれ３０個の先行ゼロを有する。しかしインデックス値１の３２ビット表現は技術的に３１個の先行ゼロを有し、インデックス値０の３２ビット表現は、ＬＳＢ（ビット０）をカウントするかどうかに従って先行ゼロは３１個または３２個である。これらの項目に用いられる２ＬＳＢ（ビット０−１）をカウントしなければ、全ての項目の先行ゼロは３０個だけと見なすこともできる。
【００５７】
混乱を少なくするため、ＬＳＢ０ビット値をカウントしないで（「０」インデックス値が用いられる場合）、好ましくはインデックス値内の実際の先行ゼロの数を識別して先行ゼロの数を決定するのが好ましいことが理解される。レベル１４では、これによりインデックス０および１ではＬＺ値は３１になり、インデックス２および３ではＬＺ値は３０になる。
次にノード・レベルは、好ましくはこのＬＺ値から、（ＬＺ−２）／２の関係に従い、必要に応じて端数を全て切り捨てて（整数除算）決定される。レベル１４では、ＬＺ値が３１および３０のとき１４という値になる（（３１−２）／２＝１４．５→１４、および（３０−２）／２＝１４）。
【００５８】
これは残りの全てのレベルに同様に適用される。例えば、全てのレベル０ノードはそれぞれのインデックス内に２つまたは３つの先行ゼロを有する。上の式を適用すると（（２−２）／２＝０、および（３−２）／２＝１／２→０）、０に関連するノード・レベルを直ぐ識別することができる。
この例を続けると、「基本」ノードは、全部で１６バイトについて、３２ビットのキーと３レベル（０−２）の３２ビットのポインタとを用いる。１次の基本ノードはメディア上に３１．５ミリオン（Ｍ）セクタ（１５．７５ＧＢ）を占める。６４ノードの中の１つが２より大きなレベルを有するので、これらの値は表１から得ることができる。１ビリオン（Ｇ）の１６バイト・ノード（Ｋ＊Ｍ）では、正確に３２Ｍ（１６＊Ｋ＊Ｍ／５１２）セクタを必要とする。しかし、レベル２より上には基本ノードでない１６Ｍノードがある。したがって、３２Ｍは１６Ｍ＊１６／５１２、すなわち５１２Ｋだけ減少する。
【００５９】
いわゆる「中間」ノードは基本ノードの２倍のサイズ（すなわち、３２バイト）で４つの追加のポインタを有するように選択される。いわゆる「トップ」ノードは中間ノードの２倍のサイズ（すなわち、６４バイト）であり、全部で１５レベル（０−１４）について１２の追加のポインタを処理する。
１６，３８４ノードの中の１つ（例えば、６５，５３６、すなわち２16ノード）は６４バイトのトップ・ノードであることに注意していただきたい。トップ・ノードは４ＭＢ（８Ｋセクタ）を占める。更に全部で１６，７１１，６８０（２24マイナス２16）の中間ノードがあり、これは約５００ＭＢのセクタを占める。重要であるが、この方式ではセクタ境界を横切るノードはない。
【００６０】
高いレベルのノードに専用の、プロセッサ・ブロック１１２が利用可能なメモリは１２８ＭＢよりわずかに多いだけとみなすことができる。中間ノードの３／４は一般にレベル３である。したがって、レベル４からレベル６のノードは全て５１２ＭＢの１／４（１２８ＭＢ）内に納めることができる。レベル７からレベル１４のノードは全て４ＭＢ内に納めることができる。一般に、これらのノードのそれぞれのグループは割り当てられたメモリ内で密に束ねられる（ｐａｃｋｅｄ  ｄｅｎｓｌｙ）（また、関連するレコードは同様に装置１１０内で密に束ねられる）ことが分かる。
【００６１】
この時点で、レベル４から１４を持つ全てのノードはメモリ内のキャッシュに入れられる。前に説明したように、同等重み分布であれば、各検索はレベル当たり２回の追加の参照を必要とする。最高のレベルのノード（例えば、レベル１１−１４）は１６Ｋ内に納まり、例えば、プロセッサ・データ・キャッシュ内に置かれる。２５６ＫのＬ２キャッシュを用いる場合、レベル９および１０はＬ２プロセッサ・キャッシュ内に置かれる。
【００６２】
レベル４から８では、平均して１６回のメモリ参照が一般に必要である。しかし１ＧＢのデータ・キャッシュでは、全てのレベル３のノードは不揮発性のライト・バック（ＮＶ  ＷＢ）キャッシュ内に置いてよい。この場合、最近参照した「１次」ノード（挿入のため）および最近参照した２次データにアクセスするためにキャッシュの半分以上が保持される。
【００６３】
したがって、この実施の形態ではＩ／Ｏディスク転送はレベル０から２だけに必要であり、残りのレベルは局所的に検索してよい。装置１１０の各グループがドライブ当たり２５０ＩＯＰＳの能力を有する４０ディスク・ドライブのアレイを表す場合は、このシステムは、従来の妥当な価格の装置を用いて、毎秒１４２５人の異なる人のためのレコードを探して返すことができる。またこのシステムは、それぞれのノード検索の後で、検索されたレコードを処理しまた追加の機能も実行するのに十分なプロセッサ時間の余裕を有する。
【００６４】
ここで認識されるように、本発明の好ましい実施の形態は一般に、データ記憶アレイ・コントローラ（１０８など）のキャッシュ・メモリ（１２４など）などの、メモリ空間内でデータを効率的に配列し検索するための装置および方法に関する。
或る実施の形態では、データ構造（２００など）はメモリ空間（１１４，１１６，１２４など）内に常駐し、正方向ポインタ（２１０など）のアレイを有するノード（２０６など）のスキップ・リストを含み、スキップ・リスト内の各ノードは前記ノードに関連するアレイからの多数の正方向ポインタに関係するノード・レベルを有し、また各ノード・レベルはそのノードをメモリ空間内のテーブル（２０２など）内に記憶するためのインデックスから導かれる。
【００６５】
好ましくは、最高のノード・レベルのノードがテーブルの利用可能なインデックスの最低の集合でグループ化されるように、ノードはノード・レベルによりテーブル内に配列される。各ノードのノード・レベルは、好ましくは関連するインデックス内の先行ゼロの数に関係して決定される。更に好ましくは、スキップ・リストのノードの利用可能な総数はインデックスのビット数で表すことができる最大の２の累乗の半分より小さくなるように選択する（例えば、１６ビットのインデックスでは２14ノードを用い、３２ビットのインデックスでは２30ノードを用いる）。
【００６６】
好ましくは、比較的低いノード・レベルのノードはｍビットのフォーマット（表２における８バイトなど）で構成し、比較的高いノード・レベルのノードはｎビットのフォーマット（表３における１６バイトなど）で構成する。ただしｍはｎより小さい。
テーブルの利用可能なインデックスは好ましくは順次に偶数および奇数のインデックスを含み、ノードは前記偶数インデックスまたは奇数インデックスの選択された１つ（表４内など）にだけ記憶する。この場合、ノードのフリー・リスト（例えば、２００による）は好ましくはカウントおよびインデックスの対（例えば、２０６による）のアレイから生成されたテーブルから生成する。
【００６７】
更に、このテーブルは好ましくは第１の１次テーブルとして特徴づけてよく、データ構造は更に、好ましくは第１の１次テーブル内の比較的高いノード・レベルのノードの分布が減少したときに追加のノード（ａｄｄｉｔｉｏｎａｌ  ｎｏｄｅｓ）を記憶するための第２の１次テーブル（２４０など）を備える。１次ノードにより記憶される第１のタイプの情報に関連する第２のタイプの情報を記憶するための２次テーブル（２４２など）も備えてよい。この構造は更に、好ましくはノードのエレベータ検索を容易にするためのアップ・キュー（２５０など）およびダウン・キュー（２５２など）を含む。
【００６８】
別の実施の形態の方法は、好ましくは正方向ポインタ（２１０など）のアレイを有するノード（２０６など）のスキップ・リスト（２００など）を生成するステップを含み、スキップ・リスト内の各ノードは前記ノードに関連するアレイからの正方向ポインタの数に関係するノード・レベルを含み、また、最高のノード・レベルのノードがテーブルの利用可能なインデックスの最低の集合でグループ化されるように、メモリ空間（１１４，１１６，１２４など）内のテーブル（２０２など）内のノード（例えば、表１による）にノード・レベルによりインデクシングする。
【００６９】
好ましくは、インデクシング・ステップは、テーブル内の前記ノードのアドレスに関連するインデックス値内の先行ゼロの数に関係して各ノードのノード・レベルを導くことを含む。インデックス値は好ましくは２の累乗（例えば、１６ビット、３２ビットなど）で構成する。
前と同様に、生成するステップのスキップ・リストのノードの総数は、好ましくはインデクシング・ステップのテーブルをアドレス指定するのに用いられる多数のビットのインデックス・フィールドで表すことができる最大の２の累乗の半分より小さくなるように選択する（例えば、１６ビットのインデックスでは２14ノードを用い、３２ビットのインデックスでは２30ノードを用いる）。
【００７０】
生成するステップは更に、好ましくは比較的低いノード・レベルのノードにｍビットのフォーマットを与え（例えば、表２）、比較的高いノード・レベルのノードにｎビットのフォーマットを与える（例えば、表３）ことを含む。ただし、ｍはｎより小さい。テーブルの利用可能なインデックスは好ましくは順次に偶数および奇数のインデックスを含み、インデクシング・ステップ中は、ノードは好ましくはフリー・ノード生成ルーチン（２００など）を用いて前記偶数インデックスまたは奇数インデックスの選択された１つにだけ記憶する。
【００７１】
クレームの目的では、前記メモリ空間内でデータを効率的に配列し検索する前記第１の手段は図３−６に示した構造に対応するものと理解される。従来の技術に従ってフォーマットされたスキップ・リストやその他のデータ配列および検索構造（ツリー検索およびフラット・マップなど）は前記第１の手段から除外され、これを構成しない。
【００７２】
理解されるように、これまでの説明において本発明の種々の実施の形態の多くの特徴および利点を、本発明の種々の実施の形態の構造および機能の詳細と共に示したが、この詳細な説明は単なる例示であって、細部について、特にクレームを記述する用語の広い一般的な意味により全面的に示される本発明の原理内の各部の構造および配列に関して、変更を行ってよい。
【図面の簡単な説明】
【００７３】
【図１】大容量記憶装置を用いる広域ネットワークとして特徴づけられるコンピュータ・ベースのシステムの機能的ブロック表現である。
【図２】図１のアレイ・コントローラの選択された１つの機能的ブロック表現である。
【図３】本発明の好ましい実施の形態に係るアドレス関係テーブル構造を持つスキップ・リストを一般的に示す。
【図４】本発明の好ましい実施の形態において行われるステップを一般的に示すフリー・リスト生成ルーチンの流れ図である。
【図５】図３に示すものとは異なる別のテーブル構造を与える。
【図６】好ましい実施の形態に係る検索動作中に用いられるアップ・キューおよびダウン・キューの対を表す。
【符号の説明】
【００７４】
１０８  データ記憶アレイ・コントローラ
１２４  キャッシュ・メモリ
２００  データ構造
２０２  メモリ空間内のテーブル
２０６  ノード
２１０  正方向ポインタ
【図１】
2007004801.tif 000008
【図２】
2007004801.tif 000009
【図３】
2007004801.tif 000010
【図４】
2007004801.tif 000011
【図５】
2007004801.tif 000012
【図６】
2007004801.tif 000013