JPH09204357A - マルチスレッド環境を有する計算システム用の最大並行参照キャッシュ - Google Patents
マルチスレッド環境を有する計算システム用の最大並行参照キャッシュInfo
- Publication number
- JPH09204357A JPH09204357A JP8289018A JP28901896A JPH09204357A JP H09204357 A JPH09204357 A JP H09204357A JP 8289018 A JP8289018 A JP 8289018A JP 28901896 A JP28901896 A JP 28901896A JP H09204357 A JPH09204357 A JP H09204357A
- Authority
- JP
- Japan
- Prior art keywords
- entry
- cache
- key
- item
- entry number
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/0842—Multiuser, multiprocessor or multiprocessing cache systems for multiprocessing or multitasking
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
(57)【要約】
【課題】 マルチスレッド環境を有する処理システムの
共用キャッシュへの挿入動作または削除動作時に参照動
作を行えるようにする。 【解決手段】 マルチスレッド処理システムは、各スレ
ッドから共通にアクセスできるキャッシュを有する。こ
のキャッシュは、それぞれ、エントリ番号によって識別
される、項目を記憶する複数のエントリを有する。第1
のキーを含む項目の、キャッシュ中の位置は、この第1
のキーをロックレス参照エンジンに供給することによっ
て判定される。ロックレス参照エンジンは次いで、参照
出力、すなわち参照エントリ番号と、その項目がキャッ
シュに記憶されていないことを示すものとのどちらかを
提供する。参照エントリ番号は、第1のエントリ番号と
第2のエントリ番号のどちらかであり、この場合、第1
のエントリ番号は、その項目が記憶されている第1のエ
ントリを指し示し、第2のエントリ番号は、その項目が
記憶されていない第2のエントリを指す。
共用キャッシュへの挿入動作または削除動作時に参照動
作を行えるようにする。 【解決手段】 マルチスレッド処理システムは、各スレ
ッドから共通にアクセスできるキャッシュを有する。こ
のキャッシュは、それぞれ、エントリ番号によって識別
される、項目を記憶する複数のエントリを有する。第1
のキーを含む項目の、キャッシュ中の位置は、この第1
のキーをロックレス参照エンジンに供給することによっ
て判定される。ロックレス参照エンジンは次いで、参照
出力、すなわち参照エントリ番号と、その項目がキャッ
シュに記憶されていないことを示すものとのどちらかを
提供する。参照エントリ番号は、第1のエントリ番号と
第2のエントリ番号のどちらかであり、この場合、第1
のエントリ番号は、その項目が記憶されている第1のエ
ントリを指し示し、第2のエントリ番号は、その項目が
記憶されていない第2のエントリを指す。
Description
【0001】
【発明の属する技術分野】本発明は、マルチスレッド環
境を有する処理システムにおける共用キャッシュに関
し、詳細には、キャッシュ挿入動作またはキャッシュ削
除動作時に参照動作を行えるようにする、マルチスレッ
ド環境で使用すべきキャッシュに関する。
境を有する処理システムにおける共用キャッシュに関
し、詳細には、キャッシュ挿入動作またはキャッシュ削
除動作時に参照動作を行えるようにする、マルチスレッ
ド環境で使用すべきキャッシュに関する。
【0002】
【従来の技術】「キャッシュ」の語は、本開示全体にわ
たって使用されるときは、データの集合の部分集合を保
持するコンピュータ・メモリ中の領域である。ある情報
項目がキャッシュに記憶されている場合、キャッシュ中
のその項目の探索は成功し(「キャッシュ・ヒット」と
呼ばれる)、労力はほとんど必要とされない。しかし、
キャッシュ内にない情報項目の探索(「キャッシュ・ミ
ス」と呼ばれる)は通常、データの集合からその情報項
目を検索するためのコストと時間がかかる。キャッシュ
・ヒットの数を最大にするために、近い将来に参照され
る可能性が高いデータはキャッシュに記憶される。キャ
ッシュ・ヒットを最大にする2つの一般的な方法は、最
後に参照されたデータを記憶し、最も一般的に参照され
るデータを記憶することである。
たって使用されるときは、データの集合の部分集合を保
持するコンピュータ・メモリ中の領域である。ある情報
項目がキャッシュに記憶されている場合、キャッシュ中
のその項目の探索は成功し(「キャッシュ・ヒット」と
呼ばれる)、労力はほとんど必要とされない。しかし、
キャッシュ内にない情報項目の探索(「キャッシュ・ミ
ス」と呼ばれる)は通常、データの集合からその情報項
目を検索するためのコストと時間がかかる。キャッシュ
・ヒットの数を最大にするために、近い将来に参照され
る可能性が高いデータはキャッシュに記憶される。キャ
ッシュ・ヒットを最大にする2つの一般的な方法は、最
後に参照されたデータを記憶し、最も一般的に参照され
るデータを記憶することである。
【0003】キャッシュは多くの場合、コンピュータ・
オペレーティング・システム(OS)の性能を向上させ
るために使用される。たとえば、Sun「SOLARI
STM」OS(SunおよびSolarisは、米国およ
びその他の国のサンマイクロシステムズ社(Sun M
icrosystems.Inc)の商標または登録商
標である)は、ディレクトリ名参照キャッシュを使用し
て、最後にアクセスされたファイルの名前を記憶し、フ
ァイル属性キャッシュを使用して、最後にアクセスされ
たファイルの属性を記憶し、ディスク・バッファ・キャ
ッシュを使用して、最後にアクセスされたディスク・ブ
ロックを記憶する。
オペレーティング・システム(OS)の性能を向上させ
るために使用される。たとえば、Sun「SOLARI
STM」OS(SunおよびSolarisは、米国およ
びその他の国のサンマイクロシステムズ社(Sun M
icrosystems.Inc)の商標または登録商
標である)は、ディレクトリ名参照キャッシュを使用し
て、最後にアクセスされたファイルの名前を記憶し、フ
ァイル属性キャッシュを使用して、最後にアクセスされ
たファイルの属性を記憶し、ディスク・バッファ・キャ
ッシュを使用して、最後にアクセスされたディスク・ブ
ロックを記憶する。
【0004】並行して動作するいくつかの実行スレッド
(下記の本明細書全体にわたって、「スレッド」と呼
ぶ)によってキャッシュを共用することができる。この
ような並行動作のために、各スレッドは、マルチプロセ
ッサ環境におけるいくつかのプロセッサのうちの1つの
プロセッサに割り当てられる。別法として、論理並行性
は、オペレーティング・システムが単一のプロセッサ上
のみで「タイム・スライス」技法を使用することによっ
て達成することもできる。多くの場合、この2つの方法
が組み合わされ、それによってマルチプロセッサ・シス
テム中の各プロセッサがタイム・スライシングを使用す
ることができる。
(下記の本明細書全体にわたって、「スレッド」と呼
ぶ)によってキャッシュを共用することができる。この
ような並行動作のために、各スレッドは、マルチプロセ
ッサ環境におけるいくつかのプロセッサのうちの1つの
プロセッサに割り当てられる。別法として、論理並行性
は、オペレーティング・システムが単一のプロセッサ上
のみで「タイム・スライス」技法を使用することによっ
て達成することもできる。多くの場合、この2つの方法
が組み合わされ、それによってマルチプロセッサ・シス
テム中の各プロセッサがタイム・スライシングを使用す
ることができる。
【0005】マルチスレッド環境を有するコンピュータ
処理システム(たとえば、複数の処理装置を有するシス
テム)では、従来型の技法は相互排他ロックを使用し
て、挿入動作、または削除動作、または参照動作を実行
するときには常に一度に1つのスレッドしかアクセスで
きないようにする。これは、キャッシュに記憶されてい
る情報がアトミックにアクセスまたは更新され、それに
より、更新動作中に発生する遷移不整合によって参照動
作が誤った結果を返すのを防止するためのものである。
相互排他ロックは、当技術分野において知られており、
本明細書では詳しく説明しない。ある種のロックは、ハ
ードウェアのサポートなしに完全にソフトウェアで実施
することができる。相互排他のための最も一般的な特殊
ハードウェア・サポートは、テスト・アンド・セット動
作である。しかし、この2つの解決策(すなわち、全ソ
フトウェア・ロックおよびハードウェア・サポート・ロ
ック)は、ビジー−待機ループを使用することは設計が
困難であり、この場合、待機方式を使用することができ
ないという欠点を有する。セマフォやモニタなどの特殊
言語機能を適用して、生産者−消費者問題やリーダー−
ライター問題など、相互排他を必要とする一般的な並行
プログラミング問題を解決することができる。詳細は、
A.Burns&G.Davis著「Concurre
nt Programming」64ないし68ペー
ジ,175ないし184ページ,Addison We
sley,1993年を参照されたい。この文献は引用
によって本明細書に組み込まれる。
処理システム(たとえば、複数の処理装置を有するシス
テム)では、従来型の技法は相互排他ロックを使用し
て、挿入動作、または削除動作、または参照動作を実行
するときには常に一度に1つのスレッドしかアクセスで
きないようにする。これは、キャッシュに記憶されてい
る情報がアトミックにアクセスまたは更新され、それに
より、更新動作中に発生する遷移不整合によって参照動
作が誤った結果を返すのを防止するためのものである。
相互排他ロックは、当技術分野において知られており、
本明細書では詳しく説明しない。ある種のロックは、ハ
ードウェアのサポートなしに完全にソフトウェアで実施
することができる。相互排他のための最も一般的な特殊
ハードウェア・サポートは、テスト・アンド・セット動
作である。しかし、この2つの解決策(すなわち、全ソ
フトウェア・ロックおよびハードウェア・サポート・ロ
ック)は、ビジー−待機ループを使用することは設計が
困難であり、この場合、待機方式を使用することができ
ないという欠点を有する。セマフォやモニタなどの特殊
言語機能を適用して、生産者−消費者問題やリーダー−
ライター問題など、相互排他を必要とする一般的な並行
プログラミング問題を解決することができる。詳細は、
A.Burns&G.Davis著「Concurre
nt Programming」64ないし68ペー
ジ,175ないし184ページ,Addison We
sley,1993年を参照されたい。この文献は引用
によって本明細書に組み込まれる。
【0006】ソフトウェア・ロックを使用して、マルチ
スレッド環境を有するシステム中のキャッシュの整合性
を確保することは、そのシステムの性能に悪影響を及ぼ
し、より多くのスレッドが含まれるほど影響が大きくな
る。たとえば、マルチスレッド環境が複数の処理装置
(CPU)を有する環境である場合、キャッシュのソフ
トウェア・ロックを得るために待機するアイドル・プロ
セスは、貴重なプロセッサ時間を使用しない。さらに、
複数のプロセスが単一のプロセッサ上のタイム・スライ
シングによってもたらされるシステムでも、待機中のス
レッドは、オペレーティング・システムによってスワッ
プまたはページアウトされる候補である。このようなス
レッドのページインおよびページアウト/スワップイン
およびスワップアウアトを行うためにオペレーティング
・システムに課される追加作業負荷によって、計算シス
テムのスケーリング可能性がさらに低減される。
スレッド環境を有するシステム中のキャッシュの整合性
を確保することは、そのシステムの性能に悪影響を及ぼ
し、より多くのスレッドが含まれるほど影響が大きくな
る。たとえば、マルチスレッド環境が複数の処理装置
(CPU)を有する環境である場合、キャッシュのソフ
トウェア・ロックを得るために待機するアイドル・プロ
セスは、貴重なプロセッサ時間を使用しない。さらに、
複数のプロセスが単一のプロセッサ上のタイム・スライ
シングによってもたらされるシステムでも、待機中のス
レッドは、オペレーティング・システムによってスワッ
プまたはページアウトされる候補である。このようなス
レッドのページインおよびページアウト/スワップイン
およびスワップアウアトを行うためにオペレーティング
・システムに課される追加作業負荷によって、計算シス
テムのスケーリング可能性がさらに低減される。
【0007】上記の議論は、一般にキャッシュに関係す
るものである。しかし、キャッシュは、下記の3つのパ
ラダイムのうちの1つに従って構成することができる。
るものである。しかし、キャッシュは、下記の3つのパ
ラダイムのうちの1つに従って構成することができる。
【0008】1)「直接マップ」キャッシュとは、記憶
すべき各項目が、それを記憶できるキャッシュ位置を1
つしか有さないキャッシュである。このマッピングは、
各キャッシュ位置が場合によってはいくつかの異なる項
目を保持できるという点で一方向マッピングである。た
とえば、キャッシュエントリ1を文字「a」で始まるす
べての項目を記憶するものとして指定することができ
る。すでに項目「ab」を有するキャッシュへ項目「a
a」の挿入を試みる場合、項目「ab」は破棄せねばな
らない。
すべき各項目が、それを記憶できるキャッシュ位置を1
つしか有さないキャッシュである。このマッピングは、
各キャッシュ位置が場合によってはいくつかの異なる項
目を保持できるという点で一方向マッピングである。た
とえば、キャッシュエントリ1を文字「a」で始まるす
べての項目を記憶するものとして指定することができ
る。すでに項目「ab」を有するキャッシュへ項目「a
a」の挿入を試みる場合、項目「ab」は破棄せねばな
らない。
【0009】2)「フリー・アソチエーティブ」キャッ
シュとは、記憶すべきデータ・項目を場合によっては任
意のキャッシュ位置に配置することができるキャッシュ
である。
シュとは、記憶すべきデータ・項目を場合によっては任
意のキャッシュ位置に配置することができるキャッシュ
である。
【0010】3)「セット・アソシエーティブ」キャッ
シュとは、記憶すべきデータ・項目を場合によっては所
定の1組のキャッシュ位置のうちの1つに配置すること
ができるキャッシュである。
シュとは、記憶すべきデータ・項目を場合によっては所
定の1組のキャッシュ位置のうちの1つに配置すること
ができるキャッシュである。
【0011】多くのアプリケーションでは、キャッシュ
を適切に機能させるために、キャッシュに記憶される各
情報項目が固有のものである必要がある。すなわち、項
目の複製をキャッシュに記憶することはできない。キャ
ッシュの整合性を確保する最も簡単な解決策は、キャッ
シュ全体に対して相互排他ロックを使用し、それによっ
て、キャッシュに対する挿入動作、または削除動作、ま
たは参照動作が1度に1つしかできないようにすること
である。
を適切に機能させるために、キャッシュに記憶される各
情報項目が固有のものである必要がある。すなわち、項
目の複製をキャッシュに記憶することはできない。キャ
ッシュの整合性を確保する最も簡単な解決策は、キャッ
シュ全体に対して相互排他ロックを使用し、それによっ
て、キャッシュに対する挿入動作、または削除動作、ま
たは参照動作が1度に1つしかできないようにすること
である。
【0012】直接マップ・キャッシュおよびセット・ア
ソシエーティブ・キャッシュでは、多数の密粒相互排他
ロックを使用してキャッシュへのより並行性の高いアク
セスを可能にすることができる。したがって、キャッシ
ュ全体に1つの相互排他ロックしか使用しないのではな
く、キャッシュ中の各位置(直接マップ)または位置の
各集合(セット・アソシエーティブ)ごとに1つの相互
排他ロックがある。キャッシュへのアクセスがランダム
に行われる場合、複数の相互排他ロックを有すると、所
与のキャッシュ動作を適用するために必要な特定のロッ
クを得る際の競合の確率が低下するので、並行アクセス
が増加する。
ソシエーティブ・キャッシュでは、多数の密粒相互排他
ロックを使用してキャッシュへのより並行性の高いアク
セスを可能にすることができる。したがって、キャッシ
ュ全体に1つの相互排他ロックしか使用しないのではな
く、キャッシュ中の各位置(直接マップ)または位置の
各集合(セット・アソシエーティブ)ごとに1つの相互
排他ロックがある。キャッシュへのアクセスがランダム
に行われる場合、複数の相互排他ロックを有すると、所
与のキャッシュ動作を適用するために必要な特定のロッ
クを得る際の競合の確率が低下するので、並行アクセス
が増加する。
【0013】
【発明が解決しようとする課題】通常、キャッシュ参照
は、挿入および削除よりもずっと頻繁に行われる。この
アクセス・パターンを利用するには、整合性を維持する
ために使用される相互排他ロックを読取り−書込みロッ
クで置き換えることができる。読取り−書込みロックで
は複数の並行キャッシュ参照が可能になる。というの
は、複数の並行キャッシュ参照によってキャッシュの内
容が修正されることはないからである。しかし、1つの
スレッドが挿入と削除のどちらかを実行している場合、
他のすべてのスレッドは、何らかの理由、すなわち、あ
る項目の別の挿入または削除、あるいは参照のためにキ
ャッシュ全体にアクセスすることは許可されない。した
がって、1つのスレッドの挿入または削除のために、他
の多数のスレッドがアイドル状態になる恐れがある。
は、挿入および削除よりもずっと頻繁に行われる。この
アクセス・パターンを利用するには、整合性を維持する
ために使用される相互排他ロックを読取り−書込みロッ
クで置き換えることができる。読取り−書込みロックで
は複数の並行キャッシュ参照が可能になる。というの
は、複数の並行キャッシュ参照によってキャッシュの内
容が修正されることはないからである。しかし、1つの
スレッドが挿入と削除のどちらかを実行している場合、
他のすべてのスレッドは、何らかの理由、すなわち、あ
る項目の別の挿入または削除、あるいは参照のためにキ
ャッシュ全体にアクセスすることは許可されない。した
がって、1つのスレッドの挿入または削除のために、他
の多数のスレッドがアイドル状態になる恐れがある。
【0014】簡単に言えば、1つまたは複数のソフトウ
ェア・ロックを使用してマルチスレッド・システム中の
キャッシュの整合性を確保すると、キャッシュへの並行
アクセスが低減され、システムのスケーリング可能性に
悪影響が及ぼされる。
ェア・ロックを使用してマルチスレッド・システム中の
キャッシュの整合性を確保すると、キャッシュへの並行
アクセスが低減され、システムのスケーリング可能性に
悪影響が及ぼされる。
【0015】
【課題を解決するための手段】マルチスレッド処理シス
テムは、各スレッドから共通にアクセスできるキャッシ
ュを有する。このキャッシュは、それぞれ、エントリ番
号によって識別される、項目を記憶する複数のエントリ
を有する。第1のキーを含むエントリの、キャッシュ中
の位置は、この第1のキーをロックレス参照エンジンに
供給することによって判定される。ロックレス参照エン
ジンは次いで、参照出力、すなわち参照エントリ番号を
提供する。参照エントリ番号は、第1のエントリ番号と
第2のエントリ番号のどちらかであり、この場合、第1
のエントリ番号は、その項目が記憶されている第1のエ
ントリを指し示し、第2のエントリ番号は、項目が記憶
されていない第2のエントリを指す。なお、参照エント
リ番号は、所望のエントリ番号での単なる「ヒント」を
提供するものとみなすことができる。次いで、参照エン
トリ番号が第1のエントリ番号であることが検証され
る。この検証には、少なくとも参照エントリ番号で指定
されたエントリへの排他的アクセスを許可する相互排他
ロックを得ることと、参照エントリ番号を使用して、参
照エントリ番号で指定されたエントリから記憶されてい
るキーを読み取ることと、第1のキーを、記憶されてい
るキーと比較することとが含まれる。2つのキーが合致
した場合、この項目が見つかったことになる。
テムは、各スレッドから共通にアクセスできるキャッシ
ュを有する。このキャッシュは、それぞれ、エントリ番
号によって識別される、項目を記憶する複数のエントリ
を有する。第1のキーを含むエントリの、キャッシュ中
の位置は、この第1のキーをロックレス参照エンジンに
供給することによって判定される。ロックレス参照エン
ジンは次いで、参照出力、すなわち参照エントリ番号を
提供する。参照エントリ番号は、第1のエントリ番号と
第2のエントリ番号のどちらかであり、この場合、第1
のエントリ番号は、その項目が記憶されている第1のエ
ントリを指し示し、第2のエントリ番号は、項目が記憶
されていない第2のエントリを指す。なお、参照エント
リ番号は、所望のエントリ番号での単なる「ヒント」を
提供するものとみなすことができる。次いで、参照エン
トリ番号が第1のエントリ番号であることが検証され
る。この検証には、少なくとも参照エントリ番号で指定
されたエントリへの排他的アクセスを許可する相互排他
ロックを得ることと、参照エントリ番号を使用して、参
照エントリ番号で指定されたエントリから記憶されてい
るキーを読み取ることと、第1のキーを、記憶されてい
るキーと比較することとが含まれる。2つのキーが合致
した場合、この項目が見つかったことになる。
【0016】本発明の一実施態様では、相互排他ロック
は、参照エントリ番号で指定されたエントリのみへの排
他的アクセスを許可する。
は、参照エントリ番号で指定されたエントリのみへの排
他的アクセスを許可する。
【0017】本発明の他の態様では、第1のキーが、記
憶されているキーに合致しない場合、相互排他ロックが
解除される。次いで、ロックレス参照エンジンが再びア
クセスされ、項目が探索される。
憶されているキーに合致しない場合、相互排他ロックが
解除される。次いで、ロックレス参照エンジンが再びア
クセスされ、項目が探索される。
【0018】本発明の他の態様では、参照出力は参照エ
ントリ番号と、項目がキャッシュに記憶されていないこ
とを示すもののどちらかである。参照出力が、項目がキ
ャッシュに記憶されていないことを示すものである場
合、第2の検証が実行される。これは、キャッシュに対
する相互排他ロックを得てキャッシュへの挿入および削
除を拒否することと、ロックレス参照エンジンを使用し
て第2の参照出力を提供することとを含む。第2の参照
出力は、第1のエントリ番号と、項目がキャッシュに記
憶されていないことを示すもののどちらかであり、第2
の参照出力が第1のエントリ番号である場合、この項目
が見つかったことになる。
ントリ番号と、項目がキャッシュに記憶されていないこ
とを示すもののどちらかである。参照出力が、項目がキ
ャッシュに記憶されていないことを示すものである場
合、第2の検証が実行される。これは、キャッシュに対
する相互排他ロックを得てキャッシュへの挿入および削
除を拒否することと、ロックレス参照エンジンを使用し
て第2の参照出力を提供することとを含む。第2の参照
出力は、第1のエントリ番号と、項目がキャッシュに記
憶されていないことを示すもののどちらかであり、第2
の参照出力が第1のエントリ番号である場合、この項目
が見つかったことになる。
【0019】本発明の他の態様では、第2の参照出力
が、項目がキャッシュに記憶されていないことを示すも
のである場合、第1のキーが新しいキャッシュエントリ
に記憶され、ロックレス参照エンジンに新しい要素が記
憶される。この場合、新しい要素は、第1のキーと、新
しいキャッシュエントリを識別する新しいエントリ番号
とを備える。
が、項目がキャッシュに記憶されていないことを示すも
のである場合、第1のキーが新しいキャッシュエントリ
に記憶され、ロックレス参照エンジンに新しい要素が記
憶される。この場合、新しい要素は、第1のキーと、新
しいキャッシュエントリを識別する新しいエントリ番号
とを備える。
【0020】本発明の他の態様では、ロックレス参照エ
ンジンはロックレス参照ハッシュ・テーブルである。
ンジンはロックレス参照ハッシュ・テーブルである。
【0021】本発明は、下記の詳細な説明を図面と共に
読むことによって理解されよう。図面では、同じ部分
は、同じ参照符号で識別されている。
読むことによって理解されよう。図面では、同じ部分
は、同じ参照符号で識別されている。
【0022】
【発明の実施の形態】本発明の実施形態は、マルチスレ
ッド環境で使用できるフリー・アソシエーティブ・キャ
ッシュを提供する。本発明のキャッシュに対する挿入お
よび削除は、キャッシュ全域ロック(下記では「キャッ
シュ・ロック」と呼ぶ)によって順次化される。しか
し、すでにキャッシュに記憶されている項目を得る並行
参照動作がキャッシュ・ロックによって妨害されること
はない。したがって、本発明のキャッシュは、マルチス
レッド環境でのスループットをかなり向上させる。本発
明のこれらおよびその他の特性は、下記の詳細な説明か
ら明らかになろう。
ッド環境で使用できるフリー・アソシエーティブ・キャ
ッシュを提供する。本発明のキャッシュに対する挿入お
よび削除は、キャッシュ全域ロック(下記では「キャッ
シュ・ロック」と呼ぶ)によって順次化される。しか
し、すでにキャッシュに記憶されている項目を得る並行
参照動作がキャッシュ・ロックによって妨害されること
はない。したがって、本発明のキャッシュは、マルチス
レッド環境でのスループットをかなり向上させる。本発
明のこれらおよびその他の特性は、下記の詳細な説明か
ら明らかになろう。
【0023】好ましい実施形態では、キャッシュは、複
数の「SPARCTM」処理装置を有するSunワークス
テーションまたはサーバ、あるいはその両方上で実施さ
れる(SunおよびSPARCは、米国およびその他の
国のサンマイクロシステムズ社の商標または登録商標で
ある)。次に図1を参照すると、本発明の技法を使用す
るための例示的なコンピュータ・システムが示されてい
る。このシステムは、それぞれ、ハードウェア・キャッ
シュ129(本明細書に記載した本発明のキャッシュと
混同しないよう留意されたい)を介して共通の二重ポー
ト・メモリ(DPM)103に結合された、2つの同じ
プロセッサ101を含む。各プロセッサ101は、中央
演算処理装置(CPU)105と、ランダム・アクセス
・メモリ(RAM)115と、読取り専用メモリ(RO
M)117と、上記の各要素を接続する共通システム・
バス119とを備える。各プロセッサ101は、バス1
19を介して共用入出力(I/O)制御装置109にも
接続される。入出力制御装置109によって、ディスク
107、入力装置111および123、出力装置113
および121にプロセッサを結合することができる。こ
れらの構成要素はそれぞれ、当技術分野で知られてお
り、本明細書でさらに詳しく説明する必要はない。
数の「SPARCTM」処理装置を有するSunワークス
テーションまたはサーバ、あるいはその両方上で実施さ
れる(SunおよびSPARCは、米国およびその他の
国のサンマイクロシステムズ社の商標または登録商標で
ある)。次に図1を参照すると、本発明の技法を使用す
るための例示的なコンピュータ・システムが示されてい
る。このシステムは、それぞれ、ハードウェア・キャッ
シュ129(本明細書に記載した本発明のキャッシュと
混同しないよう留意されたい)を介して共通の二重ポー
ト・メモリ(DPM)103に結合された、2つの同じ
プロセッサ101を含む。各プロセッサ101は、中央
演算処理装置(CPU)105と、ランダム・アクセス
・メモリ(RAM)115と、読取り専用メモリ(RO
M)117と、上記の各要素を接続する共通システム・
バス119とを備える。各プロセッサ101は、バス1
19を介して共用入出力(I/O)制御装置109にも
接続される。入出力制御装置109によって、ディスク
107、入力装置111および123、出力装置113
および121にプロセッサを結合することができる。こ
れらの構成要素はそれぞれ、当技術分野で知られてお
り、本明細書でさらに詳しく説明する必要はない。
【0024】各プロセッサ101は、CPU105によ
って実行できるいくつかのソフトウェアを含む。そのよ
うなソフトウェアの1つはオペレーティング・システム
であり、オペレーティング・システムは、ROM117
から実行することも、あるいはRAM115から実行す
ることもできる。「SOLARISTM」は好ましいオペ
レーティング・システムである(SunおよびSola
risは、米国およびその他の国のサンマイクロシステ
ムズ社の商標または登録商標である)。オペレーティン
グ・システムは、当技術分野で知られており、オペレー
ティング・システムの説明は本明細書の範囲を超えてい
る。代替実施形態では、システムは、単一のプロセッサ
101と、スレッドが並行して動作できるようにマルチ
タスキング機能を有するオペレーティング・システムと
を有することができる。この代替実施形態では、複数の
スレッドが、メモリに記憶されているキャッシュに共通
にかつ並行してアクセスすることができる。他の代替実
施形態では、システムに複数のプロセッサが設けられ、
各プロセッサは、マルチタスキング機能を有するオペレ
ーティング・システムを実行する。
って実行できるいくつかのソフトウェアを含む。そのよ
うなソフトウェアの1つはオペレーティング・システム
であり、オペレーティング・システムは、ROM117
から実行することも、あるいはRAM115から実行す
ることもできる。「SOLARISTM」は好ましいオペ
レーティング・システムである(SunおよびSola
risは、米国およびその他の国のサンマイクロシステ
ムズ社の商標または登録商標である)。オペレーティン
グ・システムは、当技術分野で知られており、オペレー
ティング・システムの説明は本明細書の範囲を超えてい
る。代替実施形態では、システムは、単一のプロセッサ
101と、スレッドが並行して動作できるようにマルチ
タスキング機能を有するオペレーティング・システムと
を有することができる。この代替実施形態では、複数の
スレッドが、メモリに記憶されているキャッシュに共通
にかつ並行してアクセスすることができる。他の代替実
施形態では、システムに複数のプロセッサが設けられ、
各プロセッサは、マルチタスキング機能を有するオペレ
ーティング・システムを実行する。
【0025】図1に示した実施形態に戻ると分かるよう
に、各プロセッサ101は、RAM115とROM11
7のどちらかに記憶されているプログラムを実行するこ
とによって互いに独立に動作する。この例では、各プロ
セッサ101は、DPM103に記憶されているキャッ
シュ127へのプロセッサのアクセスを支配するキャッ
シュ制御プログラム125を含む。
に、各プロセッサ101は、RAM115とROM11
7のどちらかに記憶されているプログラムを実行するこ
とによって互いに独立に動作する。この例では、各プロ
セッサ101は、DPM103に記憶されているキャッ
シュ127へのプロセッサのアクセスを支配するキャッ
シュ制御プログラム125を含む。
【0026】次に、本発明のキャッシュ127を図2に
関連して詳しく説明する。キャッシュに情報項目(下記
では「キャッシュ項目」と呼ぶ)を記憶するためにエン
トリ・テーブル201が提供される。キャッシュ項目
は、エントリ・テーブル201のN個の位置またはエン
トリ(下記では、「エントリ」と呼ぶ)のうちの任意の
位置に記憶することができる。エントリ・テーブル20
1中の各エントリは、固有にエントリ番号に関連付けら
れ、エントリ番号はエントリ・テーブル201中のエン
トリへのポインタとして使用される。各エントリは、キ
ー203、データ値205、エントリ・ロック207、
最後のアクセス時間209、リファレンス・カウント2
11の各情報を記憶するフィールドを有する。キー20
3と値205は共に、キャッシュ・ユーザが記憶または
検索し、あるいはその両方を行いたい情報項目を構成す
る。値205は、キャッシュ・ユーザが定義する任意の
タイプの構造(たとえば、即値データ・オペランドや他
のメモリ位置を指すポインタ)でよい。好ましい実施形
態では、キャッシュ・ユーザは、メモリ位置を指すポイ
ンタが、「ビジー」とマーク付けされたキャッシュ・エ
ントリ中にキー203または値205として記憶されて
いる場合、その位置は割り振り解除されないという制限
に従わなければならない。この理由は、他のスレッド
が、キャッシュからそのポインタを得ており、メモリが
割り振り解除されたことを知らずにそのポインタを使用
する可能性があるからである。このようなオカレンスの
後の結果は、予想できないものである。
関連して詳しく説明する。キャッシュに情報項目(下記
では「キャッシュ項目」と呼ぶ)を記憶するためにエン
トリ・テーブル201が提供される。キャッシュ項目
は、エントリ・テーブル201のN個の位置またはエン
トリ(下記では、「エントリ」と呼ぶ)のうちの任意の
位置に記憶することができる。エントリ・テーブル20
1中の各エントリは、固有にエントリ番号に関連付けら
れ、エントリ番号はエントリ・テーブル201中のエン
トリへのポインタとして使用される。各エントリは、キ
ー203、データ値205、エントリ・ロック207、
最後のアクセス時間209、リファレンス・カウント2
11の各情報を記憶するフィールドを有する。キー20
3と値205は共に、キャッシュ・ユーザが記憶または
検索し、あるいはその両方を行いたい情報項目を構成す
る。値205は、キャッシュ・ユーザが定義する任意の
タイプの構造(たとえば、即値データ・オペランドや他
のメモリ位置を指すポインタ)でよい。好ましい実施形
態では、キャッシュ・ユーザは、メモリ位置を指すポイ
ンタが、「ビジー」とマーク付けされたキャッシュ・エ
ントリ中にキー203または値205として記憶されて
いる場合、その位置は割り振り解除されないという制限
に従わなければならない。この理由は、他のスレッド
が、キャッシュからそのポインタを得ており、メモリが
割り振り解除されたことを知らずにそのポインタを使用
する可能性があるからである。このようなオカレンスの
後の結果は、予想できないものである。
【0027】エントリ・ロック207、最後のアクセス
時間209、リファレンス・カウント211は、ハウス
キーピング項目であり、キャッシュ制御プログラム12
5によって使用される。簡単に言えば、エントリ・ロッ
ク207によって、ロック保持者は、関連するキャッシ
ュ・エントリ(そのエントリのみ)が他のスレッドによ
って変更または削除されるのを防止することができる。
時間209、リファレンス・カウント211は、ハウス
キーピング項目であり、キャッシュ制御プログラム12
5によって使用される。簡単に言えば、エントリ・ロッ
ク207によって、ロック保持者は、関連するキャッシ
ュ・エントリ(そのエントリのみ)が他のスレッドによ
って変更または削除されるのを防止することができる。
【0028】最後のアクセス時間209は、キャッシュ
・クロック13から得られ、好ましくは、キャッシュ・
エントリがアクセスされたときには常に単調に増加す
る。キャッシュ・エントリがアクセスされる(すなわ
ち、エントリ・テーブル201に挿入され、あるいはエ
ントリ・テーブルから削除される)たびに、その最後の
アクセス時間209はキャッシュ・クロック213の現
在の値に設定される。キャッシュ項目を含まないキャッ
シュ・エントリの最後のアクセス時間209は零に等し
くなる。下記で詳しく説明するように、この情報は、い
くつかのキャッシュ・エントリのうち、最後に使用され
たのはどれかを判定するためにキャッシュ置換ルーチン
によって使用することができる(キャッシュ・エントリ
を使用した時間が新しいほど、最後のアクセス時間の値
は大きくなる)。
・クロック13から得られ、好ましくは、キャッシュ・
エントリがアクセスされたときには常に単調に増加す
る。キャッシュ・エントリがアクセスされる(すなわ
ち、エントリ・テーブル201に挿入され、あるいはエ
ントリ・テーブルから削除される)たびに、その最後の
アクセス時間209はキャッシュ・クロック213の現
在の値に設定される。キャッシュ項目を含まないキャッ
シュ・エントリの最後のアクセス時間209は零に等し
くなる。下記で詳しく説明するように、この情報は、い
くつかのキャッシュ・エントリのうち、最後に使用され
たのはどれかを判定するためにキャッシュ置換ルーチン
によって使用することができる(キャッシュ・エントリ
を使用した時間が新しいほど、最後のアクセス時間の値
は大きくなる)。
【0029】リファレンス・カウント211とは、零に
初期設定され、次いでスレッドによって、関連するキャ
ッシュ項目が得られるたびに増分される数である。スレ
ッドは、もはやそのキャッシュ項目を使用しないと決定
した場合、リファレンス・カウント211を減分させる
責任を負う。リファレンス・カウントが零よりも大きな
場合は、そのキャッシュ項目が使用中であることを示す
ので、そのキャッシュ項目が再使用されることがないよ
うにしたいスレッドは、単に、そのキャッシュ項目を得
た後にリファレンス・カウント211に対して何もしな
ければよい。
初期設定され、次いでスレッドによって、関連するキャ
ッシュ項目が得られるたびに増分される数である。スレ
ッドは、もはやそのキャッシュ項目を使用しないと決定
した場合、リファレンス・カウント211を減分させる
責任を負う。リファレンス・カウントが零よりも大きな
場合は、そのキャッシュ項目が使用中であることを示す
ので、そのキャッシュ項目が再使用されることがないよ
うにしたいスレッドは、単に、そのキャッシュ項目を得
た後にリファレンス・カウント211に対して何もしな
ければよい。
【0030】さらに、キャッシュ127には、キャッシ
ュ項目の挿入および削除を順次化し、そのような動作を
1度に1つしか実行できないようにするキャッシュ・ロ
ック215が関連付けられる。キャッシュ参照は、キャ
ッシュ削除動作またはキャッシュ挿入動作が実行されて
いる間に行うことができる。この特性を本明細書では
「ロックレス参照」と呼ぶ。参照動作は、参照が挿入中
のエントリ番号と同じエントリ番号に対するものでない
かぎり、並行挿入によって遅延することはない。参照動
作は、並行削除動作によってときどき遅延する可能性の
方が高い。このようにときどき遅延する理由は下記で明
らかになろう。
ュ項目の挿入および削除を順次化し、そのような動作を
1度に1つしか実行できないようにするキャッシュ・ロ
ック215が関連付けられる。キャッシュ参照は、キャ
ッシュ削除動作またはキャッシュ挿入動作が実行されて
いる間に行うことができる。この特性を本明細書では
「ロックレス参照」と呼ぶ。参照動作は、参照が挿入中
のエントリ番号と同じエントリ番号に対するものでない
かぎり、並行挿入によって遅延することはない。参照動
作は、並行削除動作によってときどき遅延する可能性の
方が高い。このようにときどき遅延する理由は下記で明
らかになろう。
【0031】前述のように、キャッシュ127は、完全
にアソシエーティブであり、そのため、キャッシュ項目
をキャッシュ・エントリに記憶することができる。本発
明によれば、エントリ・テーブル201中のキャッシュ
項目の探索を促進するのを助けるためにロックレス参照
エンジンが提供される。ロックレス参照エンジンは、テ
ーブル217と参照エンジン制御プログラム(図示せ
ず)の2つの部分を備える。参照エンジンのテーブル2
17は、好ましくはキャッシュ127に含まれる。対応
する参照エンジン制御プログラムは好ましくはキャッシ
ュ制御プログラム125に組み込まれる。
にアソシエーティブであり、そのため、キャッシュ項目
をキャッシュ・エントリに記憶することができる。本発
明によれば、エントリ・テーブル201中のキャッシュ
項目の探索を促進するのを助けるためにロックレス参照
エンジンが提供される。ロックレス参照エンジンは、テ
ーブル217と参照エンジン制御プログラム(図示せ
ず)の2つの部分を備える。参照エンジンのテーブル2
17は、好ましくはキャッシュ127に含まれる。対応
する参照エンジン制御プログラムは好ましくはキャッシ
ュ制御プログラム125に組み込まれる。
【0032】参照エンジンの目的は、入力キー219を
受け取り、エントリ・テーブル201中のエントリを指
すエントリ番号221を入力キーから生成することであ
る。したがって、参照エンジン自体が、前述の参照機能
だけでなく、それぞれ、キャッシュ挿入動作およびキャ
ッシュ削除動作に対応する、挿入動作および削除動作も
サポートすべきである。すなわち、使用可能なキャッシ
ュ・エントリにキャッシュ項目を挿入するとき、そのキ
ャッシュ項目に関連付けられたキー203、およびエン
トリ・テーブル201中のその項目のエントリ番号は、
この関連を将来使用するために記録できるように入力2
19および223として参照エンジン・テーブル217
に与えられる。同様に、キャッシュ127が、そのエン
トリ・テーブル201からの対応するキャッシュ項目の
削除を許可している場合に参照エンジン自体も、キーお
よびそれに関連付けられたエントリ番号の参照機構から
の削除をサポートすべきである。
受け取り、エントリ・テーブル201中のエントリを指
すエントリ番号221を入力キーから生成することであ
る。したがって、参照エンジン自体が、前述の参照機能
だけでなく、それぞれ、キャッシュ挿入動作およびキャ
ッシュ削除動作に対応する、挿入動作および削除動作も
サポートすべきである。すなわち、使用可能なキャッシ
ュ・エントリにキャッシュ項目を挿入するとき、そのキ
ャッシュ項目に関連付けられたキー203、およびエン
トリ・テーブル201中のその項目のエントリ番号は、
この関連を将来使用するために記録できるように入力2
19および223として参照エンジン・テーブル217
に与えられる。同様に、キャッシュ127が、そのエン
トリ・テーブル201からの対応するキャッシュ項目の
削除を許可している場合に参照エンジン自体も、キーお
よびそれに関連付けられたエントリ番号の参照機構から
の削除をサポートすべきである。
【0033】キャッシュ127の効率を最大にするため
に、参照エンジンは、それ自体のソフトウェア・ロック
を有すのではなく、キャッシュ全体によって使用できる
ように提供されるロックに依存すべきである。したがっ
て、参照エンジンは、それ自体の挿入動作および削除動
作は順次化されるが、参照動作は任意の時間に行うこと
ができる条件の下で動作することが予想される。マルチ
スレッド環境ではしたがって、参照動作によって常に正
確な結果がもたらされるわけではないことが予想でき
る。たとえば、参照エンジンは、実際には所望の要素
(「要素」は、キーと、それに関連付けられたエントリ
番号とからなる)が同時に他のスレッドによって書き込
まれているときに誤って、「要素が見つからない」とい
う結果を返すことがある。参照エンジンは誤って、削除
されたばかりの要素のエントリ番号221を返すことも
ある。さらに、参照エンジンは、要素が同時に他のスレ
ッドによって修正されている場合にその要素の誤ったエ
ントリ番号221を返すことがある。
に、参照エンジンは、それ自体のソフトウェア・ロック
を有すのではなく、キャッシュ全体によって使用できる
ように提供されるロックに依存すべきである。したがっ
て、参照エンジンは、それ自体の挿入動作および削除動
作は順次化されるが、参照動作は任意の時間に行うこと
ができる条件の下で動作することが予想される。マルチ
スレッド環境ではしたがって、参照動作によって常に正
確な結果がもたらされるわけではないことが予想でき
る。たとえば、参照エンジンは、実際には所望の要素
(「要素」は、キーと、それに関連付けられたエントリ
番号とからなる)が同時に他のスレッドによって書き込
まれているときに誤って、「要素が見つからない」とい
う結果を返すことがある。参照エンジンは誤って、削除
されたばかりの要素のエントリ番号221を返すことも
ある。さらに、参照エンジンは、要素が同時に他のスレ
ッドによって修正されている場合にその要素の誤ったエ
ントリ番号221を返すことがある。
【0034】本発明によれば、参照エンジンによって提
供されるこれらの「ヒント」(保証された正確な答えに
対するものとして)は、システム中のどのスレッドもあ
る時点での有効な要素の一部として挿入したことがない
エントリ番号221を返す参照動作がなくなることが参
照エンジンによって保証されるかぎり、受け入れること
ができる。言い換えれば、参照エンジンは、初期設定さ
れていない値をエントリ番号221として返すことを許
可されてはならい。この要件の理由は、エントリ値が、
キャッシュのエントリ・テーブル201にアドレスする
ためのポインタとして使用されることである。したがっ
て、ランダム値ではシステムの障害が生じる恐れがあ
る。ワースト・ケースで、エントリ番号221が単に、
エントリ・テーブル201中の誤ってはいるが実際のエ
ントリを指すことを保証することによって、前述のシス
テム障害を回避することができる。
供されるこれらの「ヒント」(保証された正確な答えに
対するものとして)は、システム中のどのスレッドもあ
る時点での有効な要素の一部として挿入したことがない
エントリ番号221を返す参照動作がなくなることが参
照エンジンによって保証されるかぎり、受け入れること
ができる。言い換えれば、参照エンジンは、初期設定さ
れていない値をエントリ番号221として返すことを許
可されてはならい。この要件の理由は、エントリ値が、
キャッシュのエントリ・テーブル201にアドレスする
ためのポインタとして使用されることである。したがっ
て、ランダム値ではシステムの障害が生じる恐れがあ
る。ワースト・ケースで、エントリ番号221が単に、
エントリ・テーブル201中の誤ってはいるが実際のエ
ントリを指すことを保証することによって、前述のシス
テム障害を回避することができる。
【0035】好ましい実施形態によれば、参照エンジン
はロックレス参照ハッシュ・テーブルであり、挿入動作
および削除動作のみの順次化しか必要とせず、並行参照
動作を許可し、以前にシステム中のどのスレッドからも
ハッシュ・テーブルに書き込まれたことがない値が返さ
れることがなくなることが保証される。そのようなハッ
シュ・テーブルは、本発明と同じ出願人に譲渡され引用
によって全体的に本明細書に組み込まれた米国特許出力
第 号(整理番号026414−001)に詳しく記
載されている。
はロックレス参照ハッシュ・テーブルであり、挿入動作
および削除動作のみの順次化しか必要とせず、並行参照
動作を許可し、以前にシステム中のどのスレッドからも
ハッシュ・テーブルに書き込まれたことがない値が返さ
れることがなくなることが保証される。そのようなハッ
シュ・テーブルは、本発明と同じ出願人に譲渡され引用
によって全体的に本明細書に組み込まれた米国特許出力
第 号(整理番号026414−001)に詳しく記
載されている。
【0036】次に、ロックレス参照ハッシュ・テーブル
をキャッシュ127用の参照エンジンとして使用するこ
とを図3に示す。この例では、キャッシュ・エントリ・
テーブル301はディレクトリ名参照キャッシュであ
り、この場合、各キー203はファイル名であり、値2
05はファイル番号である。そのようなキャッシュの目
的は、最後のアクセスされたファイルの名前および対応
するファイル番号を記憶することである。図のように、
キーが「sys」であるキャッシュ項目がキャッシュ・
エントリ0に記憶され、キーが「file1」であるキ
ャッシュ項目がキャッシュ・エントリ101に記憶さ
れ、キーが「myfile」であるキャッシュ項目がキ
ャッシュ・エントリ102に記憶され、キーが「myd
ir」であるキャッシュ項目がキャッシュ・エントリN
に記憶される。
をキャッシュ127用の参照エンジンとして使用するこ
とを図3に示す。この例では、キャッシュ・エントリ・
テーブル301はディレクトリ名参照キャッシュであ
り、この場合、各キー203はファイル名であり、値2
05はファイル番号である。そのようなキャッシュの目
的は、最後のアクセスされたファイルの名前および対応
するファイル番号を記憶することである。図のように、
キーが「sys」であるキャッシュ項目がキャッシュ・
エントリ0に記憶され、キーが「file1」であるキ
ャッシュ項目がキャッシュ・エントリ101に記憶さ
れ、キーが「myfile」であるキャッシュ項目がキ
ャッシュ・エントリ102に記憶され、キーが「myd
ir」であるキャッシュ項目がキャッシュ・エントリN
に記憶される。
【0037】任意のキャッシュ項目のエントリ番号を見
つけられるように、それに関連付けられたキーが入力と
して与えられる場合、ロックレス参照ハッシュ・テーブ
ル303はキーとエントリ番号の対を記憶している。所
与の対では、エントリ番号は、キーおよびそれに関連付
けられた値が記憶されているキャッシュ中のエントリを
指す。各キー/エントリ番号対が配置されたロックレス
参照ハッシュ・テーブル中の位置は、キーに作用してハ
ッシュ・テーブルの初期インデックスを生成するハッシ
ュ関数と、初期インデックスが、すでに占有されている
位置を指す場合に、使用可能なエントリを見つける競合
方法によって判定される。したがって、この例では、キ
ー「sys」のハッシュ値はN−1であり、したがって
対「(sys,0)」はロックレス参照ハッシュ・テー
ブル303中の位置N−1に記憶される。矢印305で
示したように、「0」は、キャッシュ・エントリ0にキ
ャッシュ項目が記憶されていることを示す。
つけられるように、それに関連付けられたキーが入力と
して与えられる場合、ロックレス参照ハッシュ・テーブ
ル303はキーとエントリ番号の対を記憶している。所
与の対では、エントリ番号は、キーおよびそれに関連付
けられた値が記憶されているキャッシュ中のエントリを
指す。各キー/エントリ番号対が配置されたロックレス
参照ハッシュ・テーブル中の位置は、キーに作用してハ
ッシュ・テーブルの初期インデックスを生成するハッシ
ュ関数と、初期インデックスが、すでに占有されている
位置を指す場合に、使用可能なエントリを見つける競合
方法によって判定される。したがって、この例では、キ
ー「sys」のハッシュ値はN−1であり、したがって
対「(sys,0)」はロックレス参照ハッシュ・テー
ブル303中の位置N−1に記憶される。矢印305で
示したように、「0」は、キャッシュ・エントリ0にキ
ャッシュ項目が記憶されていることを示す。
【0038】上記の例では、エントリ・テーブル201
中のキー用に予約されたメモリ領域内にキーを記憶する
ことができると仮定した。しかし、実際には、ファイル
名の長さは大幅に異なることがあり、非常に長くなるこ
とがある(すなわち、最大255バイト)。各キャッシ
ュ・エントリごとに、ファイル名の最大サイズに等しい
キー・フィールドを予約するのは無駄である。この状況
に対するより良い解決策は、キー203自体をメモリ領
域を指すポインタにすることである。その場合、ポイン
タは、個別の各ファイル名ごとの必要に応じて動的に割
り振ることができる。しかし、他のスレッドがあるキー
を見ないことが確実でないかぎり、ユーザがそのキー用
の記憶域を割り振り解除しないようにする方法を使用し
なければならない。
中のキー用に予約されたメモリ領域内にキーを記憶する
ことができると仮定した。しかし、実際には、ファイル
名の長さは大幅に異なることがあり、非常に長くなるこ
とがある(すなわち、最大255バイト)。各キャッシ
ュ・エントリごとに、ファイル名の最大サイズに等しい
キー・フィールドを予約するのは無駄である。この状況
に対するより良い解決策は、キー203自体をメモリ領
域を指すポインタにすることである。その場合、ポイン
タは、個別の各ファイル名ごとの必要に応じて動的に割
り振ることができる。しかし、他のスレッドがあるキー
を見ないことが確実でないかぎり、ユーザがそのキー用
の記憶域を割り振り解除しないようにする方法を使用し
なければならない。
【0039】好ましい実施形態では、2つのキャッシュ
項目が同じキーを有することはできない。この理由は、
キー203を入力キー値と突き合わせることによってキ
ャッシュ項目が見つけられることである。2つのキャッ
シュ項目が同じキー203を有することができる場合、
それらのうちの一方しか見つからない。たとえば、前述
のように、参照エンジンがロックレス参照ハッシュ・テ
ーブルである場合、ハッシュ・テーブル参照動作は常
に、キーが合致した第1の要素に出会った後に探索プロ
ーブ・シーケンスを停止する。
項目が同じキーを有することはできない。この理由は、
キー203を入力キー値と突き合わせることによってキ
ャッシュ項目が見つけられることである。2つのキャッ
シュ項目が同じキー203を有することができる場合、
それらのうちの一方しか見つからない。たとえば、前述
のように、参照エンジンがロックレス参照ハッシュ・テ
ーブルである場合、ハッシュ・テーブル参照動作は常
に、キーが合致した第1の要素に出会った後に探索プロ
ーブ・シーケンスを停止する。
【0040】常に正確な答えではなく前述の「ヒント」
を返すことに依存できる参照エンジンを使用するには、
本発明による下記の方法を使用する。参照エンジン・テ
ーブル217中の項目の参照が失敗した(すなわち、合
致するキーを有する要素が見つからず、したがって、明
らかに「キャッシュ・ミス」が発生していることをテー
ブルが示す)場合、相互排他キャッシュ・ロック215
を得てその項目に対する第2の参照を実行し、その項目
が実際にキャッシュ中にないことを検証しなければなら
ない。キャッシュ・ロック215を得ることによって、
他のスレッドがキャッシュ・エントリを削除し、あるい
はキャッシュ・エントリに項目を挿入することが防止さ
れることを想起されたい。スレッドが参照エンジンを更
新するときにはいつでも、最初にキャッシュ・ロック2
15を得るので、参照エンジンの挿入および削除も防止
され、それによって、参照エンジン・テーブル217は
確実に、この検証動作に対する正確な出力を生成する。
探索中の要素が実際に参照エンジン・テーブル217に
あることが判明した場合、新たに得たエントリ番号22
1を使用して所望のキャッシュ項目を見つけることがで
きる。探索中の要素が参照エンジン・テーブル217に
あることが判明するかどうかにはかかわらず、他のスレ
ッドをさらに遅延させることがないように、この検証動
作の後にキャッシュ・ロック215は放棄される。
を返すことに依存できる参照エンジンを使用するには、
本発明による下記の方法を使用する。参照エンジン・テ
ーブル217中の項目の参照が失敗した(すなわち、合
致するキーを有する要素が見つからず、したがって、明
らかに「キャッシュ・ミス」が発生していることをテー
ブルが示す)場合、相互排他キャッシュ・ロック215
を得てその項目に対する第2の参照を実行し、その項目
が実際にキャッシュ中にないことを検証しなければなら
ない。キャッシュ・ロック215を得ることによって、
他のスレッドがキャッシュ・エントリを削除し、あるい
はキャッシュ・エントリに項目を挿入することが防止さ
れることを想起されたい。スレッドが参照エンジンを更
新するときにはいつでも、最初にキャッシュ・ロック2
15を得るので、参照エンジンの挿入および削除も防止
され、それによって、参照エンジン・テーブル217は
確実に、この検証動作に対する正確な出力を生成する。
探索中の要素が実際に参照エンジン・テーブル217に
あることが判明した場合、新たに得たエントリ番号22
1を使用して所望のキャッシュ項目を見つけることがで
きる。探索中の要素が参照エンジン・テーブル217に
あることが判明するかどうかにはかかわらず、他のスレ
ッドをさらに遅延させることがないように、この検証動
作の後にキャッシュ・ロック215は放棄される。
【0041】同様に、参照エンジン・テーブル217中
の項目の参照が成功した(すなわち、キー/エントリ番
号が見つかり、したがって明らかに「キャッシュ・ヒッ
トが発生していることが報告された)場合、指し示され
たキャッシュ項目のIDを検証する必要がある。本発明
の一態様によれば、キャッシュ全体を探すのではなく、
指し示されたキャッシュ項目のエントリ・ロック207
のみが得られる。このため、指し示されたキャッシュ・
エントリに配置されたキー203は削除されず、あるい
はその他の方法で変更されることもない。エントリ・ロ
ック207を得た後、入力キー219をキー203と比
較して、探索中のキャッシュ項目が実際に見つかったこ
とを検証することができる。
の項目の参照が成功した(すなわち、キー/エントリ番
号が見つかり、したがって明らかに「キャッシュ・ヒッ
トが発生していることが報告された)場合、指し示され
たキャッシュ項目のIDを検証する必要がある。本発明
の一態様によれば、キャッシュ全体を探すのではなく、
指し示されたキャッシュ項目のエントリ・ロック207
のみが得られる。このため、指し示されたキャッシュ・
エントリに配置されたキー203は削除されず、あるい
はその他の方法で変更されることもない。エントリ・ロ
ック207を得た後、入力キー219をキー203と比
較して、探索中のキャッシュ項目が実際に見つかったこ
とを検証することができる。
【0042】次に、本発明の他の態様について説明す
る。「キャッシュ・ミス」が発生すると多くの場合、こ
の報告を受け取ったスレッドは、メイン・メモリやディ
スク記憶装置など他の情報源から探索中の情報を得る余
分の処置をとる。スレッドは、情報を得た後、この情報
を次回により迅速に検索できるようにキャッシュに記憶
する処置をとる。キャッシュに項目を記憶するには、相
互排他キャッシュ・ロック215を得る必要があるの
で、本発明は好ましくは、キャッシュ参照機能が、キャ
ッシュ・ミスが実際に発生したと判定した後、キー20
3のみを使用可能なエントリに書き込み、このエントリ
を「ビジー」とマーク付けし、キー203をロックレス
参照エンジン217に挿入することによってキャッシュ
・エントリを予約する機能を含む。このエントリ用のエ
ントリ・ロック207も得られ、次いで、このエントリ
を指すポインタが、「新しいキャッシュ項目」を示すリ
ターン・コードと共に呼び出し側スレッドに返される。
ユーザ・スレッドは次いで、代替情報源から情報を得
て、次いで、キャッシュ・ロック215を得るのを待つ
必要なしにキャッシュ・エントリにこの情報を記憶する
ことができる。別法として、ユーザ・スレッドは、探索
中の情報を代替情報源から得なくてもよい。その場合、
ユーザ・スレッドは、新たに作成したキャッシュ・エン
トリをエントリ・テーブル201から削除すべきであ
る。キャッシュ・エントリの削除については下記で詳し
く説明する。
る。「キャッシュ・ミス」が発生すると多くの場合、こ
の報告を受け取ったスレッドは、メイン・メモリやディ
スク記憶装置など他の情報源から探索中の情報を得る余
分の処置をとる。スレッドは、情報を得た後、この情報
を次回により迅速に検索できるようにキャッシュに記憶
する処置をとる。キャッシュに項目を記憶するには、相
互排他キャッシュ・ロック215を得る必要があるの
で、本発明は好ましくは、キャッシュ参照機能が、キャ
ッシュ・ミスが実際に発生したと判定した後、キー20
3のみを使用可能なエントリに書き込み、このエントリ
を「ビジー」とマーク付けし、キー203をロックレス
参照エンジン217に挿入することによってキャッシュ
・エントリを予約する機能を含む。このエントリ用のエ
ントリ・ロック207も得られ、次いで、このエントリ
を指すポインタが、「新しいキャッシュ項目」を示すリ
ターン・コードと共に呼び出し側スレッドに返される。
ユーザ・スレッドは次いで、代替情報源から情報を得
て、次いで、キャッシュ・ロック215を得るのを待つ
必要なしにキャッシュ・エントリにこの情報を記憶する
ことができる。別法として、ユーザ・スレッドは、探索
中の情報を代替情報源から得なくてもよい。その場合、
ユーザ・スレッドは、新たに作成したキャッシュ・エン
トリをエントリ・テーブル201から削除すべきであ
る。キャッシュ・エントリの削除については下記で詳し
く説明する。
【0043】本発明の他の態様は、キャッシュ置換方式
に関する。そのような方式では、キャッシュが満杯であ
る場合にキャッシュからどのキャッシュ項目を削除すべ
きかを決定する条件が指定される。好ましい実施形態で
は、スレッドによって使用されていないキャッシュ項目
のみが置換の候補である。リファレンス・カウント21
1は、ある項目が現在、使用されているか、それとも使
用されていないかを示すために使用される。リファレン
ス・カウント211が零である場合、その項目は使用さ
れておらず、非零リファレンス・カウント211は、そ
のキャッシュ項目が使用中であることを意味する。
に関する。そのような方式では、キャッシュが満杯であ
る場合にキャッシュからどのキャッシュ項目を削除すべ
きかを決定する条件が指定される。好ましい実施形態で
は、スレッドによって使用されていないキャッシュ項目
のみが置換の候補である。リファレンス・カウント21
1は、ある項目が現在、使用されているか、それとも使
用されていないかを示すために使用される。リファレン
ス・カウント211が零である場合、その項目は使用さ
れておらず、非零リファレンス・カウント211は、そ
のキャッシュ項目が使用中であることを意味する。
【0044】キャッシュ置換方式は、LRU方式の修正
バージョンである。基本的に、キャッシュ・エントリ・
テーブル201全体が論理的に、数組の16個のキャッ
シュ・エントリに分割される。各組は、使用可能なキャ
ッシュ・エントリが必要なときはいつでもラウンドロビ
ン方式でポーリングされる。キャッシュ項目は、リファ
レンス・カウント211が零に設定されることによっ
て、使用されていないことが示された場合に置換の候補
となる。1組の16個のキャッシュ・エントリのうちの
複数が現在使用されていない場合、最後のアクセス時間
209の値によって、最後に使用されたことが示された
キャッシュ・エントリが、置換すべきものとして選択さ
れる。ある組のあらゆるキャッシュ項目が使用されてい
る場合は、現在の組はスキップされ、次の組が調べられ
る。これは、受け入れられる置換候補が選択されるまで
継続する。使用可能な他のキャッシュ・エントリが必要
であるとき、次の1組の16個のキャッシュ項目に同じ
方式を適用することによって次の候補が選択される。修
正LRUキャッシュ置換方式によって、普通なら、従来
型のLRU技法によってキャッシュ項目を順序付けする
のに必要とされる、キャッシュに対するある種のロック
を得ることが不要になる。ロックを保持せずにLRU順
序を決定することにより、修正LRU方式によって選択
されたエントリを、その選択時とロック時との間に他の
スレッドによって使用することが可能になる(ただし、
こうする可能性は低い)。しかし、好ましい実施形態で
は、絶対的なLRU順序付けは必要とされない。LRU
順序に近ければ十分である。
バージョンである。基本的に、キャッシュ・エントリ・
テーブル201全体が論理的に、数組の16個のキャッ
シュ・エントリに分割される。各組は、使用可能なキャ
ッシュ・エントリが必要なときはいつでもラウンドロビ
ン方式でポーリングされる。キャッシュ項目は、リファ
レンス・カウント211が零に設定されることによっ
て、使用されていないことが示された場合に置換の候補
となる。1組の16個のキャッシュ・エントリのうちの
複数が現在使用されていない場合、最後のアクセス時間
209の値によって、最後に使用されたことが示された
キャッシュ・エントリが、置換すべきものとして選択さ
れる。ある組のあらゆるキャッシュ項目が使用されてい
る場合は、現在の組はスキップされ、次の組が調べられ
る。これは、受け入れられる置換候補が選択されるまで
継続する。使用可能な他のキャッシュ・エントリが必要
であるとき、次の1組の16個のキャッシュ項目に同じ
方式を適用することによって次の候補が選択される。修
正LRUキャッシュ置換方式によって、普通なら、従来
型のLRU技法によってキャッシュ項目を順序付けする
のに必要とされる、キャッシュに対するある種のロック
を得ることが不要になる。ロックを保持せずにLRU順
序を決定することにより、修正LRU方式によって選択
されたエントリを、その選択時とロック時との間に他の
スレッドによって使用することが可能になる(ただし、
こうする可能性は低い)。しかし、好ましい実施形態で
は、絶対的なLRU順序付けは必要とされない。LRU
順序に近ければ十分である。
【0045】本発明の他の態様では、キャッシュ127
は、挿入または削除の結果としてキャッシュ・エントリ
をキャッシュから破棄するときはいつでもそのエントリ
の内容を他の記憶媒体に直接書き込み直すコールバック
機能を含む。コールバック・ルーチンによって実行され
る特定のステップは、アプリケーションに特有のもので
ある。名前キャッシュの場合、コールバック機能は何も
行わない。バッファ・キャッシュの場合、再使用される
バッファの内容をディスクに書き込んでおかなければ、
バッファを再使用することはできない。挿入または削除
を実行しているスレッドは、コールバック情報225か
らコールバック・ルーチンのアドレスを得る。コールバ
ック・ルーチンのアドレスは、キャッシュ・エントリ・
テーブル201を作成したスレッド(下記では「作成者
スレッド」と呼ぶ)によってコールバック情報225内
に置かれる。このため、作成者スレッドは、キャッシュ
・エントリが置き換えられるときに常にとるべき処置を
指定することができる。
は、挿入または削除の結果としてキャッシュ・エントリ
をキャッシュから破棄するときはいつでもそのエントリ
の内容を他の記憶媒体に直接書き込み直すコールバック
機能を含む。コールバック・ルーチンによって実行され
る特定のステップは、アプリケーションに特有のもので
ある。名前キャッシュの場合、コールバック機能は何も
行わない。バッファ・キャッシュの場合、再使用される
バッファの内容をディスクに書き込んでおかなければ、
バッファを再使用することはできない。挿入または削除
を実行しているスレッドは、コールバック情報225か
らコールバック・ルーチンのアドレスを得る。コールバ
ック・ルーチンのアドレスは、キャッシュ・エントリ・
テーブル201を作成したスレッド(下記では「作成者
スレッド」と呼ぶ)によってコールバック情報225内
に置かれる。このため、作成者スレッドは、キャッシュ
・エントリが置き換えられるときに常にとるべき処置を
指定することができる。
【0046】次に、キャッシュ制御装置(たとえば、キ
ャッシュ制御プログラム125を実行するCPU10
5)の一実施形態を図4ないし11に関して説明する。
下記の説明は様々な値に言及しているが、これは単に都
合上のものであり、下記のプロセスが実際には、例示的
なコンピュータ・システムの動作を制御する制御信号を
生成する手段の一実施形態を説明するものであることを
理解されたい。当業者なら、下記の例が本発明の一実施
形態を例示するものに過ぎず、例示的な実施形態を修正
することができ、しかも本開示に記載したすべての要件
が満たされることが認識されよう。
ャッシュ制御プログラム125を実行するCPU10
5)の一実施形態を図4ないし11に関して説明する。
下記の説明は様々な値に言及しているが、これは単に都
合上のものであり、下記のプロセスが実際には、例示的
なコンピュータ・システムの動作を制御する制御信号を
生成する手段の一実施形態を説明するものであることを
理解されたい。当業者なら、下記の例が本発明の一実施
形態を例示するものに過ぎず、例示的な実施形態を修正
することができ、しかも本開示に記載したすべての要件
が満たされることが認識されよう。
【0047】キャッシュへのアクセスは、Get_Ca
che_EntryおよびDelete_Cache_
Entryの2つのルーチンにより、ユーザ・スレッド
によって行われる。
che_EntryおよびDelete_Cache_
Entryの2つのルーチンにより、ユーザ・スレッド
によって行われる。
【0048】まず、Get_Cache_Entryル
ーチンでは、このルーチンのユーザがこのルーチンにキ
ーを供給する。これに応答して、Get_Cache_
Entryルーチンは、合致するキーを有するキャッシ
ュ項目を含むエントリ・テーブル201中のキャッシュ
・エントリを見つけロックする。次いで、キャッシュ・
エントリのリファレンス・カウント211が1だけ増分
される。次いで、エントリ・テーブル201中のこのエ
ントリを指すポインタがユーザに供給される。そのよう
なキャッシュ項目がまだキャッシュ127に記憶されて
いない場合、Get_Cache_Entryルーチン
は、新たに得たキャッシュ・エントリにキー203を追
加し、キャッシュ・エントリを「ビジー」としてセット
し、それをロックし(キャッシュ全体ではなく、そのエ
ントリのみである)、ロックしたエントリを指すポイン
タを返す。これによって、他のスレッドが、同じ名前を
有する他のエントリをエントリ・テーブル201に追加
するのが防止され、Get_Cache_Entryを
呼び出したスレッドは、他の情報源から関連する情報を
得て、次いでこの情報を値205として記憶することが
できる。別法として、ユーザは、他のスレッドがこの情
報を挿入する機会を有するように、新たに作成されたキ
ャッシュ・エントリを削除する以外何も行わなくてもよ
い。
ーチンでは、このルーチンのユーザがこのルーチンにキ
ーを供給する。これに応答して、Get_Cache_
Entryルーチンは、合致するキーを有するキャッシ
ュ項目を含むエントリ・テーブル201中のキャッシュ
・エントリを見つけロックする。次いで、キャッシュ・
エントリのリファレンス・カウント211が1だけ増分
される。次いで、エントリ・テーブル201中のこのエ
ントリを指すポインタがユーザに供給される。そのよう
なキャッシュ項目がまだキャッシュ127に記憶されて
いない場合、Get_Cache_Entryルーチン
は、新たに得たキャッシュ・エントリにキー203を追
加し、キャッシュ・エントリを「ビジー」としてセット
し、それをロックし(キャッシュ全体ではなく、そのエ
ントリのみである)、ロックしたエントリを指すポイン
タを返す。これによって、他のスレッドが、同じ名前を
有する他のエントリをエントリ・テーブル201に追加
するのが防止され、Get_Cache_Entryを
呼び出したスレッドは、他の情報源から関連する情報を
得て、次いでこの情報を値205として記憶することが
できる。別法として、ユーザは、他のスレッドがこの情
報を挿入する機会を有するように、新たに作成されたキ
ャッシュ・エントリを削除する以外何も行わなくてもよ
い。
【0049】次に、図4を参照すると、Get_Cac
he_Entryルーチン400のフローチャートが示
されている。このルーチンの概要は下記のとおりであ
る。エントリ・テーブル201において要求されたエン
トリを見つけることが試みられる(ステップ401での
「Find_Cache_Entry」のサブルーチン
呼出し)。このエントリが見つかった場合(ステップ4
03でキャッシュ・ヒット=「yes」)、キャッシュ
・クロック213が増分され(ステップ407)、この
項目の最後のアクセス時間209がキャッシュ・クロッ
ク213の値に等しい値に設定される(ステップ40
9)。最後に、Get_Cache_Entryルーチ
ン400を呼び出したスレッドに、このキャッシュ・エ
ントリを指すポインタが返される(ステップ411)。
he_Entryルーチン400のフローチャートが示
されている。このルーチンの概要は下記のとおりであ
る。エントリ・テーブル201において要求されたエン
トリを見つけることが試みられる(ステップ401での
「Find_Cache_Entry」のサブルーチン
呼出し)。このエントリが見つかった場合(ステップ4
03でキャッシュ・ヒット=「yes」)、キャッシュ
・クロック213が増分され(ステップ407)、この
項目の最後のアクセス時間209がキャッシュ・クロッ
ク213の値に等しい値に設定される(ステップ40
9)。最後に、Get_Cache_Entryルーチ
ン400を呼び出したスレッドに、このキャッシュ・エ
ントリを指すポインタが返される(ステップ411)。
【0050】あるいは、要求されたエントリを見つける
最初の試みが失敗した場合(ステップ403で、キャッ
シュ・ヒット=「no」)は、新たに得られたキャッシ
ュ・エントリにキーを挿入し、このエントリをビジーと
してマーク付けし、このエントリに対するロックを得る
ことが試みられる(ステップ405での「Insert
_Cache_Item」のサブルーチン呼出し)。前
の文で「試み」の語を使用した理由は、Find_Ca
che_Entryルーチン(ステップ401)が、要
求された項目が見つからないことを報告した後に、その
項目がキャッシュ127に挿入された可能性があるから
である。こうなると、Insert_Cache_It
emルーチン405は新しい項目を挿入せず、その代わ
りに、合致するキーを有する前に挿入されたエントリを
指すポインタを得る。この項目はロックされ、ビジーと
してマーク付けされる。
最初の試みが失敗した場合(ステップ403で、キャッ
シュ・ヒット=「no」)は、新たに得られたキャッシ
ュ・エントリにキーを挿入し、このエントリをビジーと
してマーク付けし、このエントリに対するロックを得る
ことが試みられる(ステップ405での「Insert
_Cache_Item」のサブルーチン呼出し)。前
の文で「試み」の語を使用した理由は、Find_Ca
che_Entryルーチン(ステップ401)が、要
求された項目が見つからないことを報告した後に、その
項目がキャッシュ127に挿入された可能性があるから
である。こうなると、Insert_Cache_It
emルーチン405は新しい項目を挿入せず、その代わ
りに、合致するキーを有する前に挿入されたエントリを
指すポインタを得る。この項目はロックされ、ビジーと
してマーク付けされる。
【0051】次に、図5を参照すると、Find_Ca
che_Entryルーチン401のフローチャートが
示されている。このルーチンは、ユーザのキーに関連付
けられたエントリ番号を得るためにロックレス参照ハッ
シュ・テーブルにアクセスすることによって開始する。
要素が見つからなかったことを示すものをハッシュ・テ
ーブルが返した場合(ステップ503で、キャッシュ・
ヒット=「no」)、Find_Cache_Entr
yルーチン401が、「not found」を示すリ
ターン・コードと共にGet_Cache_Entry
ルーチン400に戻る。
che_Entryルーチン401のフローチャートが
示されている。このルーチンは、ユーザのキーに関連付
けられたエントリ番号を得るためにロックレス参照ハッ
シュ・テーブルにアクセスすることによって開始する。
要素が見つからなかったことを示すものをハッシュ・テ
ーブルが返した場合(ステップ503で、キャッシュ・
ヒット=「no」)、Find_Cache_Entr
yルーチン401が、「not found」を示すリ
ターン・コードと共にGet_Cache_Entry
ルーチン400に戻る。
【0052】あるいは、ハッシュ・テーブルが実際にエ
ントリ番号を返した場合(ステップ503で、キャッシ
ュ・ヒット=「yes」)は、下記のステップを実行し
てこの「ヒント」が正確であることを確認しなければな
らない。まず、このエントリ(すなわち、エントリ番号
によって指し示されたエントリ)に対するエントリ・ロ
ック207が得られる。この場合、他のスレッドがこの
エントリ・ロックを解除するのを待つ必要があることに
留意されたい。
ントリ番号を返した場合(ステップ503で、キャッシ
ュ・ヒット=「yes」)は、下記のステップを実行し
てこの「ヒント」が正確であることを確認しなければな
らない。まず、このエントリ(すなわち、エントリ番号
によって指し示されたエントリ)に対するエントリ・ロ
ック207が得られる。この場合、他のスレッドがこの
エントリ・ロックを解除するのを待つ必要があることに
留意されたい。
【0053】エントリ・ロック207が得られていると
き、Find_Cache_Entryルーチン401
では、そのエントリに現在記憶されているキー203は
変更されない。したがって、このルーチンは続いて、こ
のキー203を読み取り、要求された項目のキーと比較
し、それらが合致することを検証することができる(ス
テップ509)。合致が見つかった場合(ステップ51
1で、名前が合致したか=「yes」)、このエントリ
のリファレンス・カウント211が増分され、このエン
トリが「ビジー」としてマーク付けされ(ステップ51
3)、このキャッシュ・エントリを指すポインタがGe
t_Cache_Entryルーチン400に返される
(ステップ517)。このキャッシュ・エントリに対す
るエントリ・ロック207が保持されることに留意され
たい。
き、Find_Cache_Entryルーチン401
では、そのエントリに現在記憶されているキー203は
変更されない。したがって、このルーチンは続いて、こ
のキー203を読み取り、要求された項目のキーと比較
し、それらが合致することを検証することができる(ス
テップ509)。合致が見つかった場合(ステップ51
1で、名前が合致したか=「yes」)、このエントリ
のリファレンス・カウント211が増分され、このエン
トリが「ビジー」としてマーク付けされ(ステップ51
3)、このキャッシュ・エントリを指すポインタがGe
t_Cache_Entryルーチン400に返される
(ステップ517)。このキャッシュ・エントリに対す
るエントリ・ロック207が保持されることに留意され
たい。
【0054】あるいは、このエントリに記憶されている
キー203が、要求された項目のキーに合致しない場合
(ステップ511で、キーが合致したか=「no」)
は、ロックレス参照ハッシュ・テーブルから返された
「ヒント」は誤っている可能性が高い。しかし、ロック
レス参照ハッシュ・テーブルでは、参照動作を実行する
うえでロックが得られない場合でも、すでに記憶されて
いるエントリ番号しか返されないので、Find_Ca
che_Entryルーチン401が、エントリ・テー
ブル201の範囲外のメモリ位置にアクセスする恐れが
ないことに留意されたい。見つかったエントリのキー2
03が、要求された項目のキーに合致しないと判定され
た後、このエントリに対するエントリ・ロック207が
解除され(ステップ515)、プロセスは、ステップ5
01から繰り返される。
キー203が、要求された項目のキーに合致しない場合
(ステップ511で、キーが合致したか=「no」)
は、ロックレス参照ハッシュ・テーブルから返された
「ヒント」は誤っている可能性が高い。しかし、ロック
レス参照ハッシュ・テーブルでは、参照動作を実行する
うえでロックが得られない場合でも、すでに記憶されて
いるエントリ番号しか返されないので、Find_Ca
che_Entryルーチン401が、エントリ・テー
ブル201の範囲外のメモリ位置にアクセスする恐れが
ないことに留意されたい。見つかったエントリのキー2
03が、要求された項目のキーに合致しないと判定され
た後、このエントリに対するエントリ・ロック207が
解除され(ステップ515)、プロセスは、ステップ5
01から繰り返される。
【0055】次に、図6を参照すると、Insert_
Cache_Itemルーチン405が示されている。
このルーチンは、Get_Next_Availabl
e_Entryと呼ばれるサブルーチンを呼び出すこと
によって開始し(ステップ601)、前述の修正LRU
方式によって使用可能なキャッシュ・エントリ(「キャ
ッシュ・エントリN」と呼ぶ)を見つけ、そのエントリ
を指すポインタを返す。キャッシュ・エントリNに対す
るエントリ・ロック207は得られており、その基準カ
ウンタ211が「ビジー」を示すように増分される。
Cache_Itemルーチン405が示されている。
このルーチンは、Get_Next_Availabl
e_Entryと呼ばれるサブルーチンを呼び出すこと
によって開始し(ステップ601)、前述の修正LRU
方式によって使用可能なキャッシュ・エントリ(「キャ
ッシュ・エントリN」と呼ぶ)を見つけ、そのエントリ
を指すポインタを返す。キャッシュ・エントリNに対す
るエントリ・ロック207は得られており、その基準カ
ウンタ211が「ビジー」を示すように増分される。
【0056】次に、キャッシュ・ロック215が得ら
れ、他のキャッシュ挿入動作やキャッシュ削除動作が拒
否される(ステップ603)。キャッシュ・ロック21
5が得られた後、Reclaim_Cache_Ent
ryと呼ばれるサブルーチンが呼び出される(ステップ
605)。Reclaim_Cache_Entryル
ーチン605の入力パラメータは、キャッシュ・エント
リNを指すポインタである。Reclaim_Cach
e_Entryルーチン605は、キャッシュ・エント
リNの古いキーのコピーをロックレス参照ハッシュ・テ
ーブルから削除し、次いで、キャッシュ・エントリNの
最後のアクセス時間209を(それが空きキャッシュ・
エントリであることを示す)零に等しい値に設定する。
れ、他のキャッシュ挿入動作やキャッシュ削除動作が拒
否される(ステップ603)。キャッシュ・ロック21
5が得られた後、Reclaim_Cache_Ent
ryと呼ばれるサブルーチンが呼び出される(ステップ
605)。Reclaim_Cache_Entryル
ーチン605の入力パラメータは、キャッシュ・エント
リNを指すポインタである。Reclaim_Cach
e_Entryルーチン605は、キャッシュ・エント
リNの古いキーのコピーをロックレス参照ハッシュ・テ
ーブルから削除し、次いで、キャッシュ・エントリNの
最後のアクセス時間209を(それが空きキャッシュ・
エントリであることを示す)零に等しい値に設定する。
【0057】これらの動作が完了すると、Insert
_Cache_Entryと呼ばれるサブルーチンを呼
び出すことによって、キャッシュ・エントリ・テーブル
201に記憶すべき項目のキーがロックレス参照ハッシ
ュ・テーブル217に挿入される(ステップ607)。
このサブルーチンは、合致するキーがまだロックレス参
照ハッシュ・テーブル内に含まれていないことを確認す
る検査を含む。したがって、Insert_Cache
_Entry607がInsert_Cache_It
em405に戻ると、リターン・コードが検査され(ス
テップ609)、キャッシュ・エントリNのキーがロッ
クレス参照ハッシュ・テーブル217の新しい要素とし
て首尾良く挿入されたかどうかが調べられる。挿入が成
功した場合、他の挿入動作または削除動作を実行できる
ようにキャッシュ・ロック215が解除される(ステッ
プ611)。これに続いて、新たに作成されたキャッシ
ュ・エントリ(すなわち、キャッシュ・エントリN)が
Get_Cache_Entryルーチン400に返さ
れる(ステップ613)。キャッシュ・エントリNはま
だロックされ「ビジー」としてマーク付けされている。
さらに、このサブルーチンからのリターン・コードは、
これが新しいキャッシュ・エントリを指すポインタであ
ることをGet_Cache_Entryルーチン40
0に知らせる。呼出し側スレッドは、この情報を使用し
て、関連する値205を他の情報源から得てこのキャッ
シュ・エントリに書き込む必要があるかどうかを判定す
る。
_Cache_Entryと呼ばれるサブルーチンを呼
び出すことによって、キャッシュ・エントリ・テーブル
201に記憶すべき項目のキーがロックレス参照ハッシ
ュ・テーブル217に挿入される(ステップ607)。
このサブルーチンは、合致するキーがまだロックレス参
照ハッシュ・テーブル内に含まれていないことを確認す
る検査を含む。したがって、Insert_Cache
_Entry607がInsert_Cache_It
em405に戻ると、リターン・コードが検査され(ス
テップ609)、キャッシュ・エントリNのキーがロッ
クレス参照ハッシュ・テーブル217の新しい要素とし
て首尾良く挿入されたかどうかが調べられる。挿入が成
功した場合、他の挿入動作または削除動作を実行できる
ようにキャッシュ・ロック215が解除される(ステッ
プ611)。これに続いて、新たに作成されたキャッシ
ュ・エントリ(すなわち、キャッシュ・エントリN)が
Get_Cache_Entryルーチン400に返さ
れる(ステップ613)。キャッシュ・エントリNはま
だロックされ「ビジー」としてマーク付けされている。
さらに、このサブルーチンからのリターン・コードは、
これが新しいキャッシュ・エントリを指すポインタであ
ることをGet_Cache_Entryルーチン40
0に知らせる。呼出し側スレッドは、この情報を使用し
て、関連する値205を他の情報源から得てこのキャッ
シュ・エントリに書き込む必要があるかどうかを判定す
る。
【0058】キャッシュ・エントリNのキーと同じキー
を有する他のキャッシュ・エントリ(キャッシュ・エン
トリFと呼ぶ)のキーがすでにロックレス参照ハッシュ
・テーブル217に記憶されていることをロックレス参
照ハッシュ・テーブル217が報告した場合(ステップ
609で、挿入は成功したか=「no」)、他の挿入動
作または削除動作を実行することができるようにキャッ
シュ・ロック215が解除される(ステップ615)。
この点で、他のスレッドがキャッシュ127中の項目を
変更し削除する可能性があり、したがって、キャッシュ
・エントリFを指すポインタはもはや、そのキー203
がキャッシュ・エントリ・テーブル201に記憶すべき
項目のキーに合致している項目を確実に示しているわけ
ではない(すなわち、ロックレス参照ハッシュ・テーブ
ルから得たポインタは現在、「ヒント」になってい
る)。この「ヒント」が誤りであるかどうかを判定する
ために、キャッシュ・エントリに対するエントリ・ロッ
ク207が得られ(ステップ617)、要求された項目
のキーがキャッシュ・エントリFのキーと比較される
(ステップ619)。キーが合致する場合(ステップ6
21で、キーが合致したか=「yes」)、ロックレス
参照ハッシュ・テーブル217によって報告された「ヒ
ント」は正確であり、要求された項目は実際に、すでに
キャッシュ・エントリ・テーブル201に記憶されてい
る。したがって、キャッシュ・エントリFのリファレン
ス・カウント211が増分され、この項目が「ビジー」
であることが示され(ステップ623)、前に得たキャ
ッシュ・エントリNのエントリ・ロック207が解除さ
れ、キャッシュ・エントリNがこの時点では使用されな
いためにキャッシュ・エントリNのリファレンス・カウ
ント211が減分される(ステップ625)。その代わ
り、キャッシュ・エントリFを指すポインタが、これが
すでに存在しているキャッシュ・エントリであることの
報告と共に、Get_Cache_Entryルーチン
400に返される。この情報は、値205を他の情報源
から得てキャッシュ・エントリに記憶する必要があるか
否かを決定するので、呼出し側スレッドが知る情報とし
て重要である。
を有する他のキャッシュ・エントリ(キャッシュ・エン
トリFと呼ぶ)のキーがすでにロックレス参照ハッシュ
・テーブル217に記憶されていることをロックレス参
照ハッシュ・テーブル217が報告した場合(ステップ
609で、挿入は成功したか=「no」)、他の挿入動
作または削除動作を実行することができるようにキャッ
シュ・ロック215が解除される(ステップ615)。
この点で、他のスレッドがキャッシュ127中の項目を
変更し削除する可能性があり、したがって、キャッシュ
・エントリFを指すポインタはもはや、そのキー203
がキャッシュ・エントリ・テーブル201に記憶すべき
項目のキーに合致している項目を確実に示しているわけ
ではない(すなわち、ロックレス参照ハッシュ・テーブ
ルから得たポインタは現在、「ヒント」になってい
る)。この「ヒント」が誤りであるかどうかを判定する
ために、キャッシュ・エントリに対するエントリ・ロッ
ク207が得られ(ステップ617)、要求された項目
のキーがキャッシュ・エントリFのキーと比較される
(ステップ619)。キーが合致する場合(ステップ6
21で、キーが合致したか=「yes」)、ロックレス
参照ハッシュ・テーブル217によって報告された「ヒ
ント」は正確であり、要求された項目は実際に、すでに
キャッシュ・エントリ・テーブル201に記憶されてい
る。したがって、キャッシュ・エントリFのリファレン
ス・カウント211が増分され、この項目が「ビジー」
であることが示され(ステップ623)、前に得たキャ
ッシュ・エントリNのエントリ・ロック207が解除さ
れ、キャッシュ・エントリNがこの時点では使用されな
いためにキャッシュ・エントリNのリファレンス・カウ
ント211が減分される(ステップ625)。その代わ
り、キャッシュ・エントリFを指すポインタが、これが
すでに存在しているキャッシュ・エントリであることの
報告と共に、Get_Cache_Entryルーチン
400に返される。この情報は、値205を他の情報源
から得てキャッシュ・エントリに記憶する必要があるか
否かを決定するので、呼出し側スレッドが知る情報とし
て重要である。
【0059】あるいは、要求された項目のキーとキャッ
シュ・エントリFのキーとの比較によって、キーが合致
しないと判定された場合(ステップ621で、キーが合
致したか=「no」)、ロックレス参照ハッシュ・テー
ブル217によって報告された「ヒント」は不正確であ
り、キャッシュ・エントリFに対するエントリ・ロック
207が解除される。次いで、プロセスがステップ60
3から繰り返され、キャッシュ・エントリNをロックレ
ス参照ハッシュ・テーブル217に首尾良く挿入できる
かどうかが再び判定される。最後に、ループはステップ
613とステップ627のどちらかで終了する。
シュ・エントリFのキーとの比較によって、キーが合致
しないと判定された場合(ステップ621で、キーが合
致したか=「no」)、ロックレス参照ハッシュ・テー
ブル217によって報告された「ヒント」は不正確であ
り、キャッシュ・エントリFに対するエントリ・ロック
207が解除される。次いで、プロセスがステップ60
3から繰り返され、キャッシュ・エントリNをロックレ
ス参照ハッシュ・テーブル217に首尾良く挿入できる
かどうかが再び判定される。最後に、ループはステップ
613とステップ627のどちらかで終了する。
【0060】次に、Get_Next_Availab
le_Entryルーチン601を図7に関連して詳し
く説明する。このルーチンは、Find_Cache_
Entry_LRUのサブルーチン呼出しを行うことに
よって開始する(ステップ701)。このサブルーチン
は、ビジーではないとみなされ、したがってInser
t_Cache_Itemルーチン405によって挿入
すべき新しいキャッシュ項目として使用できるキャッシ
ュ・エントリ(キャッシュ・エントリNと呼ぶ)を指す
ポインタを返す。しかし、この判定を下すためにロック
は使用されないので、キャッシュ・エントリNの状況が
「非ビジー」であることは確実ではない。したがって、
この状況を検証しなければならない。まず、キャッシュ
・エントリNに対するエントリ・ロック207を得るこ
とが試みられる(ステップ703)。この試みが成功す
るのは、キャッシュ・エントリNがまだロックされてい
ない場合だけである。
le_Entryルーチン601を図7に関連して詳し
く説明する。このルーチンは、Find_Cache_
Entry_LRUのサブルーチン呼出しを行うことに
よって開始する(ステップ701)。このサブルーチン
は、ビジーではないとみなされ、したがってInser
t_Cache_Itemルーチン405によって挿入
すべき新しいキャッシュ項目として使用できるキャッシ
ュ・エントリ(キャッシュ・エントリNと呼ぶ)を指す
ポインタを返す。しかし、この判定を下すためにロック
は使用されないので、キャッシュ・エントリNの状況が
「非ビジー」であることは確実ではない。したがって、
この状況を検証しなければならない。まず、キャッシュ
・エントリNに対するエントリ・ロック207を得るこ
とが試みられる(ステップ703)。この試みが成功す
るのは、キャッシュ・エントリNがまだロックされてい
ない場合だけである。
【0061】キャッシュ・エントリNをロックする試み
が成功しなかった場合(ステップ705で、ロックが成
功したか=「no」)、キャッシュ・エントリNを使用
することはできず、他のキャッシュ・エントリを見つけ
るべきである。これは通常、すでにロックされているエ
ントリに対するロックを得るのを待つよりも、ロックさ
れていないキャッシュ・エントリを見つける方が速いか
らである。他のキャッシュ・エントリを見つけるには、
ステップ701からループを再開する。
が成功しなかった場合(ステップ705で、ロックが成
功したか=「no」)、キャッシュ・エントリNを使用
することはできず、他のキャッシュ・エントリを見つけ
るべきである。これは通常、すでにロックされているエ
ントリに対するロックを得るのを待つよりも、ロックさ
れていないキャッシュ・エントリを見つける方が速いか
らである。他のキャッシュ・エントリを見つけるには、
ステップ701からループを再開する。
【0062】しかし、キャッシュ・エントリNをロック
する試みが成功した場合(ステップ705で、ロックが
成功したか=「yes」)、キャッシュ・エントリNの
リファレンス・カウント211が試験され、キャッシュ
・エントリNがビジーであるかどうかが調べられる。こ
れを行うのは、前のスレッドがキャッシュ・エントリN
を「得て」、それに続いてリファレンス・カウント21
1を減分せずにエントリ・ロック207を解除した可能
性があるからである。これは、キャッシュ・エントリN
を他のスレッドによって削除することも、あるいは再使
用することもできないようにするために行われる。
する試みが成功した場合(ステップ705で、ロックが
成功したか=「yes」)、キャッシュ・エントリNの
リファレンス・カウント211が試験され、キャッシュ
・エントリNがビジーであるかどうかが調べられる。こ
れを行うのは、前のスレッドがキャッシュ・エントリN
を「得て」、それに続いてリファレンス・カウント21
1を減分せずにエントリ・ロック207を解除した可能
性があるからである。これは、キャッシュ・エントリN
を他のスレッドによって削除することも、あるいは再使
用することもできないようにするために行われる。
【0063】リファレンス・カウント211が零に等し
くない場合(ステップ707で、キャッシュ・エントリ
Nはビジーか=「yes」)、キャッシュ・エントリN
を使用することはできず、他のキャッシュ・エントリを
見つけなければならない。これは、キャッシュ・エント
リNに対するエントリ・ロック207を解除し、次いで
ステップ701からループを再開することによって行わ
れる。
くない場合(ステップ707で、キャッシュ・エントリ
Nはビジーか=「yes」)、キャッシュ・エントリN
を使用することはできず、他のキャッシュ・エントリを
見つけなければならない。これは、キャッシュ・エント
リNに対するエントリ・ロック207を解除し、次いで
ステップ701からループを再開することによって行わ
れる。
【0064】しかし、リファレンス・カウント211が
零に等しい場合(ステップ707で、キャッシュ・エン
トリNはビジーであるか=「no」)、キャッシュ・エ
ントリNは、使用されていないキャッシュ・エントリと
して使用することができる。したがって、キャッシュ・
エントリNのリファレンス・カウント211が(このエ
ントリが「ビジー」であることを示すために)増分され
る(ステップ711)。最後のアクセス時間209が零
よりも大きいことによって、キャッシュ・エントリNが
キャッシュ項目を含むことが示されている場合(ステッ
プ713で、キャッシュ・エントリNはキャッシュ項目
を含むか=「yes」)、すでにキャッシュ・エントリ
Nに記憶されている項目が「フラッシュ」され、すなわ
ち、エントリ・テーブル201からキャッシュ項目の内
容が削除される前にキャッシュ項目の内容のクリーンナ
ップまたはメイン位置への書き直し、あるいはその両方
を実行するために、コールバック情報225によって指
定されたコールバック・ルーチンが呼び出される(ステ
ップ715)。あるいは、キャッシュ・エントリNが使
用されたことがない場合(ステップ713で、キャッシ
ュ・エントリNはキャッシュ項目を含むか=「no」)
は、コールバック関数は呼び出されない。
零に等しい場合(ステップ707で、キャッシュ・エン
トリNはビジーであるか=「no」)、キャッシュ・エ
ントリNは、使用されていないキャッシュ・エントリと
して使用することができる。したがって、キャッシュ・
エントリNのリファレンス・カウント211が(このエ
ントリが「ビジー」であることを示すために)増分され
る(ステップ711)。最後のアクセス時間209が零
よりも大きいことによって、キャッシュ・エントリNが
キャッシュ項目を含むことが示されている場合(ステッ
プ713で、キャッシュ・エントリNはキャッシュ項目
を含むか=「yes」)、すでにキャッシュ・エントリ
Nに記憶されている項目が「フラッシュ」され、すなわ
ち、エントリ・テーブル201からキャッシュ項目の内
容が削除される前にキャッシュ項目の内容のクリーンナ
ップまたはメイン位置への書き直し、あるいはその両方
を実行するために、コールバック情報225によって指
定されたコールバック・ルーチンが呼び出される(ステ
ップ715)。あるいは、キャッシュ・エントリNが使
用されたことがない場合(ステップ713で、キャッシ
ュ・エントリNはキャッシュ項目を含むか=「no」)
は、コールバック関数は呼び出されない。
【0065】最後に、キャッシュ・エントリNを指すポ
インタがInsert_Cache_Itemルーチン
に返される(ステップ717)。この時点で、キャッシ
ュ・エントリNがロックされ「ビジー」とマーク付けさ
れることに留意されたい。
インタがInsert_Cache_Itemルーチン
に返される(ステップ717)。この時点で、キャッシ
ュ・エントリNがロックされ「ビジー」とマーク付けさ
れることに留意されたい。
【0066】次に、Find_Cache_Entry
_LRUルーチン701を図8に関連して説明する。こ
のルーチンは、キャッシュ・エントリ・テーブル201
が論理的に分割された数組の16個のキャッシュ・エン
トリのうちの1組を選択することによって開始する(ス
テップ801)。選択は好ましくは、ラウンド・ロビン
方式で行われる。
_LRUルーチン701を図8に関連して説明する。こ
のルーチンは、キャッシュ・エントリ・テーブル201
が論理的に分割された数組の16個のキャッシュ・エン
トリのうちの1組を選択することによって開始する(ス
テップ801)。選択は好ましくは、ラウンド・ロビン
方式で行われる。
【0067】次に、16個のキャッシュ・エントリのそ
れぞれの最後のアクセス時間が分析され、それによっ
て、キャッシュ・エントリのリストを、最初に使用され
たものから最後に使用されたものへ昇順に作成すること
ができる(ステップ803)。次いで、零よりも大きな
リファレンス・カウントを有するキャッシュ・エントリ
がリストから削除され(ステップ805)、非ビジーで
あるとみなされるキャッシュ・エントリのみが残る。キ
ャッシュ項目を変更するのを妨げるためのロックが得ら
れないので、このようなキャッシュ・エントリの実際の
状況を保証することはできない。リストが空である場合
(ステップ807からの「yes」経路)、この組のキ
ャッシュ・エントリは使用されない。キャッシュ・エン
トリを見つけるための別の試みは、ステップ801から
ループを繰り返すことによって行われる。
れぞれの最後のアクセス時間が分析され、それによっ
て、キャッシュ・エントリのリストを、最初に使用され
たものから最後に使用されたものへ昇順に作成すること
ができる(ステップ803)。次いで、零よりも大きな
リファレンス・カウントを有するキャッシュ・エントリ
がリストから削除され(ステップ805)、非ビジーで
あるとみなされるキャッシュ・エントリのみが残る。キ
ャッシュ項目を変更するのを妨げるためのロックが得ら
れないので、このようなキャッシュ・エントリの実際の
状況を保証することはできない。リストが空である場合
(ステップ807からの「yes」経路)、この組のキ
ャッシュ・エントリは使用されない。キャッシュ・エン
トリを見つけるための別の試みは、ステップ801から
ループを繰り返すことによって行われる。
【0068】しかし、リストが空ではない場合(ステッ
プ807からの「no」経路)、リスト中の第1のキャ
ッシュ・エントリを指すポインタがGet_Next_
Available_Entryルーチン601に返さ
れる(ステップ809)。これが、非ビジーであるとみ
なされるキャッシュ・エントリのうちで最初に使用され
たエントリである。
プ807からの「no」経路)、リスト中の第1のキャ
ッシュ・エントリを指すポインタがGet_Next_
Available_Entryルーチン601に返さ
れる(ステップ809)。これが、非ビジーであるとみ
なされるキャッシュ・エントリのうちで最初に使用され
たエントリである。
【0069】代替実施形態では、単にその組のキャッシ
ュ・エントリを走査し、それまでに出会ったうちで最も
小さな非ビジー・エントリを追跡することによって、前
述のようにリストを実際に構築することが回避される。
ュ・エントリを走査し、それまでに出会ったうちで最も
小さな非ビジー・エントリを追跡することによって、前
述のようにリストを実際に構築することが回避される。
【0070】次に、Reclaim_Cache_En
tryルーチン605を図9に関連して詳しく説明す
る。Reclaim_Cache_Entryルーチン
605の呼び出し側はキャッシュ・ロック215を得る
ことに責任を負い、そのため、実行すべき様々なキャッ
シュ・エントリおよびハッシュ・テーブル・エントリは
確実に正確な結果をもたらす。
tryルーチン605を図9に関連して詳しく説明す
る。Reclaim_Cache_Entryルーチン
605の呼び出し側はキャッシュ・ロック215を得る
ことに責任を負い、そのため、実行すべき様々なキャッ
シュ・エントリおよびハッシュ・テーブル・エントリは
確実に正確な結果をもたらす。
【0071】Reclaim_Cache_Entry
ルーチン605への入力は、キャッシュ・エントリを指
すポインタである。このルーチンは、最後のアクセス時
間209が零に設定されることによって、キャッシュ・
エントリがすでに空であることが示されているかどうか
を判定することによって開始する。キャッシュ・エント
リがすでに空である場合(ステップ901からの「ye
s」経路)、他には何も実行する必要がなく、ルーチン
は単にInsert_Cache_Itemルーチン4
05に戻る。前述のように、関連するキャッシュ項目が
スレッドによって得られるたびにリファレンス・カウン
トが増分される。キャッシュ・クロック213のカウン
ト値が最大クロック値から零に「ラップアラウンド」す
るときに誤って基準時間209を零に設定することを回
避するために、この値はただちに値「1」に設定され
る。次いで、キャッシュ・ロック215が得られ、非零
の最後のアクセス時間209を有するすべてのキャッシ
ュ・エントリの最後のアクセス時間209が「1」にリ
セットされる。これは、修正LRUキャッシュ置換方式
を一時的に妨害するものであるが、キャッシュ・エント
リの最後のアクセス時間209間の比較を容易にする利
点を有する。
ルーチン605への入力は、キャッシュ・エントリを指
すポインタである。このルーチンは、最後のアクセス時
間209が零に設定されることによって、キャッシュ・
エントリがすでに空であることが示されているかどうか
を判定することによって開始する。キャッシュ・エント
リがすでに空である場合(ステップ901からの「ye
s」経路)、他には何も実行する必要がなく、ルーチン
は単にInsert_Cache_Itemルーチン4
05に戻る。前述のように、関連するキャッシュ項目が
スレッドによって得られるたびにリファレンス・カウン
トが増分される。キャッシュ・クロック213のカウン
ト値が最大クロック値から零に「ラップアラウンド」す
るときに誤って基準時間209を零に設定することを回
避するために、この値はただちに値「1」に設定され
る。次いで、キャッシュ・ロック215が得られ、非零
の最後のアクセス時間209を有するすべてのキャッシ
ュ・エントリの最後のアクセス時間209が「1」にリ
セットされる。これは、修正LRUキャッシュ置換方式
を一時的に妨害するものであるが、キャッシュ・エント
リの最後のアクセス時間209間の比較を容易にする利
点を有する。
【0072】キャッシュ・エントリがまだ空ではない場
合(ステップ901の」no」経路)、キャッシュ項目
のキー203が得られ(ステップ903)、ロックレス
参照ハッシュ・テーブル削除動作への入力として使用さ
れる(ステップ905)。この目的は、ロックレス参照
ハッシュ・テーブル217からその要素を削除すること
である。
合(ステップ901の」no」経路)、キャッシュ項目
のキー203が得られ(ステップ903)、ロックレス
参照ハッシュ・テーブル削除動作への入力として使用さ
れる(ステップ905)。この目的は、ロックレス参照
ハッシュ・テーブル217からその要素を削除すること
である。
【0073】次に、キャッシュ・エントリの最後のアク
セス時間209が、このキャッシュ・エントリが空であ
ることのインディケータとして零に設定される(ステッ
プ907)。このルーチンは次いで、単にInsert
_Cache_Itemルーチン405に戻ることによ
って終了する(ステップ909)。
セス時間209が、このキャッシュ・エントリが空であ
ることのインディケータとして零に設定される(ステッ
プ907)。このルーチンは次いで、単にInsert
_Cache_Itemルーチン405に戻ることによ
って終了する(ステップ909)。
【0074】次に、Insert_Cache_Ent
ryルーチン607を図10に関連して詳しく説明す
る。呼出し側ルーチン(Insert_Cache_I
tem405)はすでにキャッシュ・ロック215を得
ており、そのため、ロックレス参照ハッシュ・テーブル
217へのアクセスが、単なる「ヒント」ではなく正確
な結果を返すことに留意されたい。Insert_Ca
che_Entryルーチン607は、ロックレス参照
ハッシュ・テーブル217に対する参照動作を実行し、
新しいキャッシュ項目のキー203のコピーがすでにハ
ッシュ・テーブル中にあり、それによって、挿入すべき
キャッシュ項目がすでにキャッシュ・エントリ・テーブ
ル201に記憶されていることが示されているかどうか
を判定することによって開始する(ステップ100
1)。キー203のコピーが見つかったと報告された場
合(ステップ1003でキャッシュ・ヒットか=「ye
s」)は、同じキーを有するキャッシュ項目をキャッシ
ュ・エントリ・テーブル201に挿入することはできな
い。したがって、Insert_Cache_Entr
yルーチン607は、動作が成功しなかったことを示す
リターン・コードと共に呼出し側ルーチンに戻る(ステ
ップ1005)。
ryルーチン607を図10に関連して詳しく説明す
る。呼出し側ルーチン(Insert_Cache_I
tem405)はすでにキャッシュ・ロック215を得
ており、そのため、ロックレス参照ハッシュ・テーブル
217へのアクセスが、単なる「ヒント」ではなく正確
な結果を返すことに留意されたい。Insert_Ca
che_Entryルーチン607は、ロックレス参照
ハッシュ・テーブル217に対する参照動作を実行し、
新しいキャッシュ項目のキー203のコピーがすでにハ
ッシュ・テーブル中にあり、それによって、挿入すべき
キャッシュ項目がすでにキャッシュ・エントリ・テーブ
ル201に記憶されていることが示されているかどうか
を判定することによって開始する(ステップ100
1)。キー203のコピーが見つかったと報告された場
合(ステップ1003でキャッシュ・ヒットか=「ye
s」)は、同じキーを有するキャッシュ項目をキャッシ
ュ・エントリ・テーブル201に挿入することはできな
い。したがって、Insert_Cache_Entr
yルーチン607は、動作が成功しなかったことを示す
リターン・コードと共に呼出し側ルーチンに戻る(ステ
ップ1005)。
【0075】しかし、キー203のコピーがロックレス
参照ハッシュ・テーブル217では見つからなかったと
報告された場合(ステップ1003でキャッシュ・ヒッ
トか=「no」)、キー219をハッシュ・テーブル中
のキーとして使用し、新しいキャッシュ・エントリ(キ
ャッシュ・エントリN)を指すポインタを、記憶すべき
関連する値として使用して、ロックレス参照ハッシュ・
テーブル217への挿入が実行される(ステップ100
7)。次いで、入力キー219がキャッシュ・エントリ
Nのキー203にコピーされる(ステップ1009)。
この動作が完了すると、Insert_Cache_E
ntryルーチン607は、動作が成功したことを示す
リターン・コードと共に呼び出し側ルーチンに戻る(ス
テップ1011)。
参照ハッシュ・テーブル217では見つからなかったと
報告された場合(ステップ1003でキャッシュ・ヒッ
トか=「no」)、キー219をハッシュ・テーブル中
のキーとして使用し、新しいキャッシュ・エントリ(キ
ャッシュ・エントリN)を指すポインタを、記憶すべき
関連する値として使用して、ロックレス参照ハッシュ・
テーブル217への挿入が実行される(ステップ100
7)。次いで、入力キー219がキャッシュ・エントリ
Nのキー203にコピーされる(ステップ1009)。
この動作が完了すると、Insert_Cache_E
ntryルーチン607は、動作が成功したことを示す
リターン・コードと共に呼び出し側ルーチンに戻る(ス
テップ1011)。
【0076】この議論では次に、図11のフローチャー
トに関連してDelete_Cache_Entryル
ーチン1100に焦点を当てる。このルーチンの開始時
には、呼出し側はすでにGet_Cache_Entr
yルーチン400を呼び出しており、削除すべきキャッ
シュ項目に対するエントリ・ロック207を得ている。
まず、呼出し側が、削除すべきキャッシュ・エントリに
対するエントリ・ロック207を得ているか(ステップ
1101で、キャッシュ・エントリがロックされている
か=「no」)どうかを調べる試験が実行される。この
キャッシュ・エントリがロックされていない場合、De
lete_Cache_Entryルーチン1100を
実行することはできず、このルーチンは、この失敗を示
すリターン・コードと共に呼出し側に戻る(ステップ1
103)。
トに関連してDelete_Cache_Entryル
ーチン1100に焦点を当てる。このルーチンの開始時
には、呼出し側はすでにGet_Cache_Entr
yルーチン400を呼び出しており、削除すべきキャッ
シュ項目に対するエントリ・ロック207を得ている。
まず、呼出し側が、削除すべきキャッシュ・エントリに
対するエントリ・ロック207を得ているか(ステップ
1101で、キャッシュ・エントリがロックされている
か=「no」)どうかを調べる試験が実行される。この
キャッシュ・エントリがロックされていない場合、De
lete_Cache_Entryルーチン1100を
実行することはできず、このルーチンは、この失敗を示
すリターン・コードと共に呼出し側に戻る(ステップ1
103)。
【0077】あるいは、ユーザが、削除すべきキャッシ
ュ・エントリに対するエントリ・ロック207を得てい
る場合(ステップ1101で、キャッシュ・エントリが
ロックされているか=「yes」)、次のステップは、
このキャッシュ・エントリのリファレンス・カウント2
11が1に等しく、このキャッシュ・エントリを「ビジ
ー」としてマーク付けしているスレッドが1つだけであ
ることが示されているかどうかを調べる試験を行う(ス
テップ1105)ことである。定義上、リファレンス・
カウント211は、削除動作を実行したいスレッドによ
って増分されているので、リファレンス・カウント21
1が1に等しいことから、削除を実行したいスレッドは
このキャッシュ・エントリの唯一のユーザであると推定
することができる。したがって、他のスレッドもこのキ
ャッシュ項目を「ビジー」としてマーク付けしている場
合(ステップ1105で、キャッシュ・エントリリファ
レンス・カウントは1に等しいか=「no」)、Del
ete_Cache_Entryルーチン1100を実
行することはできず、このルーチンは、この失敗を示す
リターン・コードと共に呼出し側に戻る(ステップ11
07)。
ュ・エントリに対するエントリ・ロック207を得てい
る場合(ステップ1101で、キャッシュ・エントリが
ロックされているか=「yes」)、次のステップは、
このキャッシュ・エントリのリファレンス・カウント2
11が1に等しく、このキャッシュ・エントリを「ビジ
ー」としてマーク付けしているスレッドが1つだけであ
ることが示されているかどうかを調べる試験を行う(ス
テップ1105)ことである。定義上、リファレンス・
カウント211は、削除動作を実行したいスレッドによ
って増分されているので、リファレンス・カウント21
1が1に等しいことから、削除を実行したいスレッドは
このキャッシュ・エントリの唯一のユーザであると推定
することができる。したがって、他のスレッドもこのキ
ャッシュ項目を「ビジー」としてマーク付けしている場
合(ステップ1105で、キャッシュ・エントリリファ
レンス・カウントは1に等しいか=「no」)、Del
ete_Cache_Entryルーチン1100を実
行することはできず、このルーチンは、この失敗を示す
リターン・コードと共に呼出し側に戻る(ステップ11
07)。
【0078】しかし、このキャッシュ・エントリを削除
したいスレッドがこのキャッシュ・エントリの唯一のユ
ーザである場合(ステップ1105で、キャッシュ・エ
ントリリファレンス・カウントは1に等しいか=「ye
s」)、削除を首尾良く実行することができる。これは
好ましくは、このキャッシュ・エントリに含まれるキャ
ッシュ項目(すなわち、キー203および値205)を
得て(ステップ1109)、コールバック情報225で
指定されたコールバック関数を呼び出し、削除中のキャ
ッシュ項目をフラッシュさせる(すなわち、キャッシュ
項目の内容がエントリ・テーブル201から削除される
前にそのキャッシュ項目の内容のクリーンナップまたは
メイン位置への書き直し、あるいはその両方を行う)こ
とによって行われる。
したいスレッドがこのキャッシュ・エントリの唯一のユ
ーザである場合(ステップ1105で、キャッシュ・エ
ントリリファレンス・カウントは1に等しいか=「ye
s」)、削除を首尾良く実行することができる。これは
好ましくは、このキャッシュ・エントリに含まれるキャ
ッシュ項目(すなわち、キー203および値205)を
得て(ステップ1109)、コールバック情報225で
指定されたコールバック関数を呼び出し、削除中のキャ
ッシュ項目をフラッシュさせる(すなわち、キャッシュ
項目の内容がエントリ・テーブル201から削除される
前にそのキャッシュ項目の内容のクリーンナップまたは
メイン位置への書き直し、あるいはその両方を行う)こ
とによって行われる。
【0079】次に、キャッシュ・ロック215が得られ
(ステップ1113)、ロックレス参照ハッシュ・テー
ブルに対して削除動作が実行され、削除すべきキャッシ
ュ要素のキーによって指定された要素が削除される(ス
テップ1115)。
(ステップ1113)、ロックレス参照ハッシュ・テー
ブルに対して削除動作が実行され、削除すべきキャッシ
ュ要素のキーによって指定された要素が削除される(ス
テップ1115)。
【0080】次いで、キャッシュ・ロック215が解除
され(ステップ1117)、このキャッシュ・エントリ
の最後のアクセス時間209およびリファレンス・カウ
ント211が零に設定され、このキャッシュ・エントリ
が使用可能なキャッシュ・エントリとして選択できるも
のであることが示される(ステップ1119)。最後
に、Delete_Cache_Entryルーチン1
100が、首尾良く完了したことを示すリターン・コー
ドと共にユーザに戻る(ステップ1121)。
され(ステップ1117)、このキャッシュ・エントリ
の最後のアクセス時間209およびリファレンス・カウ
ント211が零に設定され、このキャッシュ・エントリ
が使用可能なキャッシュ・エントリとして選択できるも
のであることが示される(ステップ1119)。最後
に、Delete_Cache_Entryルーチン1
100が、首尾良く完了したことを示すリターン・コー
ドと共にユーザに戻る(ステップ1121)。
【0081】本発明のキャッシュ127の使用法は簡単
である。キャッシュ項目がすでにキャッシュ・エントリ
・テーブル201に記憶されているかどうかをスレッド
が知ることはできないので、参照関数と挿入関数は共に
前述のGet_Cache_Itemルーチン400に
よってアクセスされる。このルーチンは常に、「ビジ
ー」とマーク付けされたロックされたキャッシュ・エン
トリを指すポインタを返す。キャッシュ・エントリが新
しいものであり、すなわち、キャッシュ・エントリが新
しく、現在このキー203に関して記憶されている値2
05がないことを意味するかどうかをユーザに知らせる
リターン・コードも提供される。
である。キャッシュ項目がすでにキャッシュ・エントリ
・テーブル201に記憶されているかどうかをスレッド
が知ることはできないので、参照関数と挿入関数は共に
前述のGet_Cache_Itemルーチン400に
よってアクセスされる。このルーチンは常に、「ビジ
ー」とマーク付けされたロックされたキャッシュ・エン
トリを指すポインタを返す。キャッシュ・エントリが新
しいものであり、すなわち、キャッシュ・エントリが新
しく、現在このキー203に関して記憶されている値2
05がないことを意味するかどうかをユーザに知らせる
リターン・コードも提供される。
【0082】新しいキャッシュ・エントリを指すポイン
タが返されている場合、ユーザ・スレッドは、代替情報
源から関連する情報を得る処置をとることができる。こ
のような動作は、アプリケーションに特有のものであ
り、その詳しい説明は本開示の範囲を超えている。
タが返されている場合、ユーザ・スレッドは、代替情報
源から関連する情報を得る処置をとることができる。こ
のような動作は、アプリケーションに特有のものであ
り、その詳しい説明は本開示の範囲を超えている。
【0083】ユーザ・スレッドは、キーに関連付けられ
た情報を得る場合、キャッシュ・エントリに対するエン
トリ・ロック207を保持しているので、この情報を直
接このキャッシュ・エントリに記憶することができる。
キャッシュ127のすべてのユーザは、特定のキャッシ
ュ・エントリに対するエントリ・ロックが得られていな
いかぎり、キャッシュ・エントリ・テーブル201への
書込みは禁止されるという規則に従うべきである。
た情報を得る場合、キャッシュ・エントリに対するエン
トリ・ロック207を保持しているので、この情報を直
接このキャッシュ・エントリに記憶することができる。
キャッシュ127のすべてのユーザは、特定のキャッシ
ュ・エントリに対するエントリ・ロックが得られていな
いかぎり、キャッシュ・エントリ・テーブル201への
書込みは禁止されるという規則に従うべきである。
【0084】ユーザ・スレッドは、もはやキャッシュ・
エントリ・テーブル201に項目を記憶したくないとき
には、エントリ・ロック207を解除する。ユーザ・ス
レッドは、情報がキャッシュに残るかどうかも、あるい
は他のキャッシュ項目用の空間を設けるためにスワップ
アウトされかどうかも気にしない場合、エントリ・ロッ
ク207を解除する直前にリファレンス・カウント21
1の減分も行う。しかし、ユーザ・スレッドは、このキ
ー203を有するキャッシュ項目をキャッシュ・エント
リ・テーブル201に残したい場合、リファレンス・カ
ウント211を減分しておくことなしにエントリ・ロッ
ク207を解除する。これは、キャッシュ置換関数が常
に、このキャッシュ・エントリを「ビジー」とみなし、
置換すべきものとして選択することがないことを意味す
る。ユーザ・スレッドは、このキー203を有するキャ
ッシュ項目をキャッシュ・エントリ・テーブル201に
残すことができるが、それによって他のスレッドがこの
キャッシュ項目の値205を修正しないことが保証され
るわけではないことにも留意されたい。
エントリ・テーブル201に項目を記憶したくないとき
には、エントリ・ロック207を解除する。ユーザ・ス
レッドは、情報がキャッシュに残るかどうかも、あるい
は他のキャッシュ項目用の空間を設けるためにスワップ
アウトされかどうかも気にしない場合、エントリ・ロッ
ク207を解除する直前にリファレンス・カウント21
1の減分も行う。しかし、ユーザ・スレッドは、このキ
ー203を有するキャッシュ項目をキャッシュ・エント
リ・テーブル201に残したい場合、リファレンス・カ
ウント211を減分しておくことなしにエントリ・ロッ
ク207を解除する。これは、キャッシュ置換関数が常
に、このキャッシュ・エントリを「ビジー」とみなし、
置換すべきものとして選択することがないことを意味す
る。ユーザ・スレッドは、このキー203を有するキャ
ッシュ項目をキャッシュ・エントリ・テーブル201に
残すことができるが、それによって他のスレッドがこの
キャッシュ項目の値205を修正しないことが保証され
るわけではないことにも留意されたい。
【0085】ユーザ・スレッドは、キャッシュ項目を削
除したいとき、まずGet_Cache_Entryル
ーチン400を介してキャッシュ・エントリを得ること
によってこれを行う。次いで、ユーザ・スレッドは単に
Delete_Cache_Entryルーチン110
0を呼び出す。ユーザ・スレッドがこの特定のエントリ
の唯一のユーザである場合、「成功」を示すリターン・
コードが返されるはずである。
除したいとき、まずGet_Cache_Entryル
ーチン400を介してキャッシュ・エントリを得ること
によってこれを行う。次いで、ユーザ・スレッドは単に
Delete_Cache_Entryルーチン110
0を呼び出す。ユーザ・スレッドがこの特定のエントリ
の唯一のユーザである場合、「成功」を示すリターン・
コードが返されるはずである。
【0086】好ましい実施形態は、キャッシュ全域動作
とキャッシュ・エントリ動作に分割されるいくつかのル
ーチンを提供する。これらのルーチンは、前述のすべて
のルーチンを含み、好ましくは、複数のCPUを有する
Sun SPARCマシン上でC++プログラミング言
語によって実施される。当業者なら、下記の説明からこ
れらのルーチンを容易に作成できよう。
とキャッシュ・エントリ動作に分割されるいくつかのル
ーチンを提供する。これらのルーチンは、前述のすべて
のルーチンを含み、好ましくは、複数のCPUを有する
Sun SPARCマシン上でC++プログラミング言
語によって実施される。当業者なら、下記の説明からこ
れらのルーチンを容易に作成できよう。
【0087】キャッシュ全域動作 − create_cache:このルーチンはキ
ャッシュ127を作成する。この入力パラメータは下記
のとおりである。 − number_of_cache_entri
es − size_of_each_cache_it
em − pointer_to_equal_func
tion − pointer_to_hash_funct
ion − pointer_to_get_key_fu
nction − pointer_to_write_back
_function
ャッシュ127を作成する。この入力パラメータは下記
のとおりである。 − number_of_cache_entri
es − size_of_each_cache_it
em − pointer_to_equal_func
tion − pointer_to_hash_funct
ion − pointer_to_get_key_fu
nction − pointer_to_write_back
_function
【0088】create_cacheルーチンの入力
パラメータを下記に説明する。 − number_of_cache_entri
es:キャッシュ中のエントリの数を定義する。 − size_of_each_item:キャッ
シュ中の各項目ごとに割り振るべきメモリのサイズを定
義する。 − pointer_to_equal_func
tion:equal_function(point
er_to_keyl,pointer_to_key
2)、すなわちkey1がkey2に等しい場合に
「真」の値を返す関数を指す。 − pointer_to_hash_funct
ion:hash_function(pointer
_to_key)、すなわち入力キーにハッシュ関数を
適用し結果を返す関数を指す。 − pointer_to_get_functi
on:get_key_function(point
er_to_cache_entry)、すなわちキャ
ッシュ項目に属するキーを指すポインタを返す関数を指
す。 − pointer_to_write_back
_function:write_back_func
tion(pointer_to_locked_ca
che_entry)、すなわち上記で詳しく説明した
ようにキャッシュ項目をフラッシュさせる関数を指す。
これは、特定のアプリケーションに必要な書き直し動作
またはクリーンナップ動作を実行するために必要であ
る。
パラメータを下記に説明する。 − number_of_cache_entri
es:キャッシュ中のエントリの数を定義する。 − size_of_each_item:キャッ
シュ中の各項目ごとに割り振るべきメモリのサイズを定
義する。 − pointer_to_equal_func
tion:equal_function(point
er_to_keyl,pointer_to_key
2)、すなわちkey1がkey2に等しい場合に
「真」の値を返す関数を指す。 − pointer_to_hash_funct
ion:hash_function(pointer
_to_key)、すなわち入力キーにハッシュ関数を
適用し結果を返す関数を指す。 − pointer_to_get_functi
on:get_key_function(point
er_to_cache_entry)、すなわちキャ
ッシュ項目に属するキーを指すポインタを返す関数を指
す。 − pointer_to_write_back
_function:write_back_func
tion(pointer_to_locked_ca
che_entry)、すなわち上記で詳しく説明した
ようにキャッシュ項目をフラッシュさせる関数を指す。
これは、特定のアプリケーションに必要な書き直し動作
またはクリーンナップ動作を実行するために必要であ
る。
【0089】− get_cache_entry(c
ache_id key,bool&new_cach
e_entry):あるキャッシュ項目のキーを指すポ
インタが与えられた場合、このルーチンは、合致する同
じキーを有するキャッシュ項目を含むキャッシュ・エン
トリを指すポインタを返す。ブール値new_cach
e_entryは、キャッシュ項目が新しい項目である
か、それとも既存の項目であるかを示す。 − delete_cache_entry(cach
e_entry*cp):このルーチンは、キャッシュ
・エントリ(ポインタ)に含まれるキャッシュ項目をキ
ャッシュから削除する。このルーチンを呼び出す前に、
キャッシュ・エントリを専用に使用できるようにまずロ
ックしておかなければならない。
ache_id key,bool&new_cach
e_entry):あるキャッシュ項目のキーを指すポ
インタが与えられた場合、このルーチンは、合致する同
じキーを有するキャッシュ項目を含むキャッシュ・エン
トリを指すポインタを返す。ブール値new_cach
e_entryは、キャッシュ項目が新しい項目である
か、それとも既存の項目であるかを示す。 − delete_cache_entry(cach
e_entry*cp):このルーチンは、キャッシュ
・エントリ(ポインタ)に含まれるキャッシュ項目をキ
ャッシュから削除する。このルーチンを呼び出す前に、
キャッシュ・エントリを専用に使用できるようにまずロ
ックしておかなければならない。
【0090】キャッシュ・エントリ動作: − mutex_lock(pointer_to_
cache_entry):この関数は、指示されたc
ache_entryに対するエントリ・ロック207
を得るものである。エントリ・ロック207は相互排他
ロックである。 − mutex_unlock(pointer_t
o_cache_entry):この関数は、指示され
たcache_entryに対するエントリ・ロック2
07を解除するものである。 − hold(pointer_to_cache_
entry):この関数は、指示されたキャッシュ・エ
ントリのリファレンス・カウント211を増分するもの
である。リファレンス・カウント211を増分すると、
キャッシュ・エントリは「ビジー」としてマーク付けさ
れる。get_cache_entryルーチンも、そ
れが返すキャッシュ・エントリのリファレンス・カウン
ト211を増分するが、スレッドはエントリを解除し
(すなわち、リファレンス・カウント211を減分
し)、次いでこれを変更してエントリに再び「ビジー」
とマーク付けすることが可能である。ホールド関数はこ
のために提供される。ホールド関数を呼び出す前に、指
示されたキャッシュ・エントリに対するエントリ・ロッ
ク207を得ておかなければならない。 − release(pointer_to_cac
he_entry):この関数は、キャッシュ・エント
リのリファレンス・カウント211を減分する。リリー
ス関数を呼び出す前に、指示されたキャッシュ・エント
リに対するエントリ・ロック207を得ておかなければ
ならない。 − get_key():この関数は、キャッシュ・
キー203を指すポインタを返す。 − get_value():この関数は、値205
を指すポインタを返す。
cache_entry):この関数は、指示されたc
ache_entryに対するエントリ・ロック207
を得るものである。エントリ・ロック207は相互排他
ロックである。 − mutex_unlock(pointer_t
o_cache_entry):この関数は、指示され
たcache_entryに対するエントリ・ロック2
07を解除するものである。 − hold(pointer_to_cache_
entry):この関数は、指示されたキャッシュ・エ
ントリのリファレンス・カウント211を増分するもの
である。リファレンス・カウント211を増分すると、
キャッシュ・エントリは「ビジー」としてマーク付けさ
れる。get_cache_entryルーチンも、そ
れが返すキャッシュ・エントリのリファレンス・カウン
ト211を増分するが、スレッドはエントリを解除し
(すなわち、リファレンス・カウント211を減分
し)、次いでこれを変更してエントリに再び「ビジー」
とマーク付けすることが可能である。ホールド関数はこ
のために提供される。ホールド関数を呼び出す前に、指
示されたキャッシュ・エントリに対するエントリ・ロッ
ク207を得ておかなければならない。 − release(pointer_to_cac
he_entry):この関数は、キャッシュ・エント
リのリファレンス・カウント211を減分する。リリー
ス関数を呼び出す前に、指示されたキャッシュ・エント
リに対するエントリ・ロック207を得ておかなければ
ならない。 − get_key():この関数は、キャッシュ・
キー203を指すポインタを返す。 − get_value():この関数は、値205
を指すポインタを返す。
【0091】本発明を特定の実施形態に関連して説明し
た。しかし、当業者には、前述の好ましい実施形態の態
様以外の特定の態様で本発明を具体化できることが容易
に明らかになろう。これは、本発明の趣旨から逸脱せず
に行うことができる。好ましい実施形態は例示的なもの
に過ぎず、制限的なものとみなすべきものではない。本
発明の範囲は、上記の説明ではなく添付の特許請求の範
囲によって与えられ、特許請求の範囲内のすべての変形
および等価物は、本発明に包含されるものである。
た。しかし、当業者には、前述の好ましい実施形態の態
様以外の特定の態様で本発明を具体化できることが容易
に明らかになろう。これは、本発明の趣旨から逸脱せず
に行うことができる。好ましい実施形態は例示的なもの
に過ぎず、制限的なものとみなすべきものではない。本
発明の範囲は、上記の説明ではなく添付の特許請求の範
囲によって与えられ、特許請求の範囲内のすべての変形
および等価物は、本発明に包含されるものである。
【図1】 本発明と共に使用すべき例示的なマルチスレ
ッド・システムのブロック図である。
ッド・システムのブロック図である。
【図2】 本発明の実施形態によるキャッシュのブロッ
ク図である。
ク図である。
【図3】 本発明の一態様によるキャッシュ項目とハッ
シュ・テーブル項目との間の関係を示す図である。
シュ・テーブル項目との間の関係を示す図である。
【図4】 本発明の一実施形態によるget_cach
e_entryルーチンのフローチャートである。
e_entryルーチンのフローチャートである。
【図5】 本発明の一実施形態によるfind_cac
he_entryルーチンのフローチャートである。
he_entryルーチンのフローチャートである。
【図6】 本発明の一実施形態によるinsert_c
ache_entryルーチンのフローチャートであ
る。
ache_entryルーチンのフローチャートであ
る。
【図7】 本発明の一態様によるget_next_a
vailable_entryルーチンのフローチャー
トである。
vailable_entryルーチンのフローチャー
トである。
【図8】 本発明の一態様によるfind_cache
_entry_least_recently_use
dルーチンのフローチャートである。
_entry_least_recently_use
dルーチンのフローチャートである。
【図9】 本発明の一態様によるreclaim_ca
che_entryルーチンのフローチャートである。
che_entryルーチンのフローチャートである。
【図10】 本発明の一態様によるinsert_ca
che_entryルーチンのフローチャートである。
che_entryルーチンのフローチャートである。
【図11】 本発明の一態様によるdelete_ca
che_entryルーチンのフローチャートである。
che_entryルーチンのフローチャートである。
101 プロセッサ 103 共通二重ポート・メモリ(DPM) 105 中央演算処理装置(CPU) 107 ディスク 109 入出力(I/O)制御装置 111 入力装置 113 出力装置 115 ランダム・アクセス・メモリ(RAM) 117 読取り専用メモリ(ROM) 119 共通システム・バス 121 出力装置 123 入力装置 125 キャッシュ制御プログラム 127 キャッシュ 129 ハードウェア・キャッシュ 201 エントリ・テーブル 203 キー 205 データ値 207 エントリ・ロック 209 最後のアクセス時間 211 リファレンス・カウント 213 キャッシュ・クロック 215 キャッシュ・ロック 217 テーブル 219 入力キー 221 エントリ番号 223 入力 301 キャッシュ・エントリ・テーブル 303 ロックレス参照ハッシュ・テーブル
フロントページの続き (72)発明者 セロン・ディ・トック アメリカ合衆国 94086 カリフォルニア 州・サニーベール・アヤラ ドライブ・ナ ンバー 100・1260
Claims (11)
- 【請求項1】 キャッシュが、項目を記憶する複数のエ
ントリを有し、各エントリが、エントリ番号によって識
別され、項目が第1のキーを含みときに、各スレッドか
ら共通にアクセスできるキャッシュを有するマルチスレ
ッド処理システムでキャッシュ中の項目を見つける方法
であって、 a)ロックレス参照エンジンに第1のキーを供給するス
テップと、 b)ロックレス参照エンジンを使用して、参照出力、す
なわち参照エントリ番号を与えるステップと、 c)項目が、参照エントリ番号に関連付けられたエント
リに記憶されているかどうかを判定するステップとを含
み、その判定ステップが、 少なくとも、参照エントリ番号で指定されたエントリ
に、専用アクセスを許可する相互排他ロックを得るステ
ップと、 参照エントリ番号を使用して、参照エントリ番号で指定
されたエントリから記憶されているキーを読み取るステ
ップと、 第1のキーを記憶されているキーと比較するステップと
を含み、第1のキーが、記憶されているキーに合致する
場合、項目が参照エントリ番号に関連付けられたエント
リに記憶されることを特徴とする方法。 - 【請求項2】 キャッシュが、項目を記憶する複数のエ
ントリを有し、各エントリが、エントリ番号によって識
別され、項目が第1のキーを含みときに、各スレッドか
ら共通にアクセスできるキャッシュを有するマルチスレ
ッド処理システムでキャッシュ中の項目を見つける方法
であって、 a)ロックレス参照エンジンに第1のキーを供給するス
テップと、 b)参照エントリ番号が第1のエントリ番号と第2のエ
ントリ番号のどちらかであり、第1のエントリ番号は項
目が記憶されている第1のエントリを指し示し、第2の
エントリ番号は項目が記憶されていない第2のエントリ
を指すようになっているときに、ロックレス参照エンジ
ンを使用して、参照出力、すなわち参照エントリ番号を
与えるステップと、 c)参照エントリ番号が第1のエントリ番号であること
を検証するステップとを含み、その検証ステップが、 少なくとも、参照エントリ番号で指定されたエントリ
に、専用アクセスを許可する相互排他ロックを得るステ
ップと、 参照エントリ番号を使用して、参照エントリ番号で指定
されたエントリから記憶されているキーを読み取るステ
ップと、 第1のキーを記憶されているキーと比較するステップ
と、 第1のキーが記憶されているキーに合致する場合にの
み、参照エントリ番号を第1のエントリ番号として供給
するステップとを含むことを特徴とする方法。 - 【請求項3】 さらに、 第1のキーが、記憶されているキーに合致しない場合
に、相互排他ロックを解除し、ステップa)ないしc)
を繰り返すステップを含むことを特徴とする請求項2に
記載の方法。 - 【請求項4】 キャッシュが、項目を記憶する複数のエ
ントリを有し、各エントリが、エントリ番号によって識
別され、項目が第1のキーを含みときに、各スレッドか
ら共通にアクセスできるキャッシュを有するマルチスレ
ッド処理システムでキャッシュ中の項目を見つける装置
であって、 a)ロックレス参照エンジンに第1のキーを供給する手
段と、 b)参照エントリ番号が、第1のエントリ番号と第2の
エントリ番号のどちらかであり、第1のエントリ番号
が、項目が記憶されている第1のエントリを指し示し、
第2のエントリ番号が、項目が記憶されていない第2の
エントリを指すようになっているときに、ロックレス参
照エンジンを使用して、参照出力、すなわち参照エント
リ番号を与える手段と、 c)参照エントリ番号が第1のエントリ番号であること
を検証する手段とを含み、その検証手段が、 少なくとも、参照エントリ番号で指定されたエントリ
に、専用アクセスを許可する相互排他ロックを得る手段
と、 参照エントリ番号を使用して、参照エントリ番号で指定
されたエントリから記憶されているキーを読み取る手段
と、 第1のキーを記憶されているキーと比較する手段と、 第1のキーが記憶されているキーに合致する場合にの
み、参照エントリ番号を第1のエントリ番号として供給
する手段とを含むことを特徴とする装置。 - 【請求項5】 さらに、 第1のキーが、記憶されているキーに合致しないことに
応答して、相互排他ロックを解除し、手段a)ないし
c)を再び作動させる手段を備えることを特徴とする請
求項4に記載の装置。 - 【請求項6】 キャッシュが、項目を記憶する複数のエ
ントリを有し、各エントリが、エントリ番号によって識
別され、項目が第1のキーを含むときに、各スレッドか
ら共通にアクセスできるキャッシュを有するマルチスレ
ッド処理システムで使用すべき製品であって、 キャッシュ中の項目を見つけさせるように構成されたコ
ンピュータ読取り可能プログラム・コードを有するコン
ピュータ使用可能媒体を備え、製品中の前記コンピュー
タ読取り可能プログラム・コードが、 マルチスレッド処理システム中のコンピュータに、ロッ
クレス参照エンジンに第1のキーを供給させるように構
成されたコンピュータ読取り可能なプログラム・コード
と、 コンピュータに、ロックレス参照エンジンを使用して、
参照出力、すなわち参照エントリ番号を提供させるよう
に構成されたコンピュータ読取り可能プログラム・コー
ドと、 コンピュータに、項目が、参照エントリ番号に関連付け
られたエントリに記憶されているかどうかを判定させる
ように構成されたコンピュータ読取り可能プログラム・
コードとを備え、コンピュータに判定を下させるように
構成されたコンピュータ読取り可能プログラム・コード
が、 コンピュータに、少なくとも、参照エントリ番号で指定
されたエントリに、専用アクセスを許可する相互排他ロ
ックを得させるように構成されたコンピュータ読取り可
能プログラム・コードと、 コンピュータに、参照エントリ番号を使用して、参照エ
ントリ番号で指定されたエントリから記憶されているキ
ーを読み取らせるように構成されたコンピュータ読取り
可能コードと、 コンピュータに、第1のキーを、記憶されているキーと
比較させるように構成されたコンピュータ読取り可能プ
ログラム・コードとを備え、第1のキーが、記憶されて
いるキーに合致する場合、項目が、参照エントリ番号に
関連付けられたエントリに記憶されることを特徴とする
製品。 - 【請求項7】 キャッシュが、項目を記憶する複数のエ
ントリを有し、各エントリが、エントリ番号によって識
別され、項目が第1のキーを含むときに、各スレッドか
ら共通にアクセスできるキャッシュを有するマルチスレ
ッド処理システムで使用すべき製品であって、 キャッシュ中の項目を見つけさせるように構成されたコ
ンピュータ読取り可能プログラム・コードを有するコン
ピュータ使用可能媒体を備え、製品中の前記コンピュー
タ読取り可能プログラム・コードが、 a)マルチスレッド処理システム中のコンピュータに、
ロックレス参照エンジンに第1のキーを供給させるよう
に構成されたコンピュータ読取り可能なプログラム・コ
ードと、 b)コンピュータに、ロックレス参照エンジンを使用し
て、参照出力、すなわち参照エントリ番号を提供させる
ように構成され、参照エントリ番号が、第1のエントリ
番号と第2のエントリ番号のどちらかであり、第1のエ
ントリ番号が、項目が記憶されている第1のエントリを
指し示し、第2のエントリ番号が、項目が記憶されてい
ない第2のエントリを指す、コンピュータ読取り可能プ
ログラム・コードと、 c)コンピュータに、参照エントリ番号が第1のエント
リ番号であることを検証させるように構成されたコンピ
ュータ読取り可能プログラム・コードとを備え、コンピ
ュータに検証を行わせるように構成されたコンピュータ
読取り可能プログラム・コードが、 コンピュータに、少なくとも、参照エントリ番号で指定
されたエントリに、専用アクセスを許可する相互排他ロ
ックを得させるように構成されたコンピュータ読取り可
能プログラム・コードと、 コンピュータに、参照エントリ番号を使用して、参照エ
ントリ番号で指定されたエントリから記憶されているキ
ーを読み取らせるように構成されたコンピュータ読取り
可能プログラム・コードと、 コンピュータに、第1のキーを、記憶されているキーと
比較させるように構成されたコンピュータ読取り可能プ
ログラム・コードと、 コンピュータに、第1のキーが、記憶されているキーに
合致する場合にのみ、参照エントリ番号を第1のエント
リ番号として供給させるように構成されたコンピュータ
読取り可能プログラム・コードとを備えることを特徴と
する製品。 - 【請求項8】 さらに、 コンピュータに、第1のキーが、記憶されているキーに
合致しないことに応答して、相互排他ロックを解除し、
コンピュータ読取り可能プログラム・コードa)ないし
c)を再び呼び出させるように構成されたコンピュータ
読取り可能プログラム・コードを備えることを特徴とす
る請求項7に記載の製品。 - 【請求項9】 各スレッドから共通にアクセスすること
ができ、項目を記憶する複数のエントリを有するキャッ
シュを有するマルチスレッド処理システムでの新しい項
目を記憶する新しいキャッシュ・エントリを得る方法で
あって、 a)複数のエントリを論理的に数組のエントリに分割す
るステップと、 b)数組のエントリのうちの1組を選択するステップ
と、 c)選択された1組のエントリに関して、どのエントリ
がビジーでないかを判定するステップと、 d)選択された1組のエントリのうちの少なくとも1つ
のエントリがビジーでない場合に、1組のエントリのう
ちの非ビジー・エントリのうちで最初に使用されたエン
トリを新しいキャッシュ・エントリとして選択するステ
ップと、 e)選択された1組のエントリのどのエントリもビジー
でない場合に、数組のエントリのうちの他の1組を選択
しステップc)ないしe)を繰り返すステップとを含む
ことを特徴とする方法。 - 【請求項10】 各スレッドから共通にアクセスするこ
とができ、項目を記憶する複数のエントリを有するキャ
ッシュを有するマルチスレッド処理システムでの新しい
項目を記憶する新しいキャッシュ・エントリを得る装置
であって、 a)複数のエントリを論理的に数組のエントリに分割す
る手段と、 b)数組のエントリのうちの1組を選択する手段と、 c)選択された1組のエントリに関して、どのエントリ
がビジーでないかを判定する手段と、 d)選択された1組のエントリのうちの少なくとも1つ
のエントリがビジーでないことに応答して、1組のエン
トリのうちの非ビジー・エントリのうちで最初に使用さ
れたエントリを新しいキャッシュ・エントリとして選択
する手段と、 e)選択された1組のエントリのどのエントリもビジー
でないことに応答して、数組のエントリのうちの他の1
組を選択し、手段c)ないしe)を再び起動する手段と
を備えることを特徴とする装置。 - 【請求項11】 各スレッドから共通にアクセスするこ
とができ、項目を記憶する複数のエントリを有するキャ
ッシュを備えたマルチスレッド処理システムで使用すべ
き製品であって、 新しい項目を記憶する新しいキャッシュ・エントリを得
させるように構成されたコンピュータ読取り可能プログ
ラム・コードを有するコンピュータ使用可能媒体を有
し、製品中のコンピュータ読取り可能プログラム・コー
ドが、 a)マルチスレッド処理システム中のコンピュータに、
複数のエントリを論理的に数組のエントリに分割させる
ように構成されたコンピュータ読取り可能プログラム・
コードと、 b)コンピュータに、数組のエントリのうちの1組を選
択させるように構成されたコンピュータ読取り可能プロ
グラム・コードと、 c)コンピュータに、選択された1組のエントリに関し
て、どのエントリがビジーでないかを判定させるように
構成されたコンピュータ読取り可能プログラム・コード
と、 d)コンピュータに、選択された1組のエントリのうち
の少なくとも1つのエントリがビジーでないことに応答
して、1組のエントリのうちの非ビジー・エントリのう
ちで最初に使用されたエントリを新しいキャッシュ・エ
ントリとして選択させるように構成されたコンピュータ
読取り可能プログラム・コードと、 e)コンピュータに、選択された1組のエントリのどの
エントリもビジーでないことに応答して、数組のエント
リのうちの他の1組を選択し、コンピュータ読取り可能
プログラム・コードc)ないしe)を再び起動させるよ
うに構成されたコンピュータ読取り可能プログラム・コ
ードとを備えることを特徴とする製品。
Applications Claiming Priority (2)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| US08/543105 | 1995-10-13 | ||
| US08/543,105 US5701432A (en) | 1995-10-13 | 1995-10-13 | Multi-threaded processing system having a cache that is commonly accessible to each thread |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JPH09204357A true JPH09204357A (ja) | 1997-08-05 |
Family
ID=24166597
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP8289018A Pending JPH09204357A (ja) | 1995-10-13 | 1996-10-14 | マルチスレッド環境を有する計算システム用の最大並行参照キャッシュ |
Country Status (7)
| Country | Link |
|---|---|
| US (2) | US5701432A (ja) |
| EP (1) | EP0768608B1 (ja) |
| JP (1) | JPH09204357A (ja) |
| KR (1) | KR970022764A (ja) |
| CN (1) | CN1087451C (ja) |
| DE (1) | DE69625768T2 (ja) |
| TW (1) | TW324081B (ja) |
Families Citing this family (121)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US5819298A (en) * | 1996-06-24 | 1998-10-06 | Sun Microsystems, Inc. | File allocation tables with holes |
| US5832525A (en) * | 1996-06-24 | 1998-11-03 | Sun Microsystems, Inc. | Disk fragmentation reduction using file allocation tables |
| US5937187A (en) * | 1996-07-01 | 1999-08-10 | Sun Microsystems, Inc. | Method and apparatus for execution and preemption control of computer process entities |
| US5974438A (en) * | 1996-12-31 | 1999-10-26 | Compaq Computer Corporation | Scoreboard for cached multi-thread processes |
| US6014667A (en) * | 1997-10-01 | 2000-01-11 | Novell, Inc. | System and method for caching identification and location information in a computer network |
| US6216218B1 (en) | 1997-11-03 | 2001-04-10 | Donald L. Sollars | Processor having a datapath and control logic constituted with basis execution blocks |
| US6067601A (en) * | 1997-11-03 | 2000-05-23 | Brecis Communications | Cache memory based instruction execution |
| US6161166A (en) * | 1997-11-10 | 2000-12-12 | International Business Machines Corporation | Instruction cache for multithreaded processor |
| US5995998A (en) * | 1998-01-23 | 1999-11-30 | Sun Microsystems, Inc. | Method, apparatus and computer program product for locking interrelated data structures in a multi-threaded computing environment |
| US6289358B1 (en) | 1998-04-15 | 2001-09-11 | Inktomi Corporation | Delivering alternate versions of objects from an object cache |
| US6128623A (en) * | 1998-04-15 | 2000-10-03 | Inktomi Corporation | High performance object cache |
| US6205519B1 (en) | 1998-05-27 | 2001-03-20 | Hewlett Packard Company | Cache management for a multi-threaded processor |
| US6490654B2 (en) * | 1998-07-31 | 2002-12-03 | Hewlett-Packard Company | Method and apparatus for replacing cache lines in a cache memory |
| US6594701B1 (en) | 1998-08-04 | 2003-07-15 | Microsoft Corporation | Credit-based methods and systems for controlling data flow between a sender and a receiver with reduced copying of data |
| US6321276B1 (en) | 1998-08-04 | 2001-11-20 | Microsoft Corporation | Recoverable methods and systems for processing input/output requests including virtual memory addresses |
| US6360220B1 (en) * | 1998-08-04 | 2002-03-19 | Microsoft Corporation | Lock-free methods and systems for accessing and storing information in an indexed computer data structure having modifiable entries |
| US6269425B1 (en) * | 1998-08-20 | 2001-07-31 | International Business Machines Corporation | Accessing data from a multiple entry fully associative cache buffer in a multithread data processing system |
| US6189007B1 (en) | 1998-08-28 | 2001-02-13 | International Business Machines Corporation | Method and apparatus for conducting a high performance locking facility in a loosely coupled environment |
| US6253274B1 (en) * | 1998-08-28 | 2001-06-26 | International Business Machines Corporation | Apparatus for a high performance locking facility |
| US6185650B1 (en) | 1998-08-28 | 2001-02-06 | International Business Machines Corporation | High performance locking facility |
| US6349363B2 (en) * | 1998-12-08 | 2002-02-19 | Intel Corporation | Multi-section cache with different attributes for each section |
| US7529907B2 (en) | 1998-12-16 | 2009-05-05 | Mips Technologies, Inc. | Method and apparatus for improved computer load and store operations |
| US7020879B1 (en) * | 1998-12-16 | 2006-03-28 | Mips Technologies, Inc. | Interrupt and exception handling for multi-streaming digital processors |
| US7237093B1 (en) | 1998-12-16 | 2007-06-26 | Mips Technologies, Inc. | Instruction fetching system in a multithreaded processor utilizing cache miss predictions to fetch instructions from multiple hardware streams |
| US7257814B1 (en) * | 1998-12-16 | 2007-08-14 | Mips Technologies, Inc. | Method and apparatus for implementing atomicity of memory operations in dynamic multi-streaming processors |
| US6389449B1 (en) * | 1998-12-16 | 2002-05-14 | Clearwater Networks, Inc. | Interstream control and communications for multi-streaming digital processors |
| US7035997B1 (en) | 1998-12-16 | 2006-04-25 | Mips Technologies, Inc. | Methods and apparatus for improving fetching and dispatch of instructions in multithreaded processors |
| US6460122B1 (en) * | 1999-03-31 | 2002-10-01 | International Business Machine Corporation | System, apparatus and method for multi-level cache in a multi-processor/multi-controller environment |
| US6535905B1 (en) | 1999-04-29 | 2003-03-18 | Intel Corporation | Method and apparatus for thread switching within a multithreaded processor |
| US6507862B1 (en) * | 1999-05-11 | 2003-01-14 | Sun Microsystems, Inc. | Switching method in a multi-threaded processor |
| US6938147B1 (en) * | 1999-05-11 | 2005-08-30 | Sun Microsystems, Inc. | Processor with multiple-thread, vertically-threaded pipeline |
| US6542921B1 (en) | 1999-07-08 | 2003-04-01 | Intel Corporation | Method and apparatus for controlling the processing priority between multiple threads in a multithreaded processor |
| AU7728300A (en) * | 1999-11-22 | 2001-06-04 | Ericsson Inc. | Buffer memories, methods and systems for buffering having seperate buffer memories for each of a plurality of tasks |
| US6889319B1 (en) | 1999-12-09 | 2005-05-03 | Intel Corporation | Method and apparatus for entering and exiting multiple threads within a multithreaded processor |
| US6496925B1 (en) | 1999-12-09 | 2002-12-17 | Intel Corporation | Method and apparatus for processing an event occurrence within a multithreaded processor |
| US7188344B1 (en) | 1999-12-21 | 2007-03-06 | Unisys Corporation | Architecture for a read/write thread lock |
| US7590644B2 (en) * | 1999-12-21 | 2009-09-15 | International Business Machine Corporation | Method and apparatus of streaming data transformation using code generator and translator |
| US7051329B1 (en) | 1999-12-28 | 2006-05-23 | Intel Corporation | Method and apparatus for managing resources in a multithreaded processor |
| US7856633B1 (en) * | 2000-03-24 | 2010-12-21 | Intel Corporation | LRU cache replacement for a partitioned set associative cache |
| US6622168B1 (en) * | 2000-04-10 | 2003-09-16 | Chutney Technologies, Inc. | Dynamic page generation acceleration using component-level caching |
| US7111156B1 (en) * | 2000-04-21 | 2006-09-19 | Ati Technologies, Inc. | Method and apparatus for multi-thread accumulation buffering in a computation engine |
| DE60143896D1 (de) | 2000-07-14 | 2011-03-03 | Mips Tech Inc | Anweisungsabruf und -absendung in einem multi-thread-system |
| US7185196B1 (en) * | 2000-09-15 | 2007-02-27 | Atheros Communications, Inc. | Key caching system |
| US6785714B1 (en) * | 2000-09-28 | 2004-08-31 | Microsoft Corporation | System and method for employing slot level locking of a cache |
| SE0004736D0 (sv) * | 2000-12-20 | 2000-12-20 | Ericsson Telefon Ab L M | Mapping system and method |
| JP3990115B2 (ja) * | 2001-03-12 | 2007-10-10 | 株式会社東芝 | サーバ側プロキシ装置及びプログラム |
| US6732238B1 (en) * | 2001-06-08 | 2004-05-04 | Tensilica, Inc. | Set-associative cache memory having variable time decay rewriting algorithm |
| US6976155B2 (en) * | 2001-06-12 | 2005-12-13 | Intel Corporation | Method and apparatus for communicating between processing entities in a multi-processor |
| GB0116497D0 (en) * | 2001-07-06 | 2001-08-29 | Koninkl Philips Electronics Nv | Receiver apparatus and method |
| US6944717B2 (en) * | 2001-07-27 | 2005-09-13 | Fujitsu Limited | Cache buffer control apparatus and method using counters to determine status of cache buffer memory cells for writing and reading data therefrom |
| US8024735B2 (en) | 2002-06-14 | 2011-09-20 | Intel Corporation | Method and apparatus for ensuring fairness and forward progress when executing multiple threads of execution |
| JP3900025B2 (ja) * | 2002-06-24 | 2007-04-04 | 日本電気株式会社 | 共有キャッシュメモリのヒット判定制御方法及び共有キャッシュメモリのヒット判定制御方式 |
| US6915296B2 (en) * | 2002-10-29 | 2005-07-05 | Agere Systems Inc. | Incremental reorganization for hash tables |
| US7831974B2 (en) * | 2002-11-12 | 2010-11-09 | Intel Corporation | Method and apparatus for serialized mutual exclusion |
| US7415540B2 (en) * | 2002-12-31 | 2008-08-19 | Intel Corporation | Scheduling processing threads |
| US7418577B2 (en) | 2003-02-13 | 2008-08-26 | Sun Microsystems, Inc. | Fail instruction to support transactional program execution |
| US7089374B2 (en) * | 2003-02-13 | 2006-08-08 | Sun Microsystems, Inc. | Selectively unmarking load-marked cache lines during transactional program execution |
| US7269693B2 (en) | 2003-02-13 | 2007-09-11 | Sun Microsystems, Inc. | Selectively monitoring stores to support transactional program execution |
| US7269694B2 (en) | 2003-02-13 | 2007-09-11 | Sun Microsystems, Inc. | Selectively monitoring loads to support transactional program execution |
| US7269717B2 (en) | 2003-02-13 | 2007-09-11 | Sun Microsystems, Inc. | Method for reducing lock manipulation overhead during access to critical code sections |
| US7398355B1 (en) | 2003-02-13 | 2008-07-08 | Sun Microsystems, Inc. | Avoiding locks by transactionally executing critical sections |
| US6938130B2 (en) * | 2003-02-13 | 2005-08-30 | Sun Microsystems Inc. | Method and apparatus for delaying interfering accesses from other threads during transactional program execution |
| US7152170B2 (en) | 2003-02-20 | 2006-12-19 | Samsung Electronics Co., Ltd. | Simultaneous multi-threading processor circuits and computer program products configured to operate at different performance levels based on a number of operating threads and methods of operating |
| GB2410584B (en) * | 2003-02-20 | 2006-02-01 | Samsung Electronics Co Ltd | Simultaneous multi-threading processor circuits and computer program products configured to operate at different performance levels |
| US20040190506A1 (en) * | 2003-03-24 | 2004-09-30 | International Business Machines Corp. | Method and apparatus for performing complex pattern matching in a data stream within a computer network |
| US20040199727A1 (en) * | 2003-04-02 | 2004-10-07 | Narad Charles E. | Cache allocation |
| US7225299B1 (en) | 2003-07-16 | 2007-05-29 | Transmeta Corporation | Supporting speculative modification in a data cache |
| US20050120195A1 (en) * | 2003-11-13 | 2005-06-02 | Alok Kumar | Allocating memory |
| US7536377B1 (en) | 2003-12-18 | 2009-05-19 | Xilinx, Inc. | Component naming |
| US7703098B1 (en) | 2004-07-20 | 2010-04-20 | Sun Microsystems, Inc. | Technique to allow a first transaction to wait on condition that affects its working set |
| US8074030B1 (en) | 2004-07-20 | 2011-12-06 | Oracle America, Inc. | Using transactional memory with early release to implement non-blocking dynamic-sized data structure |
| US7809888B1 (en) * | 2004-09-29 | 2010-10-05 | Emc Corporation | Content-aware caching techniques |
| US7376798B1 (en) * | 2005-04-07 | 2008-05-20 | Transmeta Corporation | Memory management methods and systems that support cache consistency |
| KR100850712B1 (ko) * | 2005-06-20 | 2008-08-06 | 삼성전자주식회사 | 화상 형성 장치의 전사 전압 제어 방법 및 장치 |
| US7966292B1 (en) | 2005-06-30 | 2011-06-21 | Emc Corporation | Index processing |
| US8161005B1 (en) | 2005-06-30 | 2012-04-17 | Emc Corporation | Efficient index processing |
| US8156079B1 (en) | 2005-06-30 | 2012-04-10 | Emc Corporation | System and method for index processing |
| US20070022250A1 (en) * | 2005-07-19 | 2007-01-25 | International Business Machines Corporation | System and method of responding to a cache read error with a temporary cache directory column delete |
| WO2007031696A1 (en) * | 2005-09-13 | 2007-03-22 | Arm Limited | Cache miss detection in a data processing apparatus |
| EP1938207A1 (en) * | 2005-09-27 | 2008-07-02 | Teamon Systems, Inc. | System for transforming application data using xslt extensions to render templates from cache and related methods |
| CA2621348C (en) * | 2005-09-27 | 2010-07-06 | Teamon Systems, Inc. | System for obtaining image using xslt extension and related method |
| US7752211B1 (en) | 2005-09-30 | 2010-07-06 | Emc Corporation | Adaptive index processing |
| US7698325B1 (en) * | 2005-09-30 | 2010-04-13 | Emc Corporation | Index processing for legacy systems |
| US7627609B1 (en) | 2005-09-30 | 2009-12-01 | Emc Corporation | Index processing using transformed values |
| US7886068B1 (en) * | 2005-10-27 | 2011-02-08 | Network Appliance, Inc. | Management of streaming media playlists |
| US8185724B2 (en) * | 2006-03-03 | 2012-05-22 | Arm Limited | Monitoring values of signals within an integrated circuit |
| WO2007101969A1 (en) * | 2006-03-06 | 2007-09-13 | Arm Limited | Accessing a cache in a data processing apparatus |
| US7930695B2 (en) * | 2006-04-06 | 2011-04-19 | Oracle America, Inc. | Method and apparatus for synchronizing threads on a processor that supports transactional memory |
| US7685368B1 (en) * | 2006-06-28 | 2010-03-23 | Emc Corporation | Methods and apparatus for removing data from a cache |
| US7668851B2 (en) * | 2006-11-29 | 2010-02-23 | International Business Machines Corporation | Lockless hash table lookups while performing key update on hash table element |
| US20080183963A1 (en) * | 2007-01-31 | 2008-07-31 | International Business Machines Corporation | System, Method, And Service For Providing A Generic RAID Engine And Optimizer |
| US8095750B2 (en) * | 2007-05-14 | 2012-01-10 | International Business Machines Corporation | Transactional memory system with fast processing of common conflicts |
| US8688920B2 (en) | 2007-05-14 | 2014-04-01 | International Business Machines Corporation | Computing system with guest code support of transactional memory |
| US8095741B2 (en) * | 2007-05-14 | 2012-01-10 | International Business Machines Corporation | Transactional memory computing system with support for chained transactions |
| US9009452B2 (en) | 2007-05-14 | 2015-04-14 | International Business Machines Corporation | Computing system with transactional memory using millicode assists |
| US8117403B2 (en) * | 2007-05-14 | 2012-02-14 | International Business Machines Corporation | Transactional memory system which employs thread assists using address history tables |
| US8321637B2 (en) * | 2007-05-14 | 2012-11-27 | International Business Machines Corporation | Computing system with optimized support for transactional memory |
| US8200917B2 (en) * | 2007-09-26 | 2012-06-12 | Qualcomm Incorporated | Multi-media processor cache with cache line locking and unlocking |
| US8032706B2 (en) * | 2008-08-05 | 2011-10-04 | Intel Corporation | Method and apparatus for detecting a data access violation |
| US9727508B2 (en) | 2009-04-27 | 2017-08-08 | Intel Corporation | Address learning and aging for network bridging in a network processor |
| US8321385B2 (en) * | 2010-03-12 | 2012-11-27 | Lsi Corporation | Hash processing in a network communications processor architecture |
| US8515965B2 (en) | 2010-05-18 | 2013-08-20 | Lsi Corporation | Concurrent linked-list traversal for real-time hash processing in multi-core, multi-thread network processors |
| US9152564B2 (en) | 2010-05-18 | 2015-10-06 | Intel Corporation | Early cache eviction in a multi-flow network processor architecture |
| US8949838B2 (en) | 2009-04-27 | 2015-02-03 | Lsi Corporation | Multi-threaded processing with hardware accelerators |
| US9461930B2 (en) | 2009-04-27 | 2016-10-04 | Intel Corporation | Modifying data streams without reordering in a multi-thread, multi-flow network processor |
| US8910168B2 (en) | 2009-04-27 | 2014-12-09 | Lsi Corporation | Task backpressure and deletion in a multi-flow network processor architecture |
| US8873550B2 (en) | 2010-05-18 | 2014-10-28 | Lsi Corporation | Task queuing in a multi-flow network processor architecture |
| US8949578B2 (en) | 2009-04-27 | 2015-02-03 | Lsi Corporation | Sharing of internal pipeline resources of a network processor with external devices |
| US8949582B2 (en) | 2009-04-27 | 2015-02-03 | Lsi Corporation | Changing a flow identifier of a packet in a multi-thread, multi-flow network processor |
| US8874878B2 (en) | 2010-05-18 | 2014-10-28 | Lsi Corporation | Thread synchronization in a multi-thread, multi-flow network communications processor architecture |
| US8566524B2 (en) | 2009-08-31 | 2013-10-22 | International Business Machines Corporation | Transactional memory system with efficient cache support |
| US9075720B2 (en) | 2010-10-04 | 2015-07-07 | International Business Machines Corporation | Locking a cache line for write operations on a bus |
| US9104678B1 (en) | 2011-12-31 | 2015-08-11 | Richard Michael Nemes | Methods and apparatus for information storage and retrieval using a caching technique with probe-limited open-address hashing |
| US9268596B2 (en) | 2012-02-02 | 2016-02-23 | Intel Corparation | Instruction and logic to test transactional execution status |
| US8938428B1 (en) | 2012-04-16 | 2015-01-20 | Emc Corporation | Systems and methods for efficiently locating object names in a large index of records containing object names |
| WO2014014452A1 (en) * | 2012-07-18 | 2014-01-23 | Empire Technology Development Llc | Virtual cache directory in multi-processor architectures |
| US9081672B1 (en) | 2013-05-30 | 2015-07-14 | Richard Michael Nemes | Methods and apparatus for information storage and retrieval using a caching technique with external-chain hashing and dynamic resource-dependent data shedding |
| US9830275B2 (en) | 2015-05-18 | 2017-11-28 | Imagination Technologies Limited | Translation lookaside buffer |
| US11593167B2 (en) * | 2019-05-09 | 2023-02-28 | International Business Machines Corporation | Thread embedded cache management |
| US11030109B2 (en) * | 2019-06-06 | 2021-06-08 | Samsung Electronics Co., Ltd. | Mechanisms for a contention free lookup in a cache with concurrent insertions and deletions |
| US11151050B2 (en) * | 2020-01-03 | 2021-10-19 | Samsung Electronics Co., Ltd. | Efficient cache eviction and insertions for sustained steady state performance |
Family Cites Families (12)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US4513367A (en) * | 1981-03-23 | 1985-04-23 | International Business Machines Corporation | Cache locking controls in a multiprocessor |
| US4736293A (en) * | 1984-04-11 | 1988-04-05 | American Telephone And Telegraph Company, At&T Bell Laboratories | Interleaved set-associative memory |
| US4926323A (en) * | 1988-03-03 | 1990-05-15 | Advanced Micro Devices, Inc. | Streamlined instruction processor |
| NL8901626A (nl) * | 1989-06-27 | 1991-01-16 | Thomassen & Drijver | Inrichting voor het uitstoten van verkeerd geoerienteerde deksels uit een continue stroom. |
| US5491806A (en) * | 1990-06-26 | 1996-02-13 | Lsi Logic Corporation | Optimized translation lookaside buffer slice having stored mask bits |
| US5325504A (en) * | 1991-08-30 | 1994-06-28 | Compaq Computer Corporation | Method and apparatus for incorporating cache line replacement and cache write policy information into tag directories in a cache system |
| US5353425A (en) * | 1992-04-29 | 1994-10-04 | Sun Microsystems, Inc. | Methods and apparatus for implementing a pseudo-LRU cache memory replacement scheme with a locking feature |
| WO1994003856A1 (en) * | 1992-08-07 | 1994-02-17 | Massachusetts Institute Of Technology | Column-associative cache |
| GB2276961B (en) * | 1993-03-30 | 1997-03-26 | Int Computers Ltd | Set-associative memory |
| US5535365A (en) * | 1993-10-22 | 1996-07-09 | Cray Research, Inc. | Method and apparatus for locking shared memory locations in multiprocessing systems |
| US5727212A (en) * | 1995-04-12 | 1998-03-10 | International Business Machines Corporation | Object oriented device driver system for procedural device drivers |
| US6281893B1 (en) * | 1996-04-04 | 2001-08-28 | Sun Microsystems, Inc. | Method and apparatus for providing an object oriented approach to a device independent graphics control system |
-
1995
- 1995-10-13 US US08/543,105 patent/US5701432A/en not_active Expired - Lifetime
-
1996
- 1996-10-10 DE DE69625768T patent/DE69625768T2/de not_active Expired - Fee Related
- 1996-10-10 EP EP96307364A patent/EP0768608B1/en not_active Expired - Lifetime
- 1996-10-12 CN CN96121911A patent/CN1087451C/zh not_active Expired - Fee Related
- 1996-10-12 KR KR1019960045540A patent/KR970022764A/ko not_active Withdrawn
- 1996-10-14 JP JP8289018A patent/JPH09204357A/ja active Pending
- 1996-11-06 TW TW085113583A patent/TW324081B/zh active
- 1996-12-23 US US08/773,258 patent/US5909695A/en not_active Expired - Lifetime
Also Published As
| Publication number | Publication date |
|---|---|
| EP0768608A2 (en) | 1997-04-16 |
| DE69625768D1 (de) | 2003-02-20 |
| EP0768608B1 (en) | 2003-01-15 |
| TW324081B (en) | 1998-01-01 |
| EP0768608A3 (en) | 1998-08-12 |
| CN1087451C (zh) | 2002-07-10 |
| CN1155121A (zh) | 1997-07-23 |
| US5909695A (en) | 1999-06-01 |
| DE69625768T2 (de) | 2003-09-18 |
| US5701432A (en) | 1997-12-23 |
| KR970022764A (ko) | 1997-05-30 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| JPH09204357A (ja) | マルチスレッド環境を有する計算システム用の最大並行参照キャッシュ | |
| US5265245A (en) | High concurrency in use manager | |
| US6115802A (en) | Efficient hash table for use in multi-threaded environments | |
| CN109407979B (zh) | 多线程持久性b+树数据结构设计与实现方法 | |
| US5414840A (en) | Method and system for decreasing recovery time for failed atomic transactions by keeping copies of altered control structures in main memory | |
| JP4176857B2 (ja) | リファレンスされたオブジェクトを管理するための3状態リファレンスの使用 | |
| US7587566B2 (en) | Realtime memory management via locking realtime threads and related data structures | |
| US5410697A (en) | Concurrency management using version identification of shared data as a supplement to use of locks | |
| US6898650B1 (en) | Queueing method supporting multiple client accesses simultaneously | |
| US6625591B1 (en) | Very efficient in-memory representation of large file system directories | |
| US6804766B1 (en) | Method for managing pages of a designated memory object according to selected memory management policies | |
| US8250047B2 (en) | Hybrid multi-threaded access to data structures using hazard pointers for reads and locks for updates | |
| US5134696A (en) | Virtual lookaside facility | |
| US7065763B1 (en) | Method of reducing contention of a highly contended lock protecting multiple data items | |
| JP2008262585A (ja) | データベース・オブジェクト処理命令を挿入するためにデータベース・アクセス方法を自動的に変更するシステム及び方法 | |
| SG175109A1 (en) | Performing concurrent rehashing of a hash table for multithreaded applications | |
| US7493464B2 (en) | Sparse matrix | |
| US5247647A (en) | Detection of deletion of stored data by concurrently executing processes in a multiprocessing data processing system | |
| US7007146B2 (en) | System and method for relocating pages pinned in a buffer pool of a database system | |
| US20150134900A1 (en) | Cache efficiency in a shared disk database cluster | |
| Singh et al. | Efficient hardware primitives for immediate memory reclamation in optimistic data structures | |
| US10417209B1 (en) | Concurrent index using copy on write | |
| EP0394173A2 (en) | High concurrency manager of open files | |
| Klaftenegger et al. | On the scalability of the Erlang term storage | |
| Malek | An implementation and experimental comparison of dynamic ordered sets |