【文献】
新田淳、外1名,“インメモリDBへの適用に向けた実用的なロックフリーハッシュテーブル”,情報処理学会研究報告 2011(平成23)年度(4)[CD−ROM],一般社団法人情報処理学会,2011年12月15日,p.1−9
(58)【調査した分野】(Int.Cl.,DB名)
【背景技術】
【0002】
計算機システムでは、プロセッサなどの計算機資源を効率的に使用するため、複数のプロセスやスレッドを並行して動作させることが一般的である。厳密には、プロセスとスレッドは完全に同一ではないが、プログラムを実行する単位を意味するという点では同種の概念である。従って、本発明を説明する目的に関する限りでは両者の差異を区別しなくても差し支えないことから、本明細書では、プログラムを実行する単位をスレッドと表記する。
【0003】
複数のプロセッサを有することにより複数のスレッドを同時に並行して実行するように構成された情報システムでは、メモリ上に存在するデータに対して複数のスレッドが並行してアクセスすることがある。各々のスレッドがアクセスするデータが独立している場合は、複数のスレッドがメモリを並行してアクセスしても問題となることはない。しかしながら、関連するデータ、もしくは同一のデータに対して、複数のスレッドが互いを意識することなくアクセスすると、単一のスレッドがデータにアクセスした場合とは異なる実行結果となり、問題が生じる場合がある。
【0004】
例として、複数の要素がポインタで接続されたリスト構造のデータに対して要素を挿入する処理を考える。
図12Aは、要素AとBが連結されたリスト構造のデータの例を示している。この例において、要素AとBの間に要素Nを挿入するという1つのスレッドによる操作は、
図12Bに示すように、要素Bを指している要素Aのポインタ値を要素Nのポインタにコピーした後、Aのポインタに要素Nを示す値を設定することにより行なわれる。
【0005】
ここで、2つのスレッドが同時に同じ位置、すなわち要素AとBの間に要素N1とN2を挿入する操作を行った場合の動作を考える。要素N1を挿入するスレッドは、1)要素Aのポインタ値を要素N1のポインタにコピーした後、2)要素Aのポインタに要素N1を示す値を設定する、という動作を行う。要素N2を挿入するスレッドは、3)要素Aのポインタ値を要素N2のポインタにコピーした後、4)要素Aのポインタに要素N2を示す値を設定する、という動作を行なう。これら1)〜4)の操作が、1)、2)、3)、4)または、3)、4)、1)、2)の順に行なわれた場合は正しい実行結果、すなわち、要素N1およびN2がリストに挿入された状態となる。
【0006】
しかしながら、例えば、1)、3)、2)、4)という順序で、両スレッドの操作が交互に実行された場合は、
図12Cに示すように不正な実行結果となる。このような不正な操作系列の発生を防止する最も単純な方法は、ロックなどの排他制御機構によるクリティカルセクションを用いる方法である。すなわち、1)と2)の操作系列や3)と4)の操作系列のように、間に別のスレッドによる操作が行われると実行結果が不正となる操作系列を実行する際は、まずロックを獲得してクリティカルセクションに入り、次に必要な操作を行い、それが完了した後でロックを解放してクリティカルセクションから抜けることで、クリティカルセクション内で実行した操作系列の間に別のスレッドの操作が割り込むことを防止するわけである。
【0007】
しかしながら、クリティカルセクションを使う方法は、プロセッサ数が多くなるほど性能面での不利益が大きくなることが問題となる。このため、プロセッサが備えるマルチプロセッサ向け命令を使用することで、クリティカルセクションを形成することなく、複数のスレッドからのアクセスを矛盾なく実施する方法が考案されている。ここで使用されているマルチプロセッサ命令の典型例は、非特許文献1に記載されているインテルx86プロセッサのcmpxchg命令である。これは、命令で予約されたレジスタ(32bitデータの場合はeaxレジスタ)とレジスタ・オペランドとメモリ・オペランドの3オペランドを使用する命令であり、1)メモリ・オペランドの値をプロセッサに読み込む、2-1)その値がeaxレジスタの値と一致する場合はメモリにレジスタ・オペランドの値を書き込む、2-2)その値がeaxレジスタの値と一致しない場合はその値をeaxレジスタに書き込む、という一連の操作をアトミックに行うものである。ここでのアトミックは、1)のメモリ読み込み操作と2-1)のメモリ書込み操作の間に、他のプロセッサがメモリをアクセスしないことをハードウェア動作によって保証されていることを意味する。また、このcmpxchg命令が行う操作をCompare And Swap(CAS操作)と称することが多い。
【0008】
CAS操作を用いることで、複数のスレッドが同時にリスト構造データにアクセス(すなわち、リスト構造データに対する要素の挿入や削除、およびリスト構造データの検索)を行なっても、正しい実行結果が得られるアルゴリズムが考案されている。その一例が非特許文献2に示されている。その特徴は、1)CAS操作の対象は、リスト構造のリンク情報を格納するポインタ型のデータである点、2)ポインタ型データの内、通常は0に固定されている下位数ビットをフラグ情報として使用する点である。フラグ情報の内、特に重要なものは、リンク情報は変更することなく、そのエントリが論理的に削除されたことを示すマーク・ビットである。このアルゴリズムでは、CAS操作が失敗しない場合、リスト構造データに対する要素の挿入は挿入位置の検索処理1回とCAS操作1回で行うようになっている。また、リスト構造データに対する要素の削除はリスト構造データ内における削除対象要素の位置を検索する処理1回と、削除対象要素内のポインタ・データにマーク・ビットを設定する、すなわち、論理的に要素を削除するためのCAS操作1回と、削除対象要素の前に位置する要素のポインタ情報を変更し、削除対象要素をリスト構造から取り外す、すなわち、物理的に要素を削除するためのCAS操作1回で行うようになっている。
【0009】
更に、非特許文献2には、複数個の上記リスト構造と、それらリスト構造へのポインタを格納する配列によって実装したハッシュ表が示されている。ハッシュ表とは、検索対象となるデータ(以下、ハッシュ・エントリと呼ぶ)を、検索操作が高速に実行できる方法で格納するもので、一般には、検索操作に加え、ハッシュ・エントリの挿入および削除操作が可能となっている。非特許文献2に記載のハッシュ表については、1)可能なアクセスはハッシュ・エントリの検索・挿入・削除操作であり、2)それらのアクセスはクリティカルセクションを使わずに実行できる(以降、ロック・フリーと呼ぶ)ようになっているので、複数のスレッドが同時並行してハッシュ表のアクセスを実行することができる。すなわち、複数のスレッドが検索操作、挿入操作、削除操作を同時並行して実行することのできるハッシュ表がある。なお、検索操作と挿入操作の代わりに、これらを一つにまとめた検索・挿入操作を基本操作として提供するハッシュ表も存在している。この検索・挿入操作では、最初に検索操作を行い、その結果、検索対象エントリが存在していない場合には、新たなハッシュ・エントリを作成してハッシュ表に挿入する。
【発明を実施するための形態】
【0019】
本発明の実施形態について図面を参照して詳細に説明する。
[第1の実施形態]
図1を参照して、本発明の第1の実施形態におけるシステム(データを格納する装置)の構成を説明する。このシステムは、スレッド2を実行する複数のプロセッサ1と、メモリ10とを備える。
【0020】
メモリ10には、プロセッサ1によりスレッド2で実行するプログラム3と、スレッド2がプログラム3を実行する際に使用するデータ7とが格納されている。プログラム3には、検索・挿入処理、参照削除処理が含まれる。データ4には、複数のリスト5と、それらリスト5へのポインタを格納した配列6とから構成されるハッシュ表7が含まれる。
【0021】
図2を参照して、メモリ10に格納されたデータ4について説明する。リスト5はハッシュ・エントリをポインタで連結(リンク)した構造である。各ハッシュ・エントリは、連結先のハッシュ・エントリを指すポインタと参照カウンタと検索キーとを含む。配列の各要素はリスト5の先頭要素であるハッシュ・エントリを指すポインタである。ハッシュ・エントリ内のポインタや配列の各要素であるポインタがNULL値の場合は、その先に連結されるハッシュ・エントリが存在しないことを示している。さらに、ハッシュ・エントリ内のポインタは、非特許文献2で説明されている通り、通常は0に固定されている下位ビットをフラグ情報として使用する。本実施例では、最下位の1ビットをそのエントリが論理的に削除されたことを示すマーク・ビットとして使用する。
【0022】
図3は、本実施形態で用いる基本操作として、変数vに対し値1を不可分に減算する操作である「atomic
_dec( &v )」と、変数vに対して値oを値nに変更する「cmpxchg」操作を不可分に実行する操作である「atomic
_cmpxchg( &v、 o、 n )」とを示している。
【0023】
次に、本実施形態の全体の動作について、特に、非特許文献2と異なる部分を中心に説明する。
【0024】
前提として、このハッシュ表7に対するアクセス(すなわち、ハッシュ・エントリの検索・挿入および参照削除)は、アクセスを行なうプログラム3が検索キー(key)を与えて起動するものとする。ここで、keyは、大小比較が可能なデータとする。また、検索・挿入および参照削除の基本的な処理フローは、非特許文献2に記載された処理フローに沿って行なわれるものとする。
【0025】
まず、
図4のフローチャートを参照して、本実施形態におけるハッシュ表7に対する総ての操作に共通する位置決め操作の動作を説明する。前述のとおり、この操作は、
図1に示したシステム(装置)が備えるプロセッサ1により実行される。
【0026】
位置決め操作を起動する際に与える引数は、検索キー(key)である。位置決め操作の結果として、ハッシュ・エントリは「curr」へ格納され、「curr」へのポインタを格納しているアドレスは「prev」へ格納され、keyと一致するハッシュ・エントリが見つかったかどうかを示すフラグは「find」に格納される。また、作業用のポインタ変数として、「next」を使用する。
【0027】
検索キー(key)を与えられて位置決め操作が起動すると、ハッシュ表7と同様、key値により一意に決まる配列要素のアドレスを求め、それをポインタ変数であるprevに格納する(ステップ1-1)。
【0028】
次に、prevポインタにより示されるアドレスから、ハッシュ・エントリへのポインタを読み出して「curr」変数に格納する(ステップ1-2)。次に、「curr」変数がNULLかどうかを調べ(ステップ1-3)、NULLの場合は、「find」フラグを「false」に設定して(ステップ1-10)、位置決め操作を終了する。
【0029】
一方、NULLでない場合は、「curr」ポインタが指すハッシュ・エントリ(以降、「curr」エントリと表記する)内のポインタを「next」変数に設定する(ステップ1-4)。次に、「next」ポインタの最下位の1ビット(マークビット)を調べ、「curr」エントリが論理削除されているかどうかを調べる(ステップ1-5)。その結果、「curr」エントリが論理削除されている場合は、「curr」エントリを物理削除し(ステップ1-9)、最初のステップ1-1からやり直す。
【0030】
一方、ステップ1-5で、「curr」エントリが論理削除されていないと判定された場合は、「curr」の検索キーと位置決め操作に与えられたkeyを比較する(ステップ1-6およびステップ1-7)。比較の結果、両キーが一致する場合は「find」フラグを「true」に設定して(ステップ1-11)、位置決め操作を終了する。また、比較の結果、「curr」の検索キーが与えられたkeyより小さい場合は「find」フラグを「false」に設定して(ステップ1-10)、位置決め操作を終了する。両キーの大小関係が上記のどちらでもない場合(「curr」の検索キーが与えられたkeyより大きい場合)は、「curr」エントリ内においてポインタが格納されているアドレスを「prev」ポインタ変数に設定して(ステップ1-8)、ステップ1-2に戻る。
【0031】
次に、
図5のフローチャートを参照して本実施の形態におけるハッシュ表7に対する検索・挿入操作の動作を説明する。前述のとおり、この操作は、
図1に示したシステム(装置)が備えるプロセッサ1により実行される。
【0032】
検索・挿入操作を起動する際に与える引数は、検索キー(key)であり、検索・挿入操作の結果は、1) 実行した操作内容が検索なのか挿入なのかを識別する情報と、2) ハッシュ表7においてkeyに一致する検索キーを格納しているハッシュ・エントリへのポインタである。
【0033】
検索・挿入操作では、まず、keyを引数として、
図4を参照して説明した位置決め操作を起動し(ステップ2-1)、実行結果として「find」フラグと「prev」、および「curr」ポインタを受け取る。
【0034】
次に、「find」フラグの値を調べ(ステップ2-2)、それが「true」であると判定された場合は、変数rに「curr」エントリにある参照カウンタの値を設定し(ステップ2-6)、rの値が0かどうかを調べる(ステップ2-7)。その結果、rの値が0であると判定された場合は、そのエントリを使用できないことを意味しているので、前記の位置決め操作から始める検索操作は失敗であり、「curr」エントリの論理削除操作を行い(ステップ2-10)、ステップ2-1に戻る。一方、rの値が0ではないと判定された場合は、「curr」エントリにある参照カウンタの値をrからr+1に変更する「atomic
_cmpxchg」操作を行う(ステップ2-8)。すなわち、検索・挿入操作のステップ2-7、2-8、2-10では、「curr」エントリの参照カウンタの値が0であるとき(特定の値であるとき)は、「curr」エントリの論理削除操作を行い、参照カウンタの値が0ではないとき(特定の値ではないとき)は、「curr」エントリの参照カウンタの値を1つカウントアップする。
【0035】
この「atomic
_cmpxchg」操作が成功すると、検索・挿入操作の結果として、実行した操作内容を検索、実行結果であるハッシュ・エントリへのポインタを「curr」とし(ステップ2-9)、検索・挿入操作を終了する。一方、ステップ2-8の「cmpxchg」操作が失敗すると(
図5には記載されていないが)、ステップ2-6に戻る。
【0036】
ステップ2-2にて、「find」フラグの値が「false」であると判定された場合、新しいハッシュ・エントリ(n)を作成する。作成されたハッシュ・エントリのポインタには、「curr」エントリのアドレス、検索キーにkey、参照カウンタに1をそれぞれ設定する(ステップ2-3)。「prev」ポインタの位置に格納されているポインタを「curr」から新エントリ(n)のアドレスに書き換える「cmpxchg」操作を行う(ステップ2-4)。
【0037】
この「atomic
_cmpxchg」操作が成功すると、検索・挿入操作の結果として、実行した操作内容を挿入、実行結果であるハッシュ・エントリへのポインタを新エントリのアドレスとし(ステップ2-5)、検索・挿入操作を終了する。一方、ステップ2-4の「cmpxchg」操作が失敗すると(
図5には記載されていないが)、新エントリを削除した上でステップ2-1に戻る。
【0038】
次に、
図6のフローチャートを参照して本実施形態におけるハッシュ表に対する参照削除操作の動作を説明する。前述のとおり、この操作は、
図1に示したシステム(装置)が備えるプロセッサにより実行される。参照削除操作を起動する際に与える引数は、検索キー(key)であり、参照削除操作の結果は、参照削除操作が成功したか否かを示すフラグである。
【0039】
参照削除操作では、まず、keyを引数として、
図4を参照して説明した位置決め操作を起動し(ステップ3-1)、実行結果として「find」フラグ、「prev」、および「curr」ポインタを受け取る。
【0040】
次に、「find」フラグの値を調べ(ステップ3-2)、値が「true」と判定された場合は、「curr」エントリの参照カウンタに対して「atomic
_dec」操作を実行し、減算後の値をrに格納する(ステップ3-3)。すなわち、参照削除操作のステップ3-3では、「curr」エントリの参照カウンタの値を1つカウントダウンする。
【0041】
次に、rの値が0かどうかを調べ(ステップ3-4)、その結果、rの値が0でないと判定された場合は参照削除操作を成功として(ステップ3-6)、参照削除操作を終了する。また、ステップ3-4にて、rの値が0であると判定された場合は、「curr」エントリの論理削除と物理削除操作を実行し(ステップ3-5)、ステップ3-6に進む。すなわち、参照削除操作のステップ3-4、3-5、3-6では、「curr」エントリの参照カウンタの値が0であるとき(特定の値であるとき)は、「curr」エントリの論理削除および物理削除の操作を行い、参照カウンタの値が0ではないとき(特定の値ではないとき)は、「curr」エントリの削除の操作を行わない。
【0042】
また、ステップ3-2において、「find」フラグの値が「false」であると判定された場合は、参照削除操作を失敗として(ステップ3-7)、参照削除操作を終了する。
【0043】
図7のフローチャートを参照して本実施の形態において、アプリケーションが検索キー(key)を持つハッシュ・エントリに対して操作を行う動作を説明する。このようなアプリケーション処理の最初のステップは、keyを引数として検索・挿入操作を起動することである(ステップ4-1)。この検索・挿入処理の実行結果として得られるハッシュ・エントリeに対して、アプリケーション固有の処理を実行し(ステップ4-2)、最後に、keyを引数として参照削除操作を起動する。他のスレッドがハッシュ・エントリeを使用していない場合は、その参照削除操作により、ハッシュ・エントリeの参照カウンタが0になるので、ハッシュ・エントリeはハッシュ表から削除される。また、複数のスレッド2が
図7に示された手順に従ってハッシュ・エントリeを並行してアクセスした場合は、最後に起動された参照削除操作より、ハッシュ・エントリeの参照カウンタが0になるので、その参照削除操作を起動したスレッド2によってハッシュ・エントリeがハッシュ表7から削除される。
【0044】
なお、複数のスレッド2が並行してハッシュ・エントリeにアクセスしている場合において、あるスレッド2(第1のスレッド)が参照カウンタを0にした後、その参照カウンタを参照する前に、他のスレッド2(第2のスレッド)がその参照カウンタを参照したときは、第2のスレッドがハッシュ・エントリeをハッシュ表7から削除する。すなわち、所定のタイミングでハッシュ・エントリの削除操作を含むスレッド2(プロセス)の実行命令を受けたときは、参照カウンタを0にするスレッド2(プロセス)とハッシュ・エントリeをハッシュ表7から削除するスレッド2(プロセス)とが異なる。
【0045】
以上のように本実施形態において、複数のスレッド2(プロセス)は、ハッシュ表7の同じハッシュ・エントリ(例えば、ハッシュ・エントリe)に対してアクセスする。プロセッサ1は、あるスレッド2(プロセス)の実行命令を受けたときに、そのスレッ2ドに含まれるハッシュ・エントリeの操作に応じてハッシュ・エントリeの参照カウンタの値を増減する。プロセッサ1は、ハッシュ・エントリeの削除操作を含む他のスレッドの実行命令を受けたときに、ハッシュ・エントリeの参照カウンタの値に応じて(特定の値(例えば、0)のときのみ)ハッシュ・エントリeの削除操作を実行する。その結果、クリティカルセクションを使うことなく、ハッシュ表7に対する複数の処理を正常に実行させることができる。
【0046】
[第2の実施形態]
本実施形態では、-1を参照カウンタにおける特定の値とするハッシュ表7のハッシュ・エントリに対する操作について説明する。各スレッド2が検索・挿入操作と参照削除処理を対にして行なうようになっていると、参照カウンタの値は常に0以上となる。そのため、本実施形態では、ハッシュ表7からハッシュ・エントリを削除する操作は、検索・挿入操作および参照削除処理とは別に用意する。
【0047】
図8は、本実施形態におけるシステム(データを格納する装置)の構成の例を示している。この例では、プログラム31は、検索・挿入処理および参照削除処理に加えて、削除処理を含んでいる。その他の点については、本発明の第1の実施形態と同じである。また、本実施形態において、リスト51や不可分メモリ・アクセス操作は、各々、第1の実施形態と同じ
図2と
図3に示すものを用いる点、このハッシュ表71に対するアクセスは、アクセスを行なうプログラム31が検索キー(key)を与えて起動する点、keyは、大小比較が可能なデータである点、および、
図4のフローチャートで示されている位置決め操作を本実施形態におけるハッシュ表に対する総ての操作に共通する位置決め操作として使用する点は、第1の実施形態と同じである。
【0048】
まず、
図9のフローチャートを参照して本実施形態におけるハッシュ表71に対する検索・挿入操作の動作を説明する。検索・挿入操作を起動する際に与える引数は、検索キー(key)である。検索・挿入操作の結果は、1) 実行した操作内容が検索なのか挿入なのかを識別する情報と、2) ハッシュ表71においてkeyに一致する検索キーを格納しているハッシュ・エントリへのポインタである。
【0049】
検索・挿入操作では、まず、keyを引数として、前記の位置決め操作を起動し(ステップ5-1)、実行結果として「find」フラグと「prev」、および「curr」ポインタを受け取る。次に、「find」フラグの値を調べ(ステップ5-2)、その値が「true」であると判定された場合は、変数rに「curr」エントリにある参照カウンタの値を設定し(ステップ5-6)、rの値が-1かどうかを調べる(ステップ5-7)。
【0050】
その結果、rの値が-1の場合は、そのハッシュ・エントリは後述の削除操作により削除されている途中であることから、前記の位置決め操作から始まる検索操作は失敗であり、処理フローをステップ5-1に戻す。ここで、ステップ5-7から5-1に戻る間に一定時間経過するのを待つ処理を含めても良い。
【0051】
一方、rの値が-1でない場合は、「curr」エントリにある参照カウンタの値をrからr+1に変更する「atomic
_cmpxchg」操作を行う(ステップ5-8)。この「atomic
_cmpxchg」操作が成功すると、検索・挿入操作の結果として、実行した操作内容を検索、実行結果であるハッシュ・エントリへのポインタを「curr」とし(ステップ5-9)、検索・挿入操作を終了する。一方、ステップ5-8の「cmpxchg」操作が失敗すると(
図9には記載されていないが)、ステップ5-6に戻る。また、ステップ5-2にて「find」フラグを調べた結果が「false」の場合の動作は、本発明の第一の実施の形態と同じである。
【0052】
次に、
図10のフローチャートを参照して本実施の形態におけるハッシュ表71に対する参照削除操作の動作を説明する。参照削除操作を起動する際に与える引数は、検索キー(key)である。参照削除操作の結果は、参照削除操作が成功したか否かを示すフラグである。
【0053】
参照削除操作では、まず、keyを引数として、
図4を参照して説明した位置決め操作を起動し(ステップ6-1)、実行結果として「find」フラグ、「prev」、および「curr」ポインタを受け取る。次に、「find」フラグの値を調べ(ステップ6-2)、値が「true」であると判定された場合は、変数rに「curr」エントリにある参照カウンタの値を設定し(ステップ6-3)、その値が-1かどうかを調べる(ステップ6-4)。
【0054】
その結果、rの値が-1の場合は、ステップ6-1に戻る。ステップ6-4から6-1に戻る間に一定時間経過するのを待つ処理を含めても良い。一方、rの値が-1でない場合は、「curr」エントリにある参照カウンタの値をrからr-1に変更する「atomic
_cmpxchg」操作を行う(ステップ6-5)。すなわち、削除操作を含む参照削除操作において、参照カウンタの値が特定の値のとき、参照カウンタの値をカウントダウンする。
【0055】
この「atomic
_cmpxchg」操作が成功すると、参照削除操作を成功として(ステップ6-6)、参照削除操作を終了する。一方、ステップ6-5の「cmpxchg」操作が失敗すると(
図10には記載されていないが)、ステップ6-3に戻る。なお、ステップ6-2において、「find」フラグが「false」となった場合は、参照削除操作を失敗として(ステップ6-7)、参照削除操作を終了する。
【0056】
次に、
図11のフローチャートを参照して本実施の形態におけるハッシュ表71に対する削除操作の動作を説明する。この操作は、
図8に示したシステム(装置)が備えるプロセッサ11によりスレッド21で実行される。削除操作を起動する際に与える引数は、検索キー(key)である。削除操作の結果は、削除操作が成功したか否かを示すフラグである。
【0057】
削除操作では、まず、keyを引数として、
図4を参照して説明した位置決め操作を起動し(ステップ7-1)、実行結果として「find」フラグ、「prev」、および「curr」ポインタを受け取る。次に、「find」フラグの値を調べ(ステップ7-2)、その値が「true」であると判定された場合は、変数rに「curr」エントリにある参照カウンタの値を設定し(ステップ7-3)、その値が0かどうかを調べる(ステップ7-4)。
【0058】
その結果、rの値が0以外の値の場合は、削除操作の結果を失敗として(ステップ7-8)、削除操作を終了する。一方、ステップ7-4においてrの値が0の場合は、「curr」エントリにある参照カウンタの値を0から-1に変更する「atomic
_cmpxchg」操作を行う(ステップ7-5)。この「atomic
_cmpxchg」操作が成功すると、「curr」エントリの論理削除と物理削除を行い(ステップ7-6)、削除操作を成功として(ステップ7-7)、参照削除操作を終了する。ステップ7-5の「cmpxchg」操作が失敗すると(
図11には記載されていないが)、ステップ7-3に戻る。また、ステップ7-2において、「find」フラグが「false」となった場合は、削除操作を失敗として(ステップ7-8)、削除操作を終了する。
【0059】
以上のように本実施形態によれば、ハッシュ表71からハッシュ・エントリを削除する操作を実行するプロセスは、検索・挿入操作および参照削除処理を実行するプロセスとは別のプロセスとなる。
【0060】
本実施形態では、削除操作内で対象エントリの論理削除と物理削除を行なっているが、この方法に限定するものではない。変形例として、削除操作では参照カウンタを-1に変更するのみとしておき、参照カウンタが-1となっているハッシュ・エントリの論理削除と物理削除を行なう操作を別に設けることとしても良い。
【0061】
本実施形態において、アプリケーションが検索キー(key)を持つハッシュ・エントリに対して操作を行う動作は、
図7に示した本発明の第1の実施の形態におけるアプリケーション動作と同じである。また、アプリケーションが検索キー(key)を持つハッシュ・エントリを削除する動作は、単にkeyをパラメータとする削除操作を呼び出すのみである。
【0062】
上述した実施形態の一部または全部は、以下の付記のようにも記載され得るが、本発明を以下のように限定するものではない。
この出願は、2012年10月24日に出願された日本出願特願2012−234776を基礎とする優先権を主張し、その開示の全てをここに取り込む。
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【0063】
(付記1) ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段と、
プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第1の実行手段と、
前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第2の実行手段と
を備えることを特徴とするデータ格納装置。
【0064】
(付記2) 前記第1の実行手段が実行命令を受けた前記プロセスは、前記第2の実行手段が実行命令を受けた前記プロセスとは別のプロセスであることを特徴とする付記1に記載のデータ格納装置。
【0065】
(付記3) 前記第1の実行手段が実行命令を受けた前記プロセスは、前記ハッシュ・エントリの検索操作、挿入操作又は削除操作のうち、少なくとも複数の異なる操作を含むことを特徴とする付記1又は2に記載のデータ格納装置。
【0066】
(付記4) 前記第1の実行手段は、前記ハッシュ・エントリの操作が検索操作であり、かつ、前記カウンタの値が特定の値ではないとき、前記カウンタの値をカウントアップすることを特徴とする付記3に記載のデータ格納装置。
【0067】
(付記5) 前記第1の実行手段は、前記ハッシュ・エントリの操作が削除操作であり、かつ、前記カウンタの値が特定の値ではないとき、前記カウンタの値をカウントダウンすることを特徴とする付記3又は4に記載のデータ格納装置。
【0068】
(付記6) プロセッサと、ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段とを備える装置において実施される方法であって、
前記プロセッサが、プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第1の実行ステップと、
前記プロセッサが、前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第2の実行ステップと
を備えることを特徴とするデータ格納方法。
【0069】
(付記7) コンピュータを
ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段、
プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第1の実行手段、
前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第2の実行手段
として機能させるためのプログラム。