(57)【要約】  データ格納装置は、プロセスの実行命令を受けたときに、当該プロセスに含まれるハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応するカウンタの値をカウントアップ又はダウンする手段と、ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、ハッシュ・エントリの削除操作を実行する手段とを備える。
2014064914.tif 000002
【特許請求の範囲】
【請求項１】
ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段と、
プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第１の実行手段と、
前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第２の実行手段と
を備えることを特徴とするデータ格納装置。
【請求項２】
所定のタイミングで前記第２の実行手段が前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたとき、前記第１の実行手段が実行命令を受けた前記プロセスは、前記第２の実行手段が実行命令を受けた前記プロセスとは別のプロセスであることを特徴とする請求項１に記載のデータ格納装置。
【請求項３】
前記第１の実行手段が実行命令を受けた前記プロセスは、前記ハッシュ・エントリの検索操作、挿入操作又は削除操作のうち、少なくとも複数の異なる操作を含むことを特徴とする請求項１又は２に記載のデータ格納装置。
【請求項４】
前記第１の実行手段は、前記ハッシュ・エントリの操作が検索操作であり、かつ、前記カウンタの値が特定の値ではないとき、前記カウンタの値をカウントアップすることを特徴とする請求項３に記載のデータ格納装置。
【請求項５】
前記第１の実行手段は、前記ハッシュ・エントリの操作が削除操作であり、かつ、前記カウンタの値が特定の値ではないとき、前記カウンタの値をカウントダウンすることを特徴とする請求項３又は４に記載のデータ格納装置。
【請求項６】
プロセッサと、ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段とを備える装置において実施される方法であって、
前記プロセッサが、プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第１の実行ステップと、
前記プロセッサが、前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第２の実行ステップと
を備えることを特徴とするデータ格納方法。
【請求項７】
コンピュータを
ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段、
プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第１の実行手段、
前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第２の実行手段として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチプロセッサ・システムにおけるデータ格納技術に関し、特に、検索、挿入および削除の操作が並行して実行可能な方法でデータを格納するデータ格納技術に関する。
【背景技術】
【０００２】
計算機システムでは、プロセッサなどの計算機資源を効率的に使用するため、複数のプロセスやスレッドを並行して動作させることが一般的である。厳密には、プロセスとスレッドは完全に同一ではないが、プログラムを実行する単位を意味するという点では同種の概念である。従って、本発明を説明する目的に関する限りでは両者の差異を区別しなくても差し支えないことから、本明細書では、プログラムを実行する単位をスレッドと表記する。【０００３】
複数のプロセッサを有することにより複数のスレッドを同時に並行して実行するように構成された情報システムでは、メモリ上に存在するデータに対して複数のスレッドが並行してアクセスすることがある。各々のスレッドがアクセスするデータが独立している場合は、複数のスレッドがメモリを並行してアクセスしても問題となることはない。しかしながら、関連するデータ、もしくは同一のデータに対して、複数のスレッドが互いを意識することなくアクセスすると、単一のスレッドがデータにアクセスした場合とは異なる実行結果となり、問題が生じる場合がある。【０００４】
例として、複数の要素がポインタで接続されたリスト構造のデータに対して要素を挿入する処理を考える。図１２Ａは、要素AとBが連結されたリスト構造のデータの例を示している。この例において、要素AとBの間に要素Nを挿入するという１つのスレッドによる操作は、図１２Ｂに示すように、要素Bを指している要素Aのポインタ値を要素Nのポインタにコピーした後、Aのポインタに要素Nを示す値を設定することにより行なわれる。【０００５】
ここで、２つのスレッドが同時に同じ位置、すなわち要素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がリストに挿入された状態となる。【０００６】
しかしながら、例えば、1)、3)、2)、4)という順序で、両スレッドの操作が交互に実行された場合は、図１２Ｃに示すように不正な実行結果となる。このような不正な操作系列の発生を防止する最も単純な方法は、ロックなどの排他制御機構によるクリティカルセクションを用いる方法である。すなわち、1)と2)の操作系列や3)と4)の操作系列のように、間に別のスレッドによる操作が行われると実行結果が不正となる操作系列を実行する際は、まずロックを獲得してクリティカルセクションに入り、次に必要な操作を行い、それが完了した後でロックを解放してクリティカルセクションから抜けることで、クリティカルセクション内で実行した操作系列の間に別のスレッドの操作が割り込むことを防止するわけである。【０００７】
しかしながら、クリティカルセクションを使う方法は、プロセッサ数が多くなるほど性能面での不利益が大きくなることが問題となる。このため、プロセッサが備えるマルチプロセッサ向け命令を使用することで、クリティカルセクションを形成することなく、複数のスレッドからのアクセスを矛盾なく実施する方法が考案されている。ここで使用されているマルチプロセッサ命令の典型例は、非特許文献１に記載されているインテルx86プロセッサのcmpxchg命令である。これは、命令で予約されたレジスタ（32bitデータの場合はeaxレジスタ）とレジスタ・オペランドとメモリ・オペランドの３オペランドを使用する命令であり、1)メモリ・オペランドの値をプロセッサに読み込む、2-1)その値がeaxレジスタの値と一致する場合はメモリにレジスタ・オペランドの値を書き込む、2-2)その値がeaxレジスタの値と一致しない場合はその値をeaxレジスタに書き込む、という一連の操作をアトミックに行うものである。ここでのアトミックは、1)のメモリ読み込み操作と2-1)のメモリ書込み操作の間に、他のプロセッサがメモリをアクセスしないことをハードウェア動作によって保証されていることを意味する。また、このcmpxchg命令が行う操作をCompare And Swap（CAS操作）と称することが多い。【０００８】
CAS操作を用いることで、複数のスレッドが同時にリスト構造データにアクセス（すなわち、リスト構造データに対する要素の挿入や削除、およびリスト構造データの検索）を行なっても、正しい実行結果が得られるアルゴリズムが考案されている。その一例が非特許文献２に示されている。その特徴は、１）CAS操作の対象は、リスト構造のリンク情報を格納するポインタ型のデータである点、２）ポインタ型データの内、通常は0に固定されている下位数ビットをフラグ情報として使用する点である。フラグ情報の内、特に重要なものは、リンク情報は変更することなく、そのエントリが論理的に削除されたことを示すマーク・ビットである。このアルゴリズムでは、CAS操作が失敗しない場合、リスト構造データに対する要素の挿入は挿入位置の検索処理１回とCAS操作１回で行うようになっている。また、リスト構造データに対する要素の削除はリスト構造データ内における削除対象要素の位置を検索する処理１回と、削除対象要素内のポインタ・データにマーク・ビットを設定する、すなわち、論理的に要素を削除するためのCAS操作１回と、削除対象要素の前に位置する要素のポインタ情報を変更し、削除対象要素をリスト構造から取り外す、すなわち、物理的に要素を削除するためのCAS操作１回で行うようになっている。【０００９】
更に、非特許文献２には、複数個の上記リスト構造と、それらリスト構造へのポインタを格納する配列によって実装したハッシュ表が示されている。ハッシュ表とは、検索対象となるデータ（以下、ハッシュ・エントリと呼ぶ）を、検索操作が高速に実行できる方法で格納するもので、一般には、検索操作に加え、ハッシュ・エントリの挿入および削除操作が可能となっている。非特許文献２に記載のハッシュ表については、1)可能なアクセスはハッシュ・エントリの検索・挿入・削除操作であり、2)それらのアクセスはクリティカルセクションを使わずに実行できる（以降、ロック・フリーと呼ぶ）ようになっているので、複数のスレッドが同時並行してハッシュ表のアクセスを実行することができる。すなわち、複数のスレッドが検索操作、挿入操作、削除操作を同時並行して実行することのできるハッシュ表がある。なお、検索操作と挿入操作の代わりに、これらを一つにまとめた検索・挿入操作を基本操作として提供するハッシュ表も存在している。この検索・挿入操作では、最初に検索操作を行い、その結果、検索対象エントリが存在していない場合には、新たなハッシュ・エントリを作成してハッシュ表に挿入する。
【先行技術文献】
【非特許文献】
【００１０】
【非特許文献１】“IntelR 64 and IA-32 Architectures Software Developer's Manual Volume 2A: Instruction Set Reference,A-L”、［online］、Intel、インターネット〈URL：http://www.intel.com/Assets/PDF/manual/253666.pdf〉
【非特許文献２】Maged M Michael、“High Performance Dynamic Lock-Free Hash Tables and List-Based Sets”、 ACM SPAA’02
【発明の開示】
【発明が解決しようとする課題】
【００１１】
問題点は、第一のスレッドがまずロック・フリーのハッシュ表を検索してハッシュ・エントリを取得し、次にそのハッシュ・エントリを使って処理する場合において、検索から処理の間に第二のスレッドがそのハッシュ・エントリを削除してしまうと、第一のスレッドによる処理が正常に実行できない可能性が生じることである。【００１２】
その理由は、第一のスレッドによる検索から処理の間に第二のスレッドがそのハッシュ・エントリを削除してしまうと、第一のスレッドによるハッシュ・エントリを使う処理の時点でハッシュ・エントリが削除されているためである。【００１３】
本発明の主たる目的は、ハッシュ表に対する複数の処理を正常に実行させる技術を提供することである。
【課題を解決するための手段】
【００１４】
本発明のデータ格納装置は、ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段と、プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第１の実行手段と、前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第２の実行手段とを備えることを特徴とする。【００１５】
本発明のデータ格納方法は、プロセッサと、ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段とを備える装置において実施される方法であって、前記プロセッサが、プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第１の実行ステップと、前記プロセッサが、前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第２の実行ステップとを備えることを特徴とする。【００１６】
本発明のプログラムは、コンピュータを、ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段、プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第１の実行手段、前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第２の実行手段、として機能させることを特徴とする。
本発明は、上記プログラムが格納された、コンピュータ読み取り可能な不揮発性の記憶媒体によっても実現される。
【発明の効果】
【００１７】
本発明によれば、ハッシュ表に対する複数の処理を正常に実行させる技術を提供することができる。
【図面の簡単な説明】
【００１８】
【図１】本発明の一実施形態におけるシステムの構成を示すブロック図である。
【図２】本発明の一実施形態で使用するリスト構造およびリストの要素であるハッシュ・エントリの構造を示す図である。
【図３】本発明の一実施形態で使用する不可分操作について説明する図である。
【図４】本発明の一実施形態におけるハッシュ表に対する総ての操作に共通する位置決め操作の動作を示す流れ図である。
【図５】本発明の一実施形態におけるハッシュ表に対する検索・挿入操作の動作を示す流れ図である。
【図６】本発明の一実施形態におけるハッシュ表に対する参照削除操作の動作を示す流れ図である。
【図７】本発明の一実施形態におけるアプリケーションがハッシュ・エントリに対して行う操作を示す流れ図である。
【図８】本発明の他の実施形態におけるシステムの構成を示すブロック図である。
【図９】本発明の他の実施の形態におけるハッシュ表に対する検索・挿入操作の動作を示す流れ図である。
【図１０】本発明の他の実施形態におけるハッシュ表に対する参照削除操作の動作を示す流れ図である。
【図１１】本発明の他の実施の形態におけるハッシュ表に対する削除操作の動作を示す流れ図である。
【図１２Ａ】リスト構造データを示す図である。
【図１２Ｂ】リスト構造データに対する要素の挿入操作を表す図である。
【図１２Ｃ】２スレッドが同時並行して挿入操作が実施される様子を表す図である。
【発明を実施するための形態】
【００１９】
本発明の実施形態について図面を参照して詳細に説明する。
［第１の実施形態］
図１を参照して、本発明の第１の実施形態におけるシステム（データを格納する装置）の構成を説明する。このシステムは、スレッド２を実行する複数のプロセッサ１と、メモリ１０とを備える。
【００２０】
メモリ１０には、プロセッサ１によりスレッド２で実行するプログラム３と、スレッド２がプログラム３を実行する際に使用するデータ７とが格納されている。プログラム３には、検索・挿入処理、参照削除処理が含まれる。データ４には、複数のリスト５と、それらリスト５へのポインタを格納した配列６とから構成されるハッシュ表７が含まれる。
【００２１】
図２を参照して、メモリ１０に格納されたデータ４について説明する。リスト５はハッシュ・エントリをポインタで連結（リンク）した構造である。各ハッシュ・エントリは、連結先のハッシュ・エントリを指すポインタと参照カウンタと検索キーとを含む。配列の各要素はリスト５の先頭要素であるハッシュ・エントリを指すポインタである。ハッシュ・エントリ内のポインタや配列の各要素であるポインタがNULL値の場合は、その先に連結されるハッシュ・エントリが存在しないことを示している。さらに、ハッシュ・エントリ内のポインタは、非特許文献２で説明されている通り、通常は0に固定されている下位ビットをフラグ情報として使用する。本実施例では、最下位の1ビットをそのエントリが論理的に削除されたことを示すマーク・ビットとして使用する。
【００２２】
図３は、本実施形態で用いる基本操作として、変数vに対し値1を不可分に減算する操作である「atomic_dec( &v )」と、変数vに対して値oを値nに変更する「cmpxchg」操作を不可分に実行する操作である「atomic_cmpxchg( &v、 o、 n )」とを示している。
【００２３】
次に、本実施形態の全体の動作について、特に、非特許文献２と異なる部分を中心に説明する。
【００２４】
前提として、このハッシュ表７に対するアクセス（すなわち、ハッシュ・エントリの検索・挿入および参照削除）は、アクセスを行なうプログラム３が検索キー（key）を与えて起動するものとする。ここで、keyは、大小比較が可能なデータとする。また、検索・挿入および参照削除の基本的な処理フローは、非特許文献２に記載された処理フローに沿って行なわれるものとする。
【００２５】
まず、図４のフローチャートを参照して、本実施形態におけるハッシュ表７に対する総ての操作に共通する位置決め操作の動作を説明する。前述のとおり、この操作は、図１に示したシステム（装置）が備えるプロセッサ１により実行される。
【００２６】
位置決め操作を起動する際に与える引数は、検索キー（key）である。位置決め操作の結果として、ハッシュ・エントリは「curr」へ格納され、「curr」へのポインタを格納しているアドレスは「prev」へ格納され、keyと一致するハッシュ・エントリが見つかったかどうかを示すフラグは「find」に格納される。また、作業用のポインタ変数として、「next」を使用する。
【００２７】
検索キー（key）を与えられて位置決め操作が起動すると、ハッシュ表７と同様、key値により一意に決まる配列要素のアドレスを求め、それをポインタ変数であるprevに格納する（ステップ1-1）。
【００２８】
次に、prevポインタにより示されるアドレスから、ハッシュ・エントリへのポインタを読み出して「curr」変数に格納する（ステップ1-2）。次に、「curr」変数がNULＬかどうかを調べ（ステップ1-3）、NULLの場合は、「find」フラグを「false」に設定して（ステップ1-10）、位置決め操作を終了する。
【００２９】
一方、NULLでない場合は、「curr」ポインタが指すハッシュ・エントリ（以降、「curr」エントリと表記する）内のポインタを「next」変数に設定する（ステップ1-4）。次に、「next」ポインタの最下位の1ビット（マークビット）を調べ、「curr」エントリが論理削除されているかどうかを調べる（ステップ1-5）。その結果、「curr」エントリが論理削除されている場合は、「curr」エントリを物理削除し（ステップ1-9）、最初のステップ1-1からやり直す。
【００３０】
一方、ステップ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に戻る。
【００３１】
次に、図５のフローチャートを参照して本実施の形態におけるハッシュ表７に対する検索・挿入操作の動作を説明する。前述のとおり、この操作は、図１に示したシステム（装置）が備えるプロセッサ１により実行される。
【００３２】
検索・挿入操作を起動する際に与える引数は、検索キー（key）であり、検索・挿入操作の結果は、1) 実行した操作内容が検索なのか挿入なのかを識別する情報と、2) ハッシュ表７においてkeyに一致する検索キーを格納しているハッシュ・エントリへのポインタである。
【００３３】
検索・挿入操作では、まず、keyを引数として、図４を参照して説明した位置決め操作を起動し（ステップ2-1）、実行結果として「find」フラグと「prev」、および「curr」ポインタを受け取る。
【００３４】
次に、「find」フラグの値を調べ（ステップ2-2）、それが「true」であると判定された場合は、変数rに「curr」エントリにある参照カウンタの値を設定し（ステップ2-6）、ｒの値が0かどうかを調べる（ステップ2-7）。その結果、rの値が0であると判定された場合は、そのエントリを使用できないことを意味しているので、前記の位置決め操作から始める検索操作は失敗であり、「curr」エントリの論理削除操作を行い（ステップ2-10）、ステップ2-1に戻る。一方、rの値が0ではないと判定された場合は、「curr」エントリにある参照カウンタの値をｒからr+1に変更する「atomic_cmpxchg」操作を行う（ステップ2-8）。すなわち、検索・挿入操作のステップ2-7、2-8、2-10では、「curr」エントリの参照カウンタの値が0であるとき（特定の値であるとき）は、「curr」エントリの論理削除操作を行い、参照カウンタの値が0ではないとき（特定の値ではないとき）は、「curr」エントリの参照カウンタの値を１つカウントアップする。
【００３５】
この「atomic_cmpxchg」操作が成功すると、検索・挿入操作の結果として、実行した操作内容を検索、実行結果であるハッシュ・エントリへのポインタを「curr」とし（ステップ2-9）、検索・挿入操作を終了する。一方、ステップ2-8の「cmpxchg」操作が失敗すると（図5には記載されていないが）、ステップ2-6に戻る。
【００３６】
ステップ2-2にて、「find」フラグの値が「false」であると判定された場合、新しいハッシュ・エントリ（n）を作成する。作成されたハッシュ・エントリのポインタには、「curr」エントリのアドレス、検索キーにkey、参照カウンタに1をそれぞれ設定する（ステップ2-3）。「prev」ポインタの位置に格納されているポインタを「curr」から新エントリ（n）のアドレスに書き換える「cmpxchg」操作を行う（ステップ2-4）。
【００３７】
この「atomic_cmpxchg」操作が成功すると、検索・挿入操作の結果として、実行した操作内容を挿入、実行結果であるハッシュ・エントリへのポインタを新エントリのアドレスとし（ステップ2-5）、検索・挿入操作を終了する。一方、ステップ2-4の「cmpxchg」操作が失敗すると（図５には記載されていないが）、新エントリを削除した上でステップ2-1に戻る。
【００３８】
次に、図６のフローチャートを参照して本実施形態におけるハッシュ表に対する参照削除操作の動作を説明する。前述のとおり、この操作は、図１に示したシステム（装置）が備えるプロセッサにより実行される。参照削除操作を起動する際に与える引数は、検索キー（key）であり、参照削除操作の結果は、参照削除操作が成功したか否かを示すフラグである。
【００３９】
参照削除操作では、まず、keyを引数として、図４を参照して説明した位置決め操作を起動し（ステップ3-1）、実行結果として「find」フラグ、「prev」、および「curr」ポインタを受け取る。
【００４０】
次に、「find」フラグの値を調べ（ステップ3-2）、値が「true」と判定された場合は、「curr」エントリの参照カウンタに対して「atomic_dec」操作を実行し、減算後の値をrに格納する（ステップ3-3）。すなわち、参照削除操作のステップ3-3では、「curr」エントリの参照カウンタの値を１つカウントダウンする。
【００４１】
次に、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」エントリの削除の操作を行わない。
【００４２】
また、ステップ3-2において、「find」フラグの値が「false」であると判定された場合は、参照削除操作を失敗として（ステップ3-7）、参照削除操作を終了する。
【００４３】
図７のフローチャートを参照して本実施の形態において、アプリケーションが検索キー（key）を持つハッシュ・エントリに対して操作を行う動作を説明する。このようなアプリケーション処理の最初のステップは、keyを引数として検索・挿入操作を起動することである（ステップ4-1）。この検索・挿入処理の実行結果として得られるハッシュ・エントリeに対して、アプリケーション固有の処理を実行し（ステップ4-2）、最後に、keyを引数として参照削除操作を起動する。他のスレッドがハッシュ・エントリeを使用していない場合は、その参照削除操作により、ハッシュ・エントリeの参照カウンタが0になるので、ハッシュ・エントリeはハッシュ表から削除される。また、複数のスレッド２が図７に示された手順に従ってハッシュ・エントリeを並行してアクセスした場合は、最後に起動された参照削除操作より、ハッシュ・エントリeの参照カウンタが0になるので、その参照削除操作を起動したスレッド２によってハッシュ・エントリeがハッシュ表７から削除される。
【００４４】
なお、複数のスレッド２が並行してハッシュ・エントリeにアクセスしている場合において、あるスレッド２（第１のスレッド）が参照カウンタを0にした後、その参照カウンタを参照する前に、他のスレッド２（第２のスレッド）がその参照カウンタを参照したときは、第２のスレッドがハッシュ・エントリeをハッシュ表７から削除する。すなわち、所定のタイミングでハッシュ・エントリの削除操作を含むスレッド２（プロセス）の実行命令を受けたときは、参照カウンタを0にするスレッド２（プロセス）とハッシュ・エントリeをハッシュ表７から削除するスレッド２（プロセス）とが異なる。
【００４５】
以上のように本実施形態において、複数のスレッド２（プロセス）は、ハッシュ表７の同じハッシュ・エントリ（例えば、ハッシュ・エントリe）に対してアクセスする。プロセッサ１は、あるスレッド２（プロセス）の実行命令を受けたときに、そのスレッ２ドに含まれるハッシュ・エントリeの操作に応じてハッシュ・エントリｅの参照カウンタの値を増減する。プロセッサ１は、ハッシュ・エントリeの削除操作を含む他のスレッドの実行命令を受けたときに、ハッシュ・エントリｅの参照カウンタの値に応じて（特定の値（例えば、0）のときのみ）ハッシュ・エントリeの削除操作を実行する。その結果、クリティカルセクションを使うことなく、ハッシュ表７に対する複数の処理を正常に実行させることができる。
【００４６】
［第２の実施形態］
本実施形態では、-1を参照カウンタにおける特定の値とするハッシュ表７のハッシュ・エントリに対する操作について説明する。各スレッド２が検索・挿入操作と参照削除処理を対にして行なうようになっていると、参照カウンタの値は常に0以上となる。そのため、本実施形態では、ハッシュ表７からハッシュ・エントリを削除する操作は、検索・挿入操作および参照削除処理とは別に用意する。
【００４７】
図８は、本実施形態におけるシステム（データを格納する装置）の構成の例を示している。この例では、プログラム３１は、検索・挿入処理および参照削除処理に加えて、削除処理を含んでいる。その他の点については、本発明の第１の実施形態と同じである。また、本実施形態において、リスト５１や不可分メモリ・アクセス操作は、各々、第１の実施形態と同じ図２と図３に示すものを用いる点、このハッシュ表７１に対するアクセスは、アクセスを行なうプログラム３１が検索キー（key）を与えて起動する点、keyは、大小比較が可能なデータである点、および、図４のフローチャートで示されている位置決め操作を本実施形態におけるハッシュ表に対する総ての操作に共通する位置決め操作として使用する点は、第１の実施形態と同じである。
【００４８】
まず、図９のフローチャートを参照して本実施形態におけるハッシュ表７１に対する検索・挿入操作の動作を説明する。検索・挿入操作を起動する際に与える引数は、検索キー（key）である。検索・挿入操作の結果は、1) 実行した操作内容が検索なのか挿入なのかを識別する情報と、2) ハッシュ表７１においてkeyに一致する検索キーを格納しているハッシュ・エントリへのポインタである。
【００４９】
検索・挿入操作では、まず、keyを引数として、前記の位置決め操作を起動し（ステップ5-1）、実行結果として「find」フラグと「prev」、および「curr」ポインタを受け取る。次に、「find」フラグの値を調べ（ステップ5-2）、その値が「true」であると判定された場合は、変数rに「curr」エントリにある参照カウンタの値を設定し（ステップ5-6）、rの値が-1かどうかを調べる（ステップ5-7）。
【００５０】
その結果、rの値が-1の場合は、そのハッシュ・エントリは後述の削除操作により削除されている途中であることから、前記の位置決め操作から始まる検索操作は失敗であり、処理フローをステップ5-1に戻す。ここで、ステップ5-7から5-1に戻る間に一定時間経過するのを待つ処理を含めても良い。
【００５１】
一方、rの値が-1でない場合は、「curr」エントリにある参照カウンタの値をｒからr+1に変更する「atomic_cmpxchg」操作を行う（ステップ5-8）。この「atomic_cmpxchg」操作が成功すると、検索・挿入操作の結果として、実行した操作内容を検索、実行結果であるハッシュ・エントリへのポインタを「curr」とし（ステップ5-9）、検索・挿入操作を終了する。一方、ステップ5-8の「cmpxchg」操作が失敗すると（図９には記載されていないが）、ステップ5-6に戻る。また、ステップ5-2にて「find」フラグを調べた結果が「false」の場合の動作は、本発明の第一の実施の形態と同じである。
【００５２】
次に、図１０のフローチャートを参照して本実施の形態におけるハッシュ表７１に対する参照削除操作の動作を説明する。参照削除操作を起動する際に与える引数は、検索キー（key）である。参照削除操作の結果は、参照削除操作が成功したか否かを示すフラグである。
【００５３】
参照削除操作では、まず、keyを引数として、図４を参照して説明した位置決め操作を起動し（ステップ6-1）、実行結果として「find」フラグ、「prev」、および「curr」ポインタを受け取る。次に、「find」フラグの値を調べ（ステップ6-2）、値が「true」であると判定された場合は、変数rに「curr」エントリにある参照カウンタの値を設定し（ステップ6-3）、その値が-1かどうかを調べる（ステップ6-4）。
【００５４】
その結果、rの値が-1の場合は、ステップ6-1に戻る。ステップ6-4から6-1に戻る間に一定時間経過するのを待つ処理を含めても良い。一方、rの値が-1でない場合は、「curr」エントリにある参照カウンタの値をｒからr-1に変更する「atomic_cmpxchg」操作を行う（ステップ6-5）。すなわち、削除操作を含む参照削除操作において、参照カウンタの値が特定の値のとき、参照カウンタの値をカウントダウンする。
【００５５】
この「atomic_cmpxchg」操作が成功すると、参照削除操作を成功として（ステップ6-6）、参照削除操作を終了する。一方、ステップ6-5の「cmpxchg」操作が失敗すると（図１０には記載されていないが）、ステップ6-3に戻る。なお、ステップ6-2において、「find」フラグが「false」となった場合は、参照削除操作を失敗として（ステップ6-7）、参照削除操作を終了する。
【００５６】
次に、図１１のフローチャートを参照して本実施の形態におけるハッシュ表７１に対する削除操作の動作を説明する。この操作は、図８に示したシステム（装置）が備えるプロセッサ１１によりスレッド２１で実行される。削除操作を起動する際に与える引数は、検索キー（key）である。削除操作の結果は、削除操作が成功したか否かを示すフラグである。
【００５７】
削除操作では、まず、keyを引数として、図４を参照して説明した位置決め操作を起動し（ステップ7-1）、実行結果として「find」フラグ、「prev」、および「curr」ポインタを受け取る。次に、「find」フラグの値を調べ（ステップ7-2）、その値が「true」であると判定された場合は、変数rに「curr」エントリにある参照カウンタの値を設定し（ステップ7-3）、その値が0かどうかを調べる（ステップ7-4）。
【００５８】
その結果、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」操作が失敗すると（図１１には記載されていないが）、ステップ7-3に戻る。また、ステップ7-2において、「find」フラグが「false」となった場合は、削除操作を失敗として（ステップ7-8）、削除操作を終了する。
【００５９】
以上のように本実施形態によれば、ハッシュ表７１からハッシュ・エントリを削除する操作を実行するプロセスは、検索・挿入操作および参照削除処理を実行するプロセスとは別のプロセスとなる。
【００６０】
本実施形態では、削除操作内で対象エントリの論理削除と物理削除を行なっているが、この方法に限定するものではない。変形例として、削除操作では参照カウンタを-1に変更するのみとしておき、参照カウンタが-1となっているハッシュ・エントリの論理削除と物理削除を行なう操作を別に設けることとしても良い。
【００６１】
本実施形態において、アプリケーションが検索キー（key）を持つハッシュ・エントリに対して操作を行う動作は、図７に示した本発明の第１の実施の形態におけるアプリケーション動作と同じである。また、アプリケーションが検索キー（key）を持つハッシュ・エントリを削除する動作は、単にkeyをパラメータとする削除操作を呼び出すのみである。
【００６２】
上述した実施形態の一部または全部は、以下の付記のようにも記載され得るが、本発明を以下のように限定するものではない。
この出願は、２０１２年１０月２４日に出願された日本出願特願２０１２−２３４７７６を基礎とする優先権を主張し、その開示の全てをここに取り込む。
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【００６３】
（付記１）  ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段と、
プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第１の実行手段と、
前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第２の実行手段と
を備えることを特徴とするデータ格納装置。
【００６４】
（付記２）  前記第１の実行手段が実行命令を受けた前記プロセスは、前記第２の実行手段が実行命令を受けた前記プロセスとは別のプロセスであることを特徴とする付記１に記載のデータ格納装置。
【００６５】
（付記３）  前記第１の実行手段が実行命令を受けた前記プロセスは、前記ハッシュ・エントリの検索操作、挿入操作又は削除操作のうち、少なくとも複数の異なる操作を含むことを特徴とする付記１又は２に記載のデータ格納装置。
【００６６】
（付記４）  前記第１の実行手段は、前記ハッシュ・エントリの操作が検索操作であり、かつ、前記カウンタの値が特定の値ではないとき、前記カウンタの値をカウントアップすることを特徴とする付記３に記載のデータ格納装置。
【００６７】
（付記５）  前記第１の実行手段は、前記ハッシュ・エントリの操作が削除操作であり、かつ、前記カウンタの値が特定の値ではないとき、前記カウンタの値をカウントダウンすることを特徴とする付記３又は４に記載のデータ格納装置。
【００６８】
（付記６）  プロセッサと、ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段とを備える装置において実施される方法であって、
前記プロセッサが、プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第１の実行ステップと、
前記プロセッサが、前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第２の実行ステップと
を備えることを特徴とするデータ格納方法。
【００６９】
（付記７）  コンピュータを
ハッシュ表のハッシュ・エントリのそれぞれに対応付けられたカウンタを格納する格納手段、
プロセスの実行命令を受けたときに、当該プロセスに含まれる前記ハッシュ・エントリの操作に応じて当該ハッシュ・エントリに対応する前記カウンタの値をカウントアップ又はダウンする第１の実行手段、
前記ハッシュ・エントリの削除操作を含むプロセスの実行命令を受けたときに、当該ハッシュ・エントリに対応する前記カウンタの値に応じて、前記ハッシュ・エントリの削除操作を実行する第２の実行手段
として機能させるためのプログラム。
【産業上の利用可能性】
【００７０】
本発明の活用例としてマルチプロセッサ・システムにおけるデータ格納方法およびデータ格納用プログラム、特に、複数のスレッドによるデータの検索、挿入、削除操作を並行に実行することができ、かつ、そのデータを使用しているスレッドが存在している場合にはデータを削除しないという特徴を有するデータ格納方法およびデータ格納用プログラムとして利用できる。
【符号の説明】
【００７１】
１    プロセッサ
２    スレッド
３    プログラム
４    データ
５    リスト
６    配列
７    ハッシュ表
１０    メモリ
１１    プロセッサ
２１    スレッド
３１    プログラム
４１    データ
５１    リスト
６１    配列
７１    ハッシュ表
１００    メモリ
【図１】
2014064914.tif 000003
【図２】
2014064914.tif 000004
【図３】
2014064914.tif 000005
【図４】
2014064914.tif 000006
【図５】
2014064914.tif 000007
【図６】
2014064914.tif 000008
【図７】
2014064914.tif 000009
【図８】
2014064914.tif 000010
【図９】
2014064914.tif 000011
【図１０】
2014064914.tif 000012
【図１１】
2014064914.tif 000013
【図１２Ａ】
2014064914.tif 000014
【図１２Ｂ】
2014064914.tif 000015
【図１２Ｃ】
2014064914.tif 000016
【国際調査報告】
2014064914.tif 000017
2014064914.tif 000018