(57)【特許請求の範囲】
【請求項１】
データベースへのアクセス処理を含む一連の処理を、並列動作可能な処理実行部によるパイプライン方式で実行する情報処理装置であって、
データベースに記憶されるデータである１つの記憶データに対して内容の更新の権限を与える一の処理実行部が割り当てられており、
前記一連の処理は、前記データベースから記憶データの内容を読み出す読出処理を含む第１のブロック処理と、当該一連の処理で内容が更新された前記記憶データの内容を前記データベースに書き込む書込処理を含む第２のブロック処理とを含む複数のブロック処理に分割されており、
前記複数のブロックに分割された各ブロック処理と１対１に対応し、所定のタイミングで、対応づけられた一のブロック処理を実行する処理実行部であって、当該処理実行部に内容の更新の権限が割り当てられている記憶データに対してのみ内容の更新が可能で、かつ当該処理実行部およびパイプラインにおいて当該処理実行部よりも前段に位置する処理実行部に割り当てられている記憶データに対してのみ内容の参照が可能であるというアクセス制限が課されている処理実行部と、
少なくとも前記複数のブロック処理のうち記憶データの内容の更新処理を含むブロック処理と対応づけられた処理実行部に付随して設けられ、該処理実行部がブロック処理で更新した記憶データの内容を、追記された順序がわかる形式で保持するキャッシュ部とを備え、
前記各処理実行部は、前記読出処理で読み出された記憶データの内容を次に実行される処理実行部に引き渡す際に、ブロック処理で記憶データの内容を更新した場合には、更新後の内容にして引き渡し、
前記各処理実行部は、ブロック処理で記憶データの内容を参照する場合に、データベースに格納されている内容よりも当該処理実行部の前段に位置する処理実行部から引き渡される内容を優先し、さらに当該処理実行部の前段に位置する処理実行部から引き渡される内容よりも当該処理実行部に付随するキャッシュ部に保持されている最新の内容を優先して参照する
ことを特徴とする情報処理装置。
【請求項２】
各処理実行部は、
当該処理実行部がブロック処理で更新した記憶データの内容を、当該処理実行部に付随するキャッシュ部に追記する登録部と、
当該処理実行部がブロック処理で参照する記憶データの内容として、データベースに格納されている内容を保持するよりも当該処理実行部の前段に位置する処理実行部から引き渡される内容を優先し、さらに当該処理実行部の前段に位置する処理実行部から引き渡される内容よりも当該処理実行部に付随するキャッシュ部に保持されている最新の内容を優先させる選択部とを含む
請求項１に記載の情報処理装置。
【請求項３】
所定数以下のブロック処理でのみデータベースから記憶データの内容を読み出すように、かつ所定数以下のブロック処理でのみデータベースに対して記憶データの内容を書き込むように、一連の処理が分割されている
請求項１または請求項２に記載の情報処理装置。
【請求項４】
１番目に実行されるブロック処理でのみデータベースから記憶データの内容を読み出すように、かつ最後に実行されるブロック処理でのみデータベースに対して記憶データの内容を書き込むように、前記一連の処理が分割されている
請求項１から請求項３のうちのいずれか１項に記載の情報処理装置。
【請求項５】
キャッシュ部は、ＦＩＦＯ型のキューによって実現される
請求項１から請求項４のうちのいずれか１項に記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データベースへのアクセス処理を含む一連の処理を、並列動作可能な処理実行部によるパイプライン方式で実行する情報処理装置、情報処理方法および情報処理用プログラムに関する。
【背景技術】
【０００２】
過去数十年にわたって半導体技術の進化とともにマイクロプロセッサのクロック周波数と性能は飛躍的に向上してきた。しかし近年、半導体プロセスの微細化が限界に近づきつつあり、マイクロプロセッサのクロック周波数の伸びが鈍化している。半導体業界は、このような状況下でマイクロプロセッサの性能を向上させるため、クロック周波数を高める代わりに、１つのマイクロプロセッサのダイに複数のプロセッサコア（以下、単にコアという。）を搭載させる傾向にある。なお、１つのダイに２〜４個のコアを内蔵するマルチコアＣＰＵが一般向けのパーソナルコンピュータ用として既に流通している。また、メニイコアプロセッサまたは単にメニイコアと呼ばれる数十個以上のコアを搭載するプロセッサの研究開発が盛んに行われている。
【０００３】
また、ＤＳＰ（Digital Signal Processor）や画像処理プロセッサ、ネットワークプロセッサといった特定用途向けのプロセッサの一部は、汎用プロセッサよりも早い時期から複数のコアを搭載して性能を高めてきたが、上述の半導体技術の問題により、今後ますます多くのコアを内蔵していく傾向にある。
【０００４】
シングルコアからマルチコア、メニイコアへの変遷は、プログラミング手法にも変革をもたらしつつある。マルチコアまたはメニイコアの能力を最大限に引き出すためには、並列化に適したプログラミング手法が必要であることは広く認知されている。
【０００５】
ある１つの処理を複数のプロセッサコアを利用して高速化するためのプログラミング手法の一つとして、パイプライン方式が一般に知られている。プログラミング手法におけるパイプライン方式は、本質的には、工場におけるベルトコンベアを使った流れ作業と同じである。工場では、一連の作業工程を独立して作業可能な複数の工程に分解し、各工程に専属の作業員（又は加工機）を割り当てている。そして、ベルトコンベアの流れに沿って、各作業員が作業対象物に対しそれぞれ担当分の作業を行う。このように、一連の作業工程における各工程の作業を複数の作業員で並列に独立して行わせることにより、１つの作業対象物に対する一連の作業工程が完了する前に、次の作業対象物に対する作業を開始しはじめることができるため、一人の作業員による流れ作業に比べて工場全体としての作業の高速化が図れる。プログラミング手法におけるパイプライン方式は、物理的または論理的に数珠繋ぎに接続された複数のプロセッサコアを各作業員とみたてて、各々のプロセッサコアに一連の処理ステップの一部を担当させる方式である。各プロセッサコアは、開始命令となるデータの流れに沿ってそれぞれに割り当てられた処理を行えばよい。
【０００６】
しかし、パイプライン方式に適さないアプリケーションが少なからず存在する。特に、処理の途中でデータベースを操作するアプリケーションでは、データベースの特定の領域に対する参照と更新が連続すると、データベースの整合性を保つためにアクセスの排他制御が不可避になる。この排他制御がパイプラインの一時停止（パイプラインストール）を招き、処理効率を著しく劣化させる。
【０００７】
データベースへのアクセス処理を含む一連の処理を並列処理する技術に関連して、例えば、特許文献１には、マルチユーザ環境で永続オブジェクトの修正を管理するための方法が示されている。
【０００８】
また、特許文献２には、データベースに対する書込読出時間を極力短縮し、かつ最新の書込データを読み出すことを可能にするためのデータベース管理方式が記載されている。
【０００９】
【特許文献１】特開２００４−２２７５６９号公報
【特許文献２】特開２０００−７６１０７号公報
【発明の開示】
【発明が解決しようとする課題】
【００１０】
データベースへのアクセス処理を含むアプリケーションに対して従来型のパイプライン方式を適用しにくい理由を、具体例を用いて説明する。例として、図１２に示す簡素な課金装置９００を考える。本例の課金装置９００は、３つのプロセッサコア９０１−１〜９０１−３を利用して課金処理をパイプライン実行する。
【００１１】
課金装置９００は、人名が記されたカード（以下、名札９１０という。）を入力とする。また、課金情報データベース９０２を有する。課金情報データベース９０２は、複数のレコード９２０の集合体であり、各レコード９２０は、人名９２１と、累計額９２２の２つの列データを含む。課金装置９００は、名札９１０を受け取るたびに、その名札９１０に記入された人名に対応する累計額９２２に１を加算する。
【００１２】
本例における課金装置９００では、この動作を、次の３つのステップＳ９１〜９３に分割してパイプライン方式で実施する。
・ステップＳ９１
入力された名札９１０と等しい人名９２１を持つレコード９２０を課金情報データベース９０２から検索し、検索されたレコード９２０の現在の累計額９２２を取得する。取得した累計額９２２をＸとする。
・ステップＳ９２
Ｘに１を加える。
・ステップＳ９３
ステップＳ９１で検索されたレコード９２０の累計額９２２を、Ｘに更新する。
【００１３】
プロセッサコア９０１−１は、名札９１０の入力を受けてステップＳ９１を実行する。プロセッサコア９０１−２は、プロセッサコア９０１−１の処理結果を受けてステップＳ９２を実行する。プロセッサコア９０１−３は、プロセッサコア９０１−２の処理結果を受けてステップＳ９３を実行する。従って、課金装置９００は、最大で３つの名札９１０をパイプライン的に並列処理する。
【００１４】
さて、この課金装置９００には、同一の名札９１０が連続して入力された際に課金処理が正常に実施されないという問題がある。図１３は、この問題を示すタイムチャートである。
【００１５】
図１３のタイムチャートでは、課金装置９００は、”田中”と記された名札９１０を３回連続して受け取る。期待される結果は、課金情報データベース９０２において”田中”の課金額９２２が３だけ増加することである。しかし、実際には、その累計額９２２は１しか増えない。
【００１６】
期待通りの結果が得られない理由は、課金情報データベース９０２が独立性（ｉｓｏｌａｔｉｏｎ）を有しておらず、上記ステップＳ９１〜Ｓ９３の一連のデータベース操作（トランザクション）をシリアライズできないからである。
【００１７】
なお、課金情報データベース９０２がトランザクションのシリアライズ機能を備えたデータベースである場合には、パイプライン方式による効率化が得られない。例えば、課金情報データベース９０２が関係データベース（Ｒｅｌａｔｉｏｎａｌ  Ｄａｔａｂａｓｅ）のように、トランザクションのシリアライズ機能を備えたデータベースであると仮定する。このとき、”田中”に対応するレコード９２０はロックされ排他制御が働く。課金装置９００は、図１４のタイムチャートに従って動作し、正しい累計額９２２が得られる。
【００１８】
しかし、排他制御の影響でパイプラインがストールしてしまうため、３つのプロセッサコア９０１−１〜９０１−３のうち１つしか瞬間的には動作していない。換言すれば、３つのプロセッサコアを使用しているにも関わらず、シングルコアと同等の処理能力しか得られていない。
【００１９】
以上に説明したように、データベースへのアクセス処理を含む一連の処理をパイプライン化して高速を試みる場合、データベース操作を並列実行させても結果に矛盾を生じさせないような仕組みが必要になる。従来、この仕組みはトランザクションのシリアライズ機能を備えたデータベースを用いて実現されていた。しかし、シリアライズ機能を備えたデータベースはシリアル化の際にデータベースの領域の一部をロックして排他制御するため、パイプラインストールが生じ、処理能力が低下する恐れがあった。
【００２０】
なお、特許文献１に記載されているトランザクション管理方法は、マルチスレッド環境におけるデータベースのトランザクションの管理方法であって、パイプライン方式による並列化プログラミングにおける問題点であるデータハザード（ここでは、データベース内のあるデータに対する参照と更新の前後関係が整合しないことによって生じるデータ内容の不整合を意味する。）に起因したパイプラインストールを解決しようとしているわけではない。また、特許文献１に記載されている方法では、データベース内のあるデータに対するアクセスが発生した際、そのアクセスを行ったスレッド以外のスレッドからは、そのデータに対する書き込みができなくなる。従って、この方法はデータハザードに起因するパイプラインストールを解決できず、マルチスレッドの効果を十分に発揮できない。
【００２１】
また、特許文献２に記載されているデータベース管理方式は、トランザクションのシリアライズ機能を備えたデータベースにおいて書込読出時間を短縮することを目的としているのであって、一トランザクションがパイプライン方式によって並列実行される場合に、最新の書込データを読み出すことができるような構成までは示されていない。
【００２２】
そこで、本発明は、データベースへのアクセス処理を含む一連の処理をパイプライン方式によって並列実行する場合に、データベースの整合性と結果の一貫性を保証し、かつストールを生じさせないパイプライン動作を実現できるようにすることを目的とする。
【課題を解決するための手段】
【００２３】
本発明による情報処理装置は、データベースへのアクセス処理を含む一連の処理を、並列動作可能な処理実行部によるパイプライン方式で実行する情報処理装置であって、データベースに記憶されるデータである１つの記憶データに対して内容の更新の権限を与える一の処理実行部が割り当てられており、一連の処理は、データベースから記憶データの内容を読み出す読出処理を含む第１のブロック処理と、当該一連の処理で内容が更新された記憶データの内容をデータベースに書き込む書込処理を含む第２のブロック処理とを含む複数のブロック処理に分割されており、複数のブロック処理に分割された各ブロック処理と１対１に対応し、所定のタイミングで、対応づけられた一のブロック処理を実行する処理実行部であって、当該処理実行部に内容の更新の権限が割り当てられている記憶データに対してのみ内容の更新が可能で、かつ当該処理実行部およびパイプラインにおいて当該処理実行部よりも前段に位置する処理実行部に割り当てられている記憶データに対してのみ内容の参照が可能であるというアクセス制限が課されている処理実行部と、少なくとも複数のブロック処理のうち記憶データの内容の更新処理を含むブロック処理と対応づけられた処理実行部に付随して設けられ、該処理実行部がブロック処理で更新した記憶データの内容を、追記された順序がわかる形式で保持するキャッシュ部とを備え、各処理実行部は、ブロック処理で記憶データの内容を参照する場合に、データベースに格納されている内容よりも当該処理実行部の前段に位置する処理実行部から引き渡される内容を優先し、さらに当該処理実行部の前段に位置する処理実行部から引き渡される内容よりも当該処理実行部に付随するキャッシュ部に保持されている最新の内容を優先して参照することを特徴とする。
【発明の効果】
【００２６】
本発明によれば、データベースの整合性と結果の一貫性を保証し、かつストールを生じさせずに、データベースへのアクセス処理を含む一連の処理をパイプライン方式によって並列実行することができる。
【発明を実施するための最良の形態】
【００２７】
以下、本発明の実施の形態を図面を参照して説明する。図１は、本発明による情報処理装置の構成例を示すブロック図である。図１に示すように、本発明による情報処理装置１は、データベース３へのアクセス処理を含む一連の処理を、複数の処理実行部を用いてパイプライン方式によって並列実行する装置であって、複数の処理実行部２−１〜２−Ｎと、複数のキャッシュ部４−１〜４−Ｎとを備える。なお、ここでいうデータベース３は、データベースシステムとして構築される記憶システムに限らず、少なくとも複数の処理実行部から同時にアクセスされた場合にデータの整合性が保たれるような記憶システムであればよい。また、情報処理装置１が直接に備えていなくてもアクセス可能に接続されていればよい。
【００２８】
本例では、情報処理装置１が実行する一連の処理は、予めＮ個（Ｎ≧２）のステップに分割されている。なお、Ｎ個に分割された各々のステップで実行される処理のことをブロック処理と呼ぶ場合がある。本発明では、データベース３に記憶されるデータである１つのＤＢデータに対して、該ＤＢデータの内容をある処理実行部が参照（更新のための参照を含む。）した後に別の処理実行部が更新しないことを条件に、一連の処理は分割される。分割されたそれぞれのブロック処理は、処理実行部２−１〜２−Ｎに１つずつ割り当てられている。なお、本例では、処理実行部２−１に最初のブロック処理、処理実行部２−２にその次のブロック処理、処理実行部２−Ｎに最後のブロック処理というように、処理実行部に付された番号の順にブロック処理が割り当てられているものとする。
【００２９】
各処理実行部２（処理実行部２−１〜２−Ｎ）は、並列動作可能な処理手段であって、予め割り当てられた一のブロック処理を、それぞれ所定のタイミングに従って実行する。なお、各処理実行部２−１〜２−Ｎがブロック処理を実行するタイミングは、例えば、外部またはパイプラインにおける前段の処理実行部からのデータ入力があったときであってもよい。
【００３０】
各キャッシュ部４（キャッシュ部４−１〜４−Ｎ）は、処理実行部２−１〜２−Ｎの各々に対応して設けられ、対応づけられた処理実行部２がブロック処理で更新したＤＢデータの内容を、少なくとも該内容がデータベース３に反映されるまでの間、追記された順序がわかる形式で保持する。なお、キャッシュ部４は、少なくともＤＢデータの更新処理を含むブロック処理が割り当てられた処理実行部２に対して設けられていればよい。
【００３１】
キャッシュ部４は、対応づけられた処理実行部がブロック処理で更新したＤＢデータの内容を、該ＤＢデータを識別するための情報とともに、所定の回数分、追記された順序がわかる形式で保持すればよい。キャッシュ部４は、例えば、ＤＢデータの内容を、そのＤＢデータを格納しているレコードのキーやそのＤＢデータの項目名とともに保持してもよい。また、キャッシュ部４は、一連の処理においてそのＤＢデータがデータベース３から読み込まれてから書き込まれるまでの間にかかるブロック処理数（パイプライン実行数）に基づいて定められた回数分のブロック処理において更新されたＤＢデータの内容を、実行処理順序がわかる形式で保持するようにしてもよい。例えば、パイプライン段数（Ｎ）−１回分のブロック処理において更新されたＤＢデータの内容を履歴情報として保持できるようにしてもよい。
【００３２】
各処理実行部２は、ブロック処理でＤＢデータの内容を参照する場合には、データベースに格納されている内容よりも当該処理実行部２に付随するキャッシュ部４に保持されている内容を優先させる。この時、キャッシュ部４に同じＤＢデータの内容が複数保持されている場合には、最新のＤＢデータの内容を優先させる。このことにより、パイプライン方式による並列化プログラミングにおける問題点であるデータハザードを回避できる。
【００３３】
以下、より具体的な構成例を用いて説明する。図２は、本実施形態による情報処理装置のより具体的な構成例を示すブロック図である。図２に示す情報処理装置１は、データベース３へのアクセス処理（読み出し処理や書き込み処理）を含む一連の処理を分割して実行する複数の処理実行部２−１〜２−Ｎと、各処理実行部２−１〜２−Ｎに付随して設けられる複数の分散キャッシュ４−１〜４−Ｎとを備える。
【００３４】
本例における処理実行部２−１〜２−Ｎは、それぞれ一のスレッドを動作させるための処理手段として示している。なお、一般的にはスレッドとプロセスは明確に区別されるが、本例におけるスレッドは、並列動作可能な処理の分割単位の総称を示すものとして用いる。従って、スレッドという表現には、狭義のスレッドやプロセスまたはタスクといった一般的に処理単位として表現されるものを全て内包するものとする。
【００３５】
本例では、情報処理装置１が実行する一連の処理は、予めＮ個（Ｎ≧２）のステップに分割され、各処理実行部２−１〜２−Ｎに１つずつ割り当てられている。なお、本例では、処理実行部２−１に最初のステップ、処理実行部２−２にその次のステップ、処理実行部２−Ｎに最後のステップというように、処理実行部２に付された番号の順に分割された各ステップが割り当てられているものとする。
【００３６】
各処理実行部２は、例えば、マイクロプロセッサのコアによって実現される。なお、１つの処理実行部を１つのコアで実現するようにしてもよいし、２以上の処理実行部を１つのコアで実現することも可能である。そのような場合には、例えば、１つのコア上で２以上のスレッドが動作するようにプログラム制御を行えばよい。また、処理実行部２−１〜２−Ｎの一部または全てを、自身に割り当てられたステップの実行に特化したハードウェア回路として実現してもよい。
【００３７】
各処理実行部２（処理実行部２−１〜２−Ｎ）は、予め自身に割り当てられたステップを、それぞれ所定のタイミングに従って実行する。また、各分散キャッシュ４（分散キャッシュ４−１〜４−Ｎ）は、対応する処理実行部２が、割り当てられたステップで更新したＤＢデータ（データベース３に記憶されるデータ）の内容を、実行順序がわかる形式で保持する。本例において、各分散キャッシュ４は、対応する処理実行部が、過去所定回数（例えば、Ｎ−１回）分のステップにおいて更新したＤＢデータの内容を、実行順序がわかる形式で保持する。なお、分散キャッシュ４−１〜４−Ｎは、図１におけるキャッシュ部４−１〜４−Ｎに該当する記憶手段である。
【００３８】
情報処理装置１が実行する一連の処理には、データベース３へのアクセスを伴う。図３は、データベース３に記憶される情報の概念図である。図３に示すように、本例におけるデータベース３は、１つ以上のレコード２０を記憶する。各レコード２０には、当該レコード２０を一意に識別するためのキー２１と、列データ２２−１〜２２−Ｎとが含まれる。ここで、各列データ２２（列データ２２−１〜２２−Ｎ）は、処理実行部２と１対１で対応している。なお、ここでいう”列データ”とは、一レコードとして記憶されるデータ群を、そのデータの更新の権限を与える処理実行部に応じてＮ個に分割した際のデータのかたまりを概念的に示すものであって、必ずしもＮ個のデータ項目があることを示しているわけではない。従って、１つの列データの情報量は、いくつであってもよい。例えば、ある列データ２２−Ｘ（１≦Ｘ≦Ｎ）は、｛名前ａ，住所ｂ，電話番号ｃ｝のように複数のデータ項目についてのデータの集合である場合もある。また、ある列データ２２−Ｘ（１≦Ｘ≦Ｎ）は、０個のデータ項目についてのデータの集合（すなわち情報量が０）である場合もある。なお、列データの情報量が０ということは、その列データに対応する処理実行部がいずれのＤＢデータに対しても更新処理を行わないことを示している。また、列データは、合計値のような特定のレコードにしか含まれないデータを含んでいてもよい。
【００３９】
情報処理装置１は、処理対象１０を示す情報が入力されると、その処理対象１０を対象とする一連の処理を実行し、処理結果１３を出力する。情報処理装置１は、処理対象１０を処理する際、データベース３の特定の１つのレコード２０をアクセスする。どのレコード２０がアクセスされるかは、処理対象１０を示す情報に含まれるキー１１によって決定される。具体的には、キー１１に一致するキー２１を持つレコード２０がアクセスされる。また、その処理対象１０に対してどのような処理を行うかは、引数１２が示す指示内容によって決定される。なお、固定の処理を行うだけならば、引数１２は省略してもよい。
【００４０】
情報処理装置１は、処理実行部２−１〜２−Ｎによるブロック処理の実行を通じて、処理対象１０を示す情報に含まれるキー１１によって特定されるレコード２０の列データ２２−１〜２２−Ｎを参照・更新しながら、一連の処理を遂行する。
【００４１】
情報処理装置１では、処理実行部２−１〜２−Ｎがパイプライン方式によって並列動作する。仮に、処理実行部２−１〜２−Ｎの全てがデータベース３に自在にアクセスできるようにした場合、データベース３の負荷が増大し、性能が低下する。その場合、さらに、複数の同時アクセスを調停する仕組みを導入しなくてはならず、システムの複雑化を招く。これらの問題を回避するため、データベース３からＤＢデータの内容を参照する処理（読出処理）を実行する処理実行部２と、データベース３に対してＤＢデータの内容を更新する処理（書込処理）を実行する処理実行部２とを、それぞれ少数（所定数以下）に限定する。好適には、最初に実行される一のブロック処理でのみデータベース３からＤＢデータの内容を読み出し、最後に実行される一のブロック処理でのみデータベース３に対してＤＢデータの内容を書き込むようにする。すなわち、処理実行部２−１が以降の処理実行部で用いるＤＢデータ（すなわち、列データ２２−１〜２２−Ｎ）の内容をまとめて読み出すようにし、パイプラインの動きに同期して処理実行部２−２〜２−Ｎに順次引き渡わたすようにし、最終的に処理実行部２−Ｎが、引き渡された内容をデータベース３に反映させるようにする。
【００４２】
図４は、情報処理装置１におけるデータの流れの一例を示す説明図である。なお、図４に示す例では、一連の処理は３つのブロック処理に分割され、処理実行部２−１〜２−３に１対１に対応づけられている。すなわち、並列動作されるスレッドの個数（Ｎ）は３である。前述の通り、１番目（最初）の処理実行部２−１のみがデータベース３からレコード２０の内容（ここでは、列データ２２−１〜２２−３）を取得する。また、３番目（最後）の処理実行部２−３のみがデータベースに対してレコード２０の内容を更新する。
【００４３】
１番目の処理実行部２−１は、割り当てられたステップを実行することによって、データベース３から処理対象のレコード２０の内容を取得し、また、必要に応じて列データ２２−１の内容の更新を含む所定の処理を行い、処理が完了すると次の処理実行部（処理実行部２−２）へ処理後の列データ２２−１〜２２−３の内容を引き渡す。２番目の処理実行部２−２は、割り当てられたステップを実行することによって、前の処理実行部（処理実行部２−１）から列データ２２−１〜２２−３を引継いで、必要に応じて列データ２２−２の内容の更新を含む所定の処理を行い、処理が完了すると次の処理実行部（処理実行部２−３）へ処理後の列データ２２−１〜２２−３の内容を引き渡す。最後の処理実行部２−３は、割り当てられたステップを実行することによって、前の処理実行部（処理実行部２−１）から列データ２２−１〜２２−３を引継いで、必要に応じて列データ２２−２の内容の更新を含む所定の処理を行い、また、データベース３に対して処理対象のレコード２０の内容を更新し、処理結果１３を出力する。
【００４４】
一般的には、ある１つのスレッドに閉じて処理が完結することは少ない。そのため、処理実行部２−Ｘ（１≦Ｘ≦Ｎ）が途中まで処理した結果を、次の処理実行部２−（Ｘ＋１）へ引き継がせる必要がある。なお、ＤＢデータ（ここでは、列データ２２−１〜２２−３）以外に、スレッド間で引き継ぐ必要のあるデータがある場合には、図４に示すように、中間データとして引き継ぐようにしてもよい。また、処理対象１０を示す情報（キー１１や引数１２）も引き継ぐようにしてもよい。
【００４５】
なお、図４に示す例では、分散キャッシュ４−１〜４−３には、少なくとも対応する処理実行部２（処理実行部２−１〜２−３のいずれか）で更新した列データの内容が記憶させていればよい。なお、各処理実行部２で更新する列データ以外で参照する必要がある列データは、それ以前に実行される処理実行部によって適正な内容に書き換えられた上で引き渡されるので、特に付随する分散キャッシュ４−１〜４−３に保持させる必要はない。
【００４６】
次に、処理実行部２−１〜２−Ｎにおける列データ２２−１〜２２−Ｎに対するアクセス制限と分散キャッシュの必要性について説明する。
【００４７】
同一のキー１１を持つ複数の処理対象１０の間には、前の処理結果が後の処理結果に影響を与えることから、依存関係があるといえる。仮に、同一の処理対象１０に対する処理を単純に並列実行しようとすると、後に到着した処理対象１０に対する処理は、その処理対象１０に関するデータべース３（ここでは、キー１１で特定される列データ２２−１〜列データ２２−Ｎ）への参照が生じた時点で、これより前に到着した処理対象１０に対する処理が進行してその結果が確定するまで停止状態になる。これは、パイプライン方式のマイクロプロセッサにおけるＲｅａｄ−Ａｆｔｅｒ−Ｗｒｉｔｅデータハザードと同様の原理によるパイプラインストールであって、性能の低下を招く結果となる。
【００４８】
そこで、データハザード（ここでは、データベース内のあるデータに対する参照と更新の前後関係が整合しないことによって生じるデータ内容の不整合を意味する。）に起因するパイプラインストールを排除するため、処理実行部２−１〜２−Ｎにおいて更新した各列データの内容を保持するための分散キャッシュを各処理実行部２−１〜２−Ｎの各々に配備するとともに、処理実行部２−１〜２−Ｎにおいて各列データに対するアクセスに制限をかける。
【００４９】
図５は、ある分散キャッシュ４−Ｘにおける情報の構成の一例を示す説明図である。分散キャッシュ４−Ｘは、Ｘ番目の処理実行部２−Ｘからのみアクセスされ、（Ｎ−１）個のキャッシュエントリを登録できるＦＩＦＯ（First-In First-Out）型のキューとして実現されていてもよい。ここで、Ｎ−１とは、１番目の処理実行部２−１がデータベース３からレコード２０を読み出して、Ｎ番目の処理実行部２−Ｎがそのレコードをデータベース３に反映させる場合において、レコード２０の内容を更新した後、その内容が、再びデータベース３に格納されている内容として、対応する処理実行部２に引き渡されるまでにかかるパイプライン実行回数を意味している。各エントリは、対応する処理実行部２−Ｘにおけるブロック処理で更新された列データ２２−Ｘの内容と、その列データ２２−Ｘを識別するための情報（ここでは、キー２１）とを含む。なお、列データ２２−Ｘを識別するための情報は、処理実行部２−Ｘが更新する列データ２２−Ｘのデータ項目が固定的に割り当てられるものであるため、その列データ２２−Ｘを含む処理対象となったレコード２０を識別するための情報であってもよい。なお、他の分散キャッシュ４についても同様である。
【００５０】
また、図６は、処理実行部２−１〜２−Ｎが列データ２２−１〜２２−Ｎに対してどのようなアクセスが可能かを示す説明図である。本発明では、データベース３に記憶される１つのデータに対して、ある処理実行部が参照した後に別の処理実行部が該データの内容を更新しないように、各処理実行部の処理順序および分割単位を考慮した上で、一連の処理が分割されている。なお、上記参照は、更新のための参照を含む。これにより、予めデータベースの各データ項目に対して、更新の権限を与える一の処理実行部が割り当てられ、各処理実行部２−Ｘ（１≦Ｘ≦Ｎ）は、当該処理実行部２−Ｘに割り当てられているデータ項目のまとまりである列データ２２−Ｘに対してのみ更新が可能で、かつ当該処理実行部２−Ｘおよびパイプラインにおいて当該処理実行部２−Ｘよりも前段に位置する処理実行部２−（Ｘ−１）に割り当てられているデータ項目のまとまりである列データ２２−１〜２２−（Ｘ−１）に対してのみ参照が可能であるというアクセス制限が課されることになる。
【００５１】
このように、各処理実行部２−１〜２−Ｎのブロック処理での更新値を保持する分散キャッシュと、アクセス制限を課すことによって、データベース操作に対しロック操作をすることなく、データハザードを回避させる。それは、実際にデータベースに書き込まれる前に、次の処理を開始したとしても、付随する分散キャッシュ４に保持されている内容および前段に位置する処理実行部から引き渡される内容を参照すれば、これまでの処理結果が取得できるからである。
【００５２】
次に、本実施形態の動作を図７〜図１０のフローチャートを参照して説明する。ここでは、図２に示す実施形態における情報処理装置１の動作を、１番目の処理実行部２−１の動作と、２番目〜（Ｎ−１）番目の処理実行部２−Ｙ（２≦Ｙ＜Ｎ）の動作と、Ｎ番目の処理実行部２−Ｎの動作とに分けて説明する。
【００５３】
まず、図７に示すフローチャートを参照して、１番目処理実行部２−１の動作について説明する。図７は、本実施形態における処理実行部２−１の動作例を示すフローチャートである。図７に示すように、処理順序が１番目の処理実行部２−１は、処理対象１０が情報処理装置１に入力されるまで待ち、処理対象１０が入力されたら次のステップＳ１０１へ進む（ステップＳ１００）。
【００５４】
ステップＳ１０１では、処理実行部２−１は、データベース３を検索して、処理対象１０を示す情報に含まれるキー１１に対応するレコード２０を特定し、そのレコード２０から列データ２２−１〜２２−Ｎを取得する。また、処理実行部２−１は、ここで取得した列データ２２−１〜２２−Ｎを、今回の処理対象１０に対する一連の処理における列データ２２−１〜２２−Ｎの内容を保持する変数であるＡＳＳ＿ＤＡＴＡ［１］〜ＡＳＳ＿ＤＡＴＡ［Ｎ］に代入する。
【００５５】
また、処理実行部２−１は、処理対象１０を示す情報に含まれる引数１２に、ＡＲＧＵＭＥＮＴという別名を与え、ステップＳ１０３に進む（ステップＳ１０２）。なお、ＡＲＧＵＭＥＮＴは、指示内容を格納する変数として用いている。
【００５６】
次に、処理実行部２−１は、全処理実行部に共通する処理動作を行う（ステップＳ１０３）。図８は、全処理実行部２に共通する動作の処理フローの一例を示す処理フローである。ここでは、１番目の処理実行部２−１から呼び出された処理動作として説明する。従って、図８におけるＸ＝１である。なお、本例では、全処理実行部に対して分散キャッシュが割り当てられている場合を例にしているが、例えば、ＤＢデータの更新処理を含まないブロック処理が割り当てられた処理実行部に対して分散キャッシュの割り当てを省略する場合には、当該処理（ステップＳ１０３）は、ＤＢデータの更新処理を含むブロック処理が割り当てられた処理実行部に共通する処理として実装すればよい。なお、ＤＢデータの更新処理を含まないブロック処理が割り当てられた処理実行部は、図８におけるステップＳ１１２のみを実行すればよい。
【００５７】
全ての処理実行部２−１〜２−Ｎに共通する動作として、まず、処理実行部２−Ｘは、処理実行部２−Ｘは、当該処理実行部２−Ｘに付随する分散キャッシュ４−Ｘを検索し、今回の処理対象１０に対する一連の処理における列データ２２−Ｘと同じ列データ２２−Ｘの内容が登録されているか否かを判定する（ステップＳ１１０）。処理実行部２−Ｘは、例えば、分散キャッシュ４−Ｘに、処理対象１０を示す情報に含まれるキー１１と等しいキー２１を持つキャッシュエントリが存在するか否かを判定すればよい。そのようなキャッシュエントリが存在していれば（ステップＳ１１０のＹｅｓ）、ステップＳ１１１に進む。
【００５８】
ステップＳ１１１では、ＡＳＳ＿ＤＡＴＡ［Ｘ］の内容を、分散キャッシュ４−Ｘで検索された該当する列データ２２−Ｘの内容に書き換える。これにより、今回の処理対象１０にかかる列データ２２−Ｘに関して、これまでに更新した結果が、データベース３に反映されていない場合（または反映されたときには、既に読み出し処理が終了していた場合）であっても、それまでの処理結果を反映させた上で、今回の一連の処理を行うことができるようになる。なお、分散キャッシュ４−Ｘに該当する列データ２２−Ｘが複数存在していた場合には、そのうちの最新の列データ２２−Ｘ（キー１１と等しいキー２１を持つキャッシュエントリのうち最も新しく追記されたキャッシュエントリとして登録されている列データ２２−Ｘ）の内容を優先させる。前述のとおり、分散キャッシュ４−ＸをＦＩＦＯ形式のキュー等により実現することによって、分散キャッシュ４−Ｘは、追記された順序がわかる形式でキャッシュエントリを保持することができるので、該当する列データ２２−Ｘのうち最新の列データ２２−Ｘを特定することは容易である。
【００５９】
一方、該当するキャッシュエントリが存在しなければ（ステップＳ１１０のＮｏ）、ＡＳＳ＿ＤＡＴＡ［Ｘ］には、今回の処理対象にかかる列データ２２−Ｘに関して、既にこれまでの処理結果が反映された後のデータベース３から読み出された内容が保持されているとして、そのままステップＳ１１２へ進む。
【００６０】
ＡＳＳ＿ＤＡＴＡ［Ｘ］にこれまでの処理結果を反映させる処理が終了すると、ステップＳ１１２では、当該処理実行部２−Ｘに割り当てられている所定の処理を実行する。ここでは、キー１１やＡＲＧＵＭＥＮＴを参照したり、中間データ４０−Ｘ（例えば、引数１２を内部のイベント指示に変換したものや引数１２に対して所定の演算を加えたもの）を生成してもよい。また、ＡＳＳ＿ＤＡＴＡ［１］〜ＡＳＳ＿ＤＡＴＡ［Ｎ］のうち、ＡＳＳ＿ＤＡＴＡ［１］〜ＡＳＳ＿ＤＡＴＡ［Ｘ］を参照したり、ＡＳＳ＿ＤＡＴＡ［Ｘ］を更新してもよい。なお、ＡＳＳ＿ＤＡＴＡ［１］〜ＡＳＳ＿ＤＡＴＡ［Ｘ−１］については、前の処理実行部によってこれまでの処理結果が反映された上で処理された結果が引き渡されるので、当該処理実行部２−Ｘにおいても参照可能となる。なお、Ｘ＝１の場合には、当該処理実行部２−１に対応づけられた列データ２２−１の内容、すなわちＡＳＳ＿ＤＡＴＡ［１］の内容のみを参照および更新可能である。
【００６１】
ステップＳ１１２における当該処理実行部２−Ｘに割り当てられている所定の処理が完了すると、処理実行部２−Ｘは、その処理で更新した列データ２２−Ｘの内容、すなわちＡＳＳ＿ＤＡＴＡ［Ｘ］の内容を、その列データ２２−Ｘを識別するためのキー１１とともに、分散キャッシュ４−Ｘに記憶させる（ステップＳ１１３）。これは、今回の処理によって更新した列データ２２−Ｘの内容がデータベース３に反映される前に、同じ処理対象１０が指定された一連の処理が開始された場合に、今回更新した列データ２２−Ｘの内容を用いらせるための処理である。なお、分散キャッシュ４−Ｘに今回の更新にかかるキャッシュエントリを追記した結果、分散キャッシュ４−Ｘの記憶容量を超えることになる場合には、最も古いキャッシュエントリが押し出されて消去される。
【００６２】
全ての処理実行部２−１〜２−Ｎに共通する動作は、以上により終了し、処理実行部２−１は、元の動作に復帰する。
【００６３】
なお、ステップＳ１１０〜ステップＳ１１１の処理およびステップＳ１１３の処理は、独立したステップとしてステップＳ１１２において随時実行されるようにしてもよい。例えば、各処理実行部２が共通して備える選択部（図示せず。）が、当該選択部を備える処理実行部２−Ｘがブロック処理でＡＳＳ＿ＤＡＴＡ［１］〜ＡＳＳ＿ＤＡＴＡ［Ｎ］を参照するための関数を提供し、その関数内で分散キャッシュ４−Ｘに保持されている最新の内容を優先させるような選択処理を実行するようにしてもよい。また、例えば、各処理実行部２が共通して備える登録部（図示せず。）が、当該登録部を備える処理実行部２−Ｘがブロック処理でＡＳＳ＿ＤＡＴＡ［Ｎ］を更新するための関数を提供し、その関数内でＡＳＳ＿ＤＡＴＡ［Ｘ］を更新するとともに分散キャッシュ４−Ｘに更新後の内容を追記させるような登録処理を実行するようにしてもよい。
【００６４】
全ての処理実行部２−１〜２−Ｎに共通する動作（図８のステップＳ１１０〜Ｓ１１３）が終了すると、処理実行部２−１は、キー１１，ＡＳＳ＿ＤＡＴＡ［１］〜ＡＳＳ＿ＤＡＴＡ［Ｎ］，１番目の中間データを、２番目の処理実行部２−２に出力する（ステップＳ１０４）。以上で１つの処理対象１０に対する処理実行部２−１の処理は終了する。処理実行部２−１は、ステップＳ１００に戻り、次のブロック処理の開始タイミングを待つ。
【００６５】
例えば、図１２に示した課金装置９００に本発明を適用した場合、処理実行部２−２に相当するプロセッサコア９０１−１が、図７に示すフローチャートに従って動作することになる。なお、図１２に示す課金装置９００の例では、ＤＢデータである累計額９２２に対して、プロセッサコア９０１−２にその更新の権限が与えられている。従って、累計額９２２が列データ２２−２に相当する。なお、列データ２２−１，２２−３に相当するＤＢデータは存在しない。すなわち、プロセッサコア９０１−１，９０１−３に割り当てられたブロック処理にはＤＢデータの更新処理が含まれず、列データ２２−１，２２−３は情報量が０（データ項目が０）である。このような場合には、プロセッサコア９０１−１，９０１−３に対応する分散キャッシュ４−１，４−３を省略することも可能である。
【００６６】
プロセッサコア９０１−１は、例えば、図７に示すフローチャートに従い、名札９１０が入力されるまで待ち、名札９１０が入力されたらステップＳ１０１に進む（ステップＳ１００）。ステップＳ１０１では、プロセッサコア９０１−１は、入力された名札９１０と等しい人名９２１を持つレコード９２０を課金情報データベース９０２から検索し、検索されたレコード９２０の現在の累計額９２２を取得する。ここで取得した累計額９２２をＡＳＳ＿ＤＡＴＡ［２］に代入する。なお、本例では、ＡＳＳ＿ＤＡＴＡ［１］およびＡＳＳ＿ＤＡＴＡ［３］は存在しない。また、指示内容は常に固定であるため、ステップＳ１０２の動作は省略される。また、プロセッサコア９０１−１に割り当てられたブロック処理では、ＤＢデータの更新処理を含まず、またデータベースからの読み出し以外の処理も含まれていないため、全処理実行部に共通の処理（図９のステップＳ１２２、具体的には図８のステップＳ１１０〜Ｓ１１３）は全て省略される。
【００６７】
そして、プロセッサコア９０１−１は、名札９１０と、ＡＳＳ＿ＤＡＴＡ［２］（ここでは、課金情報データベース９０２から読み出した、入力された名札９１０と等しい人名９２１を持つレコード９２０の累計額９２２の内容）とを、次のプロセッサコア９０１−２に出力する（ステップＳ１０４）。以上で、プロセッサコア９０１−１は、１回の名札９１０の入力に対するブロック処理を終了し、次のブロック処理の開始タイミングを待つことになる。
【００６８】
仮に、”田中”が記された名札９１０が続けて入力されていた場合には、プロセッサコア９０１−１は、２回目の名札９１０の入力に対するブロック処理として、再度”田中”と等しい人名９２２を持つレコード９２０を読み出して、ＡＳＳ＿ＤＡＴＡ［２］に代入し、次のプロセッサコア９０１−２に引き渡すことになる。なお、パイプライン方式による並列処理では、プロセッサコア９０１−１が２回目の名札９１０の入力に対するブロック処理を実行しているときに、プロセッサコア９０１−２が１回目の名札９１０の入力に対するブロック処理を実行することになる。従って、プロセッサコア９０１−１における２回目の”田中”の入力に対するブロック処理では、１回目の”田中”の入力によって更新されるはずの内容がまだ反映されていない累計額９２２の内容を課金情報データベース９０２から読み込むことになる。
【００６９】
次に、図９に示すフローチャートを参照して、２番目〜Ｎ−１番目の処理実行部２−Ｙ（２≦Ｙ＜Ｎ）の動作について説明する。図９は、本実施形態における２番目〜Ｎ−１番目の処理実行部２−Ｙ（２≦Ｙ＜Ｎ）の動作例を示すフローチャートである。図９に示すように、処理順序が２番目〜Ｎ−１番目の処理実行部２−Ｙは、（Ｙ−１）番目の処理実行部２−（Ｙ−１）から、キー１１，ＡＳＳ＿ＤＡＴＡ［１］〜ＡＳＳ＿ＤＡＴＡ［Ｎ］，（Ｙ−１）番目の中間データが入力されるまで待ち、それら情報が入力されたら次のステップＳ１２１へ進む（ステップＳ１２０）。
【００７０】
ステップＳ１２１では、処理実行部２−Ｙは、前の処理実行部２−（Ｙ−１）から引き渡された（Ｙ−１）番目の中間データに、ＡＲＧＭＥＮＴという別名を与え、ステップＳ１２２へ進む。
【００７１】
次に、処理実行部２−Ｙは、全処理実行部に共通する処理動作を行う（ステップＳ１２２）。なお、ステップＳ１２２の動作は、図７における処理実行部２−１が読み出すステップＳ１０３として説明した動作と同様である。すなわち、図８に示すように、当該処理実行部２−Ｘ（ここでは、Ｘ＝Ｙ）が更新を管理している列データ２２−Ｘの内容を、これまでの処理結果を反映した内容とした上で、必要に応じて列データ２２−Ｘの更新をしたり、その内容を分散キャッシュ４−Ｘに追記したりする。なお、Ｘ＝２の場合には、当該処理実行部２−２に対応づけられた列データ２２−２の内容、すなわち、ＡＳＳ＿ＤＡＴＡ［２］の内容をこれまでの処理結果を反映した内容とした上で、必要に応じてＡＳＳ＿ＤＡＴＡ［２］の内容を更新したり、その結果を分散キャッシュ４−２に追記したりする。その際、処理実行部２−２は、ＡＳＳ＿ＤＡＴＡ［１］，ＡＳＳ＿ＤＡＴＡ［２］の参照が可能である。
【００７２】
全ての処理実行部２−１〜２−Ｎに共通する動作（図８のステップＳ１１０〜Ｓ１１３）が終了すると、処理実行部２−Ｙは、キー１１，ＡＳＳ＿ＤＡＴＡ［１］〜ＡＳＳ＿ＤＡＴＡ［Ｎ］，Ｙ番目の中間データを、（Ｙ＋１）番目の処理実行部２−（Ｙ＋１）に出力する（ステップＳ１２３）。以上で１つの処理対象１０に対する処理実行部２−Ｙの処理は終了する。処理実行部２−Ｙは、ステップＳ１２０に戻り、次のブロック処理の開始タイミングを待つ。
【００７３】
例えば、図１２に示した課金装置９００に本発明を適用した場合、処理実行部２−２に相当するプロセッサコア９０１−２が、図９に示すフローチャートに従って動作することになる。プロセッサコア９０１−２は、例えば、図９に示すフローチャートに従い、プロセッサコア９０１−１から、名札９１０とＡＳＳ＿ＤＡＴＡ［２］とが入力されるまで待ち、それら情報が入力されたらステップＳ１２１に進む（ステップＳ１２０）。なお、プロセッサコア９０１−２においても、指示内容は常に固定であるため、ステップＳ１２１の動作は省略される。
【００７４】
次に、プロセッサコア９０１−２は、ＤＢデータの更新処理を含むブロック処理が割り当てられたプロセッサコアに共通する処理動作を行う（ステップＳ１２２）。ここでは、まず、当該プロセッサコア９０１−２に割り当てられている列データ２２−２である累計額９２２の内容を、これまでの処理結果を反映した内容にするための処理を行う。プロセッサコア９０１−２は、当該プロセッサコア９０１−２に付随する分散キャッシュ４−２を検索し、今回の処理対象１０（名札９１０）に対する一連の処理における累計額９２２と同じ累計額９２２の内容が登録されているか否かを判定する（ステップＳ１１０）。例えば、”田中”が記された名札９１０に対して処理をしている場合には、”田中”と等しい人名９２２を持つキャッシュエントリが存在するか否かを判定すればよい。そのようなキャッシュエントリが存在していれば（ステップＳ１１０のＹｅｓ）、ＡＳＳ＿ＤＡＴＡ［２］の内容を分散キャッシュ４−Ｘで検索された該当する累計額９２２の最新の内容に書き換える。
【００７５】
一方、該当するキャッシュエントリが存在しなければ（ステップＳ１１０のＮｏ）、ＡＳＳ＿ＤＡＴＡ［２］には既にこれまでの処理結果が反映された内容が保持されているとして、ステップＳ１１２へ進む。
【００７６】
ＡＳＳ＿ＤＡＴＡ［２］にこれまでの処理結果を反映させる処理が終了すると、ステップＳ１１２では、当該処理実行部２−Ｘに割り当てられている所定の処理を実行する。ここでは、プロセッサコア９０１−２は、ＡＳＳ＿ＤＡＴＡ［２］に１を加える。ステップＳ１１２における当該プロセッサコア９０１−２に割り当てられている所定の処理が完了すると、プロセッサコア９０１−２は、その処理で更新した累計額９２２の内容、すなわちＡＳＳ＿ＤＡＴＡ［２］の内容を、その累計額９２２を識別するための人名９２１とともに、分散キャッシュ４−２に記憶させる（ステップＳ１１３）。なお、分散キャッシュ４−２には、少なくとも２回分のキャッシュエントリが保持できる記憶容量を持たせればよい。
【００７７】
そして、プロセッサコア９０１−２は、名札９１０と、ＡＳＳ＿ＤＡＴＡ［２］（ここでは、ステップＳ１１２で更新した累計額９２２の内容）とを、次のプロセッサコア９０１−３に出力する（ステップＳ１２３）。以上で、プロセッサコア９０１−１は、１回の名札９１０の入力に対するブロック処理を終了し、次のブロック処理の開始タイミングを待つことになる。
【００７８】
仮に、”田中”が記された名札９１０が続けて入力されていた場合には、プロセッサコア９０１−２は、２回目の名札９１０の入力に対するブロック処理として、再度”田中”の累計額９２２の更新処理を行い、次のプロセッサコア９０１−３に引き渡すことになる。なお、２回目のブロック処理のステップＳ１１２では、ＡＳＳ＿ＤＡＴＡ［２］の内容として、プロセッサコア９０１−１から引き渡される、実際に課金情報データベース９０２から読み出された内容ではなく、１回目のブロック処理におけるステップＳ１１３で分散キャッシュ４−２に追記され、２回目のブロック処理のステップＳ１１１で書き換えられた内容が用いられることになる。また、２回目のブロック処理が完了した時点で、分散キャッシュ４−２には、１回目の処理で更新された”田中”の累計額９２２の内容と、２回目の処理で更新された”田中”の累計額９２２の内容とが保持されることになる。
【００７９】
なお、さらに”田中”が記された名札９１０が続けて入力されていた場合には、プロセッサコア９０１−２は、３回目の名札９１０の入力に対するブロック処理として、再度”田中”の累計額９２２の更新処理を行い、次のプロセッサコア９０１−３に引き渡すことになる。なお、３回目のブロック処理のステップＳ１１２では、２回目のブロック処理のステップＳ１１３で分散キャッシュ４−２に追記され、３回目のブロック処理ステップＳ１１１で書き換えられた内容（最新の内容）が用いられることになる。また、３回目のブロック処理が完了した時点で、分散キャッシュ４−２には、２回目の処理で更新された”田中”の累計額９２２の内容と、３回目の処理で更新された”田中”の累計額９２２の内容とが保持されることになる。
【００８０】
なお、同じ人名を持つ名札９１０が間隔を明けて入力され、前に処理したときの更新内容が分散キャッシュ４−２から消去されている場合には、既にその内容は課金情報データベース９０２に反映され取得可能になっていることを意味しているので、プロセッサコア９０１−２は、プロセッサコア９０１−１から引き継いだＡＳＳ＿ＤＡＴＡ［２］の内容をそのまま用いればよい。
【００８１】
次に、図１０に示すフローチャートを参照して、最後（Ｎ番目）の処理実行部２−Ｎの動作について説明する。図１０は、本実施形態におけるＮ番目の処理実行部２−Ｎの動作例を示すフローチャートである。図１０に示すように、処理順序が最後の処理実行部２−Ｎは、（Ｎ−１）番目の処理実行部２−（Ｎ−１）から、キー１１，ＡＳＳ＿ＤＡＴＡ［１］〜ＡＳＳ＿ＤＡＴＡ［Ｎ］，（Ｎ−１）番目の中間データが入力されるまで待ち、それら情報が入力されたら次のステップＳ１３１へ進む（ステップＳ１３０）。
【００８２】
ステップＳ１３１では、処理実行部２−Ｎは、前の処理実行部２−（Ｎ−１）から引き渡された（Ｎ−１）番目の中間データに、ＡＲＧＵＭＥＮＴという別名を与え、ステップＳ１３２へ進む。
【００８３】
次に、処理実行部２−Ｎは、全処理実行部に共通する処理動作を行う（ステップＳ１３２）。なお、ステップＳ１３２の動作は、図７における処理実行部２−１が読み出すステップＳ１０３として説明した動作と同様である。すなわち、図８に示すように、当該処理実行部２−Ｘ（ここでは、Ｘ＝Ｎ）が更新を管理している列データ２２−Ｘの内容を、これまでの処理結果を反映した内容とした上で、必要に応じて列データ２２−Ｘの更新をしたり、その内容を分散キャッシュ４−Ｘに追記したりする。なお、Ｘ＝Ｎの場合には、当該処理実行部２−Ｎに対応づけられた列データ２２−Ｎの内容、すなわち、ＡＳＳ＿ＤＡＴＡ［Ｎ］の内容をこれまでの処理結果を反映した内容とした上で、必要に応じてＡＳＳ＿ＤＡＴＡ［Ｎ］の内容を更新したり、その結果を分散キャッシュ４−Ｎに追記したりする。その際、処理実行部２−Ｎは、ＡＳＳ＿ＤＡＴＡ［１］〜ＡＳＳ＿ＤＡＴＡ[Ｎ−１]の参照が可能である。
【００８４】
全ての処理実行部２−１〜２−Ｎに共通する動作（図８のステップＳ１１０〜Ｓ１１３）が終了すると、処理実行部２−Ｎは、今回の処理対象１０に対する一連の処理によって更新された列データ２２−１〜２２−Ｎの内容をデータベース３に反映させる（ステップＳ１３３）。処理実行部２−Ｎは、キー１１と等しいキー２１を持つレコード２０をデータベース３から検索して、そのレコード２０に含まれる列データ２２−１〜２２−Ｎの内容として、ＡＳＳ＿ＤＡＴＡ［１］〜ＡＳＳ＿ＤＡＴＡ［Ｎ］の内容を書き込む。
【００８５】
そして、処理実行部２−Ｎは、処理結果１３を示す情報を出力する（ステップＳ１３４）。以上で１つの処理対象１０に対する処理実行部２−Ｎの処理は終了する。処理実行部２−Ｎは、ステップＳ１３０に戻り、次のブロック処理の開始タイミングを待つ。
【００８６】
例えば、図１２に示した課金装置９００に本発明を適用した場合、処理実行部２−Ｎに相当するプロセッサコア９０１−３が、図１０に示すフローチャートに従って動作することになる。プロセッサコア９０１−３は、例えば、図１０に示すフローチャートに従い、プロセッサコア９０１−２から、名札９１０とＡＳＳ＿ＤＡＴＡ［２］とが入力されるまで待ち、それら情報が入力されたらステップＳ１３１に進む（ステップＳ１３０）。なお、プロセッサコア９０１−３においても、指示内容は常に固定であるため、ステップＳ１３１の動作は省略される。
【００８７】
また、プロセッサコア９０１−３に割り当てられたブロック処理では、ＤＢデータの更新処理を含まず、またデータベースへの書き込み処理以外の処理も含まれていないため、全処理実行部に共通の処理（図１０のステップＳ１３２、具体的には図８のステップＳ１１０〜Ｓ１１３）は全て省略される。
【００８８】
次に、プロセッサコア９０１−３は、今回の名札９１０に対する一連の処理によって更新された列データである累計額９２２の内容を課金情報データベース９０２に反映させる（ステップＳ１３３）。プロセッサコア９０１−３は、名札９１０に記された人名と等しい人名９２１を持つレコード９２０を課金情報データベース９０２から検索して、そのレコード９２０に含まれる累計額９２２の内容として、ＡＳＳ＿ＤＡＴＡ［２］の内容を書き込めばよい。そして、プロセッサコア９０１−３は、必要であれば処理結果１３を示す情報を出力する（ステップＳ１３４）。以上で、プロセッサコア９０１−３は、１回の名札９１０の入力に対するブロック処理を終了し、次のブロック処理の開始タイミングを待つことになる。
【００８９】
仮に、”田中”が記された名札９１０が続けて入力されていた場合であっても、プロセッサコア９０１−２からは、その都度これまでの処理結果が反映された内容に基づいて更新された累計額９２２の内容がＡＳＳ＿ＤＡＴＡ［２］として入力されるので、特別な処理をすることなく、引き渡されたＡＳＳ＿ＤＡＴＡ［２］の内容をそのまま課金情報データベース９０２に書き込む処理を行えばよい。
【００９０】
以上のように、本実施形態によれば、データベースの整合性と結果の一貫性を保証し、かつストールを生じさせずに、データベースへのアクセス処理を含む一連の処理をパイプライン方式によって並列実行することができる。
【００９１】
図１１は、図１２に示した課金装置９００に本発明を適用した場合のタイムチャートである。図１１では、”田中”と記された名札９１０が３回連続されたときのタイムチャートを示している。まず、時刻ｔ１において、２回目の名札９１０の入力を受けて、プロセッサコア９０１−１が、１回目の”田中”に対するブロック処理を開始する。プロセッサコア９０１−１は、１回目の”田中”に対するブロック処理では、課金情報データベース９０２から”田中”の現在の累計額９２２を読み出してその値（Ｘ＝１５）を人名９２１（”田中”）とともにプロセッサコア９０１−２に向けて出力する。なお、プロセッサコア９０１−２およびプロセッサコア９０１−３は、データ入力待ちである。
【００９２】
時刻ｔ２において、プロセッサコア９０１−１からのデータ入力（”田中”，Ｘ＝１５）を受けて、プロセッサコア９０１−２が、１回目の”田中”に対するブロック処理を開始する。また、プロセッサコア９０１−２と並列に、２回目の名札９１０の入力を受けて、プロセッサコア９０１−１が、２回目の”田中”に対するブロック処理を開始する。なお、プロセッサコア９０１−３は、データ入力待ちである。
【００９３】
プロセッサコア９０１−２は、１回目の”田中”に対するブロック処理では、分散キャッシュ４−２に該当するデータがないのを確認した上で、引き渡された値（Ｘ＝１５）に基づいて課金処理（Ｘ←Ｘ＋１）を行う。そして、更新後の値（Ｘ＝１６）を人名９２１（”田中”）と紐付けて分散キャッシュ４−２に追記した後、その値（Ｘ＝１６）を人名９２１（”田中”）とともにプロセッサコア９０１−３に向けて出力する。また、プロセッサコア９０１−１は、２回目の”田中”に対するブロック処理では、課金情報データベース９０２から”田中”の現在の累計額９２２を読み出してその値（Ｘ＝１５）を人名９２１（”田中”）とともにプロセッサコア９０１−２に向けて出力する。
【００９４】
時刻ｔ３において、プロセッサコア９０１−２からのデータ入力（”田中”，Ｘ＝１６）を受けて、プロセッサコア９０１−３が、１回目の”田中”に対するブロック処理を開始する。また、プロセッサコア９０１−３と並列に、プロセッサコア９０１−１からのデータ入力（”田中”，Ｘ＝１５）を受けて、プロセッサコア９０１−２が、２回目の”田中”に対するブロック処理を開始する。また、プロセッサコア９０１−３およびプロセッサコア９０１−２と並列に、３回目の名札９１０の入力を受けて、プロセッサコア９０１−１が、３回目の”田中”に対するブロック処理を開始する。
【００９５】
プロセッサコア９０１−３は、１回目の”田中”に対するブロック処理では、プロセッサコア９０１−２から引き渡された更新後の累計額９２２の値（Ｘ＝１６）を、課金情報データベース９０２に書き込む。また、プロセッサコア９０１−２は、２回目の”田中”に対するブロック処理では、分散キャッシュ４−２に該当するデータ（時刻ｔ２において追記したデータ）があるのを確認し、その値（Ｘ＝１６）に基づいて課金処理（Ｘ←Ｘ＋１）を行う。そして、更新後の値（Ｘ＝１７）を人名９２１（”田中”）と紐付けて分散キャッシュ４−２に追記した後、その値（Ｘ＝１７）を人名９２１（”田中”）とともにプロセッサコア９０１−３に向けて出力する。また、プロセッサコア９０１−１は、３回目の”田中”に対するブロック処理では、課金情報データベース９０２から”田中”の現在の累計額９２２を読み出してその値（Ｘ＝１５）を人名９２１（”田中”）とともにプロセッサコア９０１−２に向けて出力する。
【００９６】
時刻ｔ４において、プロセッサコア９０１−２からのデータ入力（”田中”，Ｘ＝１７）を受けて、プロセッサコア９０１−３が、２回目の”田中”に対するブロック処理を開始する。また、プロセッサコア９０１−３と並列に、プロセッサコア９０１−１からのデータ入力（”田中”，Ｘ＝１５）を受けて、プロセッサコア９０１−２が、３回目の”田中”に対するブロック処理を開始する。なお、プロセッサコア９０１−１は、データ入力待ちである。
【００９７】
プロセッサコア９０１−３は、２回目の”田中”に対するブロック処理では、プロセッサコア９０１−２から引き渡された更新後の累計額９２２の値（Ｘ＝１７）を、課金情報データベース９０２に書き込む。また、プロセッサコア９０１−２は、３回目の”田中”に対するブロック処理では、分散キャッシュ４−２に該当するデータ（時刻ｔ２，ｔ３において追記したデータ）があるのを確認し、そのうちの最新の値（Ｘ＝１７）に基づいて課金処理（Ｘ←Ｘ＋１）を行う。そして、更新後の値（Ｘ＝１８）を人名９２１（”田中”）と紐付けて分散キャッシュ４−２に追記した後、その値（Ｘ＝１８）を人名９２１（”田中”）とともにプロセッサコア９０１−３に向けて出力する。
【００９８】
時刻ｔ５において、プロセッサコア９０１−２からのデータ入力（”田中”，Ｘ＝１８）を受けて、プロセッサコア９０１−３が、３回目の”田中”に対するブロック処理を開始する。なお、プロセッサコア９０１−１およびプロセッサコア９０１−２は、データ入力待ちである。
【００９９】
プロセッサコア９０１−３は、３回目の”田中”に対するブロック処理では、プロセッサコア９０１−２から引き渡された更新後の累計額９２２の値（Ｘ＝１８）を、課金情報データベース９０２に書き込む。
【０１００】
図１１に示すように、本発明を適用すれば、課金装置９００が、”田中”と記された名札９１０を３回連続して受け取ったとしても、パイプラインストールを発生させずに期待される結果が得られる。
【０１０１】
なお、上記実施形態には、データベースへのアクセス処理を含む一連の処理を、並列動作可能な処理実行部によるパイプライン方式で実行する情報処理装置であって、データベースに記憶されるデータである１つの記憶データ（ＤＢデータ）に対して、該記憶データの内容をある処理実行部が参照した後に別の処理実行部が更新しないように一連の処理を複数のブロック処理に分割した各ブロック処理と１対１に対応し、所定のタイミングで、対応づけられた一のブロック処理を実行する処理実行部（例えば、処理実行部２−１〜２−Ｎ）と、少なくとも複数のブロック処理のうち記憶データの更新処理を含むブロック処理と対応づけられた処理実行部に付随して設けられ、該処理実行部がブロック処理で更新した記憶データの内容を、追記された順序がわかる形式で保持するキャッシュ部（例えば、キャッシュ部４−１〜４−Ｎ）とを備えた情報処理装置の構成が示されている。
【０１０２】
また、上記実施形態には、各処理実行部が、ブロック処理で記憶データの内容を参照する場合に、データベースに格納されている内容よりも当該処理実行部に付随するキャッシュ部に保持されている最新の内容を優先して参照する情報処理装置の構成が示されている（例えば、図８のステップＳ１１０〜Ｓ１１１）。
【０１０３】
また、上記実施形態には、各処理実行部が、当該処理実行部がブロック処理で更新した記憶データの内容を、当該処理実行部に付随するキャッシュ部に追記する登録部と、当該処理実行部がブロック処理で参照する記憶データの内容として、データベースに格納されている内容よりも当該処理実行部に付随するキャッシュ部に保持されている最新の内容を優先させる選択部とを含む情報処理装置の構成が示されている。
【０１０４】
また、上記実施形態には、予めデータベースのデータ項目に対して、更新の権限を与える一の処理実行部が割り当てられている情報処理装置であって、各処理実行部は、記憶データのうち、当該処理実行部に割り当てられているデータ項目の記憶データに対してのみ更新が可能で、かつ当該処理実行部およびパイプラインにおいて当該処理実行部よりも前段に位置する処理実行部に割り当てられているデータ項目の記憶データに対してのみ参照が可能である情報処理装置の構成が示されている。
【０１０５】
また、上記実施形態には、所定数以下のブロック処理でのみデータベースから記憶データの内容を読み出すように、かつ所定数以下のブロック処理でのみデータベースに対して記憶データの内容を書き込むように、一連の処理が分割されている情報処理装置の構成が示されている。
【０１０６】
また、上記実施形態には、１番目に実行されるブロック処理でのみデータベースから記憶データの内容を読み出すように、かつ最後に実行されるブロック処理でのみデータベースに対して記憶データの内容を書き込むように、一連の処理が分割されている情報処理装置の構成が示されている。
【０１０７】
また、上記実施形態には、キャッシュ部が、ＦＩＦＯ型のキューによって実現される情報処理装置の構成が示されている。また、上記実施形態には、複数の処理実行部が、１つ以上のプロセッサによって実現される情報処理装置の構成が示されている。
【産業上の利用可能性】
【０１０８】
本発明は、データベースに対するアクセス処理を含む一連の処理を行う情報処理装置に限らず、１つ以上の独立動作可能な処理単位（スレッド，プロセス，タスク等）を動作させる１つ以上のプロセッサを具備する情報処理装置であって、パイプライン実行させるとデータハザードの可能性がある一連の処理を実行する情報処理装置であれば、好適に適用可能である。
【図面の簡単な説明】
【０１０９】
【図１】本発明による情報処理装置の構成例を示すブロック図である。
【図２】本実施形態による情報処理装置のより具体的な構成例を示すブロック図である。
【図３】データベース３に記憶される情報の概念図である。
【図４】情報処理装置１におけるデータの流れの一例を示す説明図である。
【図５】ある分散キャッシュ４−Ｘにおける情報の構成の一例を示す説明図である。
【図６】処理実行部２−１〜２−Ｎが列データ２２−１〜２２−Ｎに対してどのようなアクセスが可能かを示す説明図である。
【図７】１番目の処理実行部２−１の動作例を示すフローチャートである。
【図８】全ての処理実行部２−１〜２−Ｎに共通する動作の処理フローの一例を示す処理フローである。
【図９】２番目〜（Ｎ−１）番目の処理実行部２−Ｙ（２≦Ｙ＜Ｎ）の動作例を示すフローチャートである。
【図１０】Ｎ番目の処理実行部２−Ｎの動作例を示すフローチャートである。
【図１１】図１２に示す情報処理装置（課金装置９００）に本発明を適用した場合のタイムチャートを示す説明図である。
【図１２】データベースへのアクセス処理を含む一連の処理を実行する情報処理装置にパイプライン方式を適用させた例を示す説明図である。
【図１３】図１２に示す情報処理装置（課金装置９００）におけるタイムチャートの例を示す説明図である。
【図１４】図１２に示す情報処理装置（課金装置９００）におけるタイムチャートの他の例を示す説明図である。
【符号の説明】
【０１１０】
１  情報処理装置
２−１〜２−Ｎ  実行処理部
３  データベース
４−１〜４−Ｎ  キャッシュ部，分散キャッシュ
【図１】
0005256685.tif 000002
【図２】
0005256685.tif 000003
【図３】
0005256685.tif 000004
【図４】
0005256685.tif 000005
【図５】
0005256685.tif 000006
【図６】
0005256685.tif 000007
【図７】
0005256685.tif 000008
【図８】
0005256685.tif 000009
【図９】
0005256685.tif 000010
【図１０】
0005256685.tif 000011
【図１１】
0005256685.tif 000012
【図１２】
0005256685.tif 000013
【図１３】
0005256685.tif 000014
【図１４】
0005256685.tif 000015