以下、本発明の実施の形態を図面を参照して説明する。図1は、本発明による情報処理装置の構成例を示すブロック図である。図1に示すように、本発明による情報処理装置1は、データベース3へのアクセス処理を含む一連の処理を、複数の処理実行部を用いてパイプライン方式によって並列実行する装置であって、複数の処理実行部2−1〜2−Nと、複数のキャッシュ部4−1〜4−Nとを備える。なお、ここでいうデータベース3は、データベースシステムとして構築される記憶システムに限らず、少なくとも複数の処理実行部から同時にアクセスされた場合にデータの整合性が保たれるような記憶システムであればよい。また、情報処理装置1が直接に備えていなくてもアクセス可能に接続されていればよい。
本例では、情報処理装置1が実行する一連の処理は、予めN個(N≧2)のステップに分割されている。なお、N個に分割された各々のステップで実行される処理のことをブロック処理と呼ぶ場合がある。本発明では、データベース3に記憶されるデータである1つのDBデータに対して、該DBデータの内容をある処理実行部が参照(更新のための参照を含む。)した後に別の処理実行部が更新しないことを条件に、一連の処理は分割される。分割されたそれぞれのブロック処理は、処理実行部2−1〜2−Nに1つずつ割り当てられている。なお、本例では、処理実行部2−1に最初のブロック処理、処理実行部2−2にその次のブロック処理、処理実行部2−Nに最後のブロック処理というように、処理実行部に付された番号の順にブロック処理が割り当てられているものとする。
各処理実行部2(処理実行部2−1〜2−N)は、並列動作可能な処理手段であって、予め割り当てられた一のブロック処理を、それぞれ所定のタイミングに従って実行する。なお、各処理実行部2−1〜2−Nがブロック処理を実行するタイミングは、例えば、外部またはパイプラインにおける前段の処理実行部からのデータ入力があったときであってもよい。
各キャッシュ部4(キャッシュ部4−1〜4−N)は、処理実行部2−1〜2−Nの各々に対応して設けられ、対応づけられた処理実行部2がブロック処理で更新したDBデータの内容を、少なくとも該内容がデータベース3に反映されるまでの間、追記された順序がわかる形式で保持する。なお、キャッシュ部4は、少なくともDBデータの更新処理を含むブロック処理が割り当てられた処理実行部2に対して設けられていればよい。
キャッシュ部4は、対応づけられた処理実行部がブロック処理で更新したDBデータの内容を、該DBデータを識別するための情報とともに、所定の回数分、追記された順序がわかる形式で保持すればよい。キャッシュ部4は、例えば、DBデータの内容を、そのDBデータを格納しているレコードのキーやそのDBデータの項目名とともに保持してもよい。また、キャッシュ部4は、一連の処理においてそのDBデータがデータベース3から読み込まれてから書き込まれるまでの間にかかるブロック処理数(パイプライン実行数)に基づいて定められた回数分のブロック処理において更新されたDBデータの内容を、実行処理順序がわかる形式で保持するようにしてもよい。例えば、パイプライン段数(N)−1回分のブロック処理において更新されたDBデータの内容を履歴情報として保持できるようにしてもよい。
各処理実行部2は、ブロック処理でDBデータの内容を参照する場合には、データベースに格納されている内容よりも当該処理実行部2に付随するキャッシュ部4に保持されている内容を優先させる。この時、キャッシュ部4に同じDBデータの内容が複数保持されている場合には、最新のDBデータの内容を優先させる。このことにより、パイプライン方式による並列化プログラミングにおける問題点であるデータハザードを回避できる。
以下、より具体的な構成例を用いて説明する。図2は、本実施形態による情報処理装置のより具体的な構成例を示すブロック図である。図2に示す情報処理装置1は、データベース3へのアクセス処理(読み出し処理や書き込み処理)を含む一連の処理を分割して実行する複数の処理実行部2−1〜2−Nと、各処理実行部2−1〜2−Nに付随して設けられる複数の分散キャッシュ4−1〜4−Nとを備える。
本例における処理実行部2−1〜2−Nは、それぞれ一のスレッドを動作させるための処理手段として示している。なお、一般的にはスレッドとプロセスは明確に区別されるが、本例におけるスレッドは、並列動作可能な処理の分割単位の総称を示すものとして用いる。従って、スレッドという表現には、狭義のスレッドやプロセスまたはタスクといった一般的に処理単位として表現されるものを全て内包するものとする。
本例では、情報処理装置1が実行する一連の処理は、予めN個(N≧2)のステップに分割され、各処理実行部2−1〜2−Nに1つずつ割り当てられている。なお、本例では、処理実行部2−1に最初のステップ、処理実行部2−2にその次のステップ、処理実行部2−Nに最後のステップというように、処理実行部2に付された番号の順に分割された各ステップが割り当てられているものとする。
各処理実行部2は、例えば、マイクロプロセッサのコアによって実現される。なお、1つの処理実行部を1つのコアで実現するようにしてもよいし、2以上の処理実行部を1つのコアで実現することも可能である。そのような場合には、例えば、1つのコア上で2以上のスレッドが動作するようにプログラム制御を行えばよい。また、処理実行部2−1〜2−Nの一部または全てを、自身に割り当てられたステップの実行に特化したハードウェア回路として実現してもよい。
各処理実行部2(処理実行部2−1〜2−N)は、予め自身に割り当てられたステップを、それぞれ所定のタイミングに従って実行する。また、各分散キャッシュ4(分散キャッシュ4−1〜4−N)は、対応する処理実行部2が、割り当てられたステップで更新したDBデータ(データベース3に記憶されるデータ)の内容を、実行順序がわかる形式で保持する。本例において、各分散キャッシュ4は、対応する処理実行部が、過去所定回数(例えば、N−1回)分のステップにおいて更新したDBデータの内容を、実行順序がわかる形式で保持する。なお、分散キャッシュ4−1〜4−Nは、図1におけるキャッシュ部4−1〜4−Nに該当する記憶手段である。
情報処理装置1が実行する一連の処理には、データベース3へのアクセスを伴う。図3は、データベース3に記憶される情報の概念図である。図3に示すように、本例におけるデータベース3は、1つ以上のレコード20を記憶する。各レコード20には、当該レコード20を一意に識別するためのキー21と、列データ22−1〜22−Nとが含まれる。ここで、各列データ22(列データ22−1〜22−N)は、処理実行部2と1対1で対応している。なお、ここでいう”列データ”とは、一レコードとして記憶されるデータ群を、そのデータの更新の権限を与える処理実行部に応じてN個に分割した際のデータのかたまりを概念的に示すものであって、必ずしもN個のデータ項目があることを示しているわけではない。従って、1つの列データの情報量は、いくつであってもよい。例えば、ある列データ22−X(1≦X≦N)は、{名前a,住所b,電話番号c}のように複数のデータ項目についてのデータの集合である場合もある。また、ある列データ22−X(1≦X≦N)は、0個のデータ項目についてのデータの集合(すなわち情報量が0)である場合もある。なお、列データの情報量が0ということは、その列データに対応する処理実行部がいずれのDBデータに対しても更新処理を行わないことを示している。また、列データは、合計値のような特定のレコードにしか含まれないデータを含んでいてもよい。
情報処理装置1は、処理対象10を示す情報が入力されると、その処理対象10を対象とする一連の処理を実行し、処理結果13を出力する。情報処理装置1は、処理対象10を処理する際、データベース3の特定の1つのレコード20をアクセスする。どのレコード20がアクセスされるかは、処理対象10を示す情報に含まれるキー11によって決定される。具体的には、キー11に一致するキー21を持つレコード20がアクセスされる。また、その処理対象10に対してどのような処理を行うかは、引数12が示す指示内容によって決定される。なお、固定の処理を行うだけならば、引数12は省略してもよい。
情報処理装置1は、処理実行部2−1〜2−Nによるブロック処理の実行を通じて、処理対象10を示す情報に含まれるキー11によって特定されるレコード20の列データ22−1〜22−Nを参照・更新しながら、一連の処理を遂行する。
情報処理装置1では、処理実行部2−1〜2−Nがパイプライン方式によって並列動作する。仮に、処理実行部2−1〜2−Nの全てがデータベース3に自在にアクセスできるようにした場合、データベース3の負荷が増大し、性能が低下する。その場合、さらに、複数の同時アクセスを調停する仕組みを導入しなくてはならず、システムの複雑化を招く。これらの問題を回避するため、データベース3からDBデータの内容を参照する処理(読出処理)を実行する処理実行部2と、データベース3に対してDBデータの内容を更新する処理(書込処理)を実行する処理実行部2とを、それぞれ少数(所定数以下)に限定する。好適には、最初に実行される一のブロック処理でのみデータベース3からDBデータの内容を読み出し、最後に実行される一のブロック処理でのみデータベース3に対してDBデータの内容を書き込むようにする。すなわち、処理実行部2−1が以降の処理実行部で用いるDBデータ(すなわち、列データ22−1〜22−N)の内容をまとめて読み出すようにし、パイプラインの動きに同期して処理実行部2−2〜2−Nに順次引き渡わたすようにし、最終的に処理実行部2−Nが、引き渡された内容をデータベース3に反映させるようにする。
図4は、情報処理装置1におけるデータの流れの一例を示す説明図である。なお、図4に示す例では、一連の処理は3つのブロック処理に分割され、処理実行部2−1〜2−3に1対1に対応づけられている。すなわち、並列動作されるスレッドの個数(N)は3である。前述の通り、1番目(最初)の処理実行部2−1のみがデータベース3からレコード20の内容(ここでは、列データ22−1〜22−3)を取得する。また、3番目(最後)の処理実行部2−3のみがデータベースに対してレコード20の内容を更新する。
1番目の処理実行部2−1は、割り当てられたステップを実行することによって、データベース3から処理対象のレコード20の内容を取得し、また、必要に応じて列データ22−1の内容の更新を含む所定の処理を行い、処理が完了すると次の処理実行部(処理実行部2−2)へ処理後の列データ22−1〜22−3の内容を引き渡す。2番目の処理実行部2−2は、割り当てられたステップを実行することによって、前の処理実行部(処理実行部2−1)から列データ22−1〜22−3を引継いで、必要に応じて列データ22−2の内容の更新を含む所定の処理を行い、処理が完了すると次の処理実行部(処理実行部2−3)へ処理後の列データ22−1〜22−3の内容を引き渡す。最後の処理実行部2−3は、割り当てられたステップを実行することによって、前の処理実行部(処理実行部2−1)から列データ22−1〜22−3を引継いで、必要に応じて列データ22−2の内容の更新を含む所定の処理を行い、また、データベース3に対して処理対象のレコード20の内容を更新し、処理結果13を出力する。
一般的には、ある1つのスレッドに閉じて処理が完結することは少ない。そのため、処理実行部2−X(1≦X≦N)が途中まで処理した結果を、次の処理実行部2−(X+1)へ引き継がせる必要がある。なお、DBデータ(ここでは、列データ22−1〜22−3)以外に、スレッド間で引き継ぐ必要のあるデータがある場合には、図4に示すように、中間データとして引き継ぐようにしてもよい。また、処理対象10を示す情報(キー11や引数12)も引き継ぐようにしてもよい。
なお、図4に示す例では、分散キャッシュ4−1〜4−3には、少なくとも対応する処理実行部2(処理実行部2−1〜2−3のいずれか)で更新した列データの内容が記憶させていればよい。なお、各処理実行部2で更新する列データ以外で参照する必要がある列データは、それ以前に実行される処理実行部によって適正な内容に書き換えられた上で引き渡されるので、特に付随する分散キャッシュ4−1〜4−3に保持させる必要はない。
次に、処理実行部2−1〜2−Nにおける列データ22−1〜22−Nに対するアクセス制限と分散キャッシュの必要性について説明する。
同一のキー11を持つ複数の処理対象10の間には、前の処理結果が後の処理結果に影響を与えることから、依存関係があるといえる。仮に、同一の処理対象10に対する処理を単純に並列実行しようとすると、後に到着した処理対象10に対する処理は、その処理対象10に関するデータべース3(ここでは、キー11で特定される列データ22−1〜列データ22−N)への参照が生じた時点で、これより前に到着した処理対象10に対する処理が進行してその結果が確定するまで停止状態になる。これは、パイプライン方式のマイクロプロセッサにおけるRead−After−Writeデータハザードと同様の原理によるパイプラインストールであって、性能の低下を招く結果となる。
そこで、データハザード(ここでは、データベース内のあるデータに対する参照と更新の前後関係が整合しないことによって生じるデータ内容の不整合を意味する。)に起因するパイプラインストールを排除するため、処理実行部2−1〜2−Nにおいて更新した各列データの内容を保持するための分散キャッシュを各処理実行部2−1〜2−Nの各々に配備するとともに、処理実行部2−1〜2−Nにおいて各列データに対するアクセスに制限をかける。
図5は、ある分散キャッシュ4−Xにおける情報の構成の一例を示す説明図である。分散キャッシュ4−Xは、X番目の処理実行部2−Xからのみアクセスされ、(N−1)個のキャッシュエントリを登録できるFIFO(First-In First-Out)型のキューとして実現されていてもよい。ここで、N−1とは、1番目の処理実行部2−1がデータベース3からレコード20を読み出して、N番目の処理実行部2−Nがそのレコードをデータベース3に反映させる場合において、レコード20の内容を更新した後、その内容が、再びデータベース3に格納されている内容として、対応する処理実行部2に引き渡されるまでにかかるパイプライン実行回数を意味している。各エントリは、対応する処理実行部2−Xにおけるブロック処理で更新された列データ22−Xの内容と、その列データ22−Xを識別するための情報(ここでは、キー21)とを含む。なお、列データ22−Xを識別するための情報は、処理実行部2−Xが更新する列データ22−Xのデータ項目が固定的に割り当てられるものであるため、その列データ22−Xを含む処理対象となったレコード20を識別するための情報であってもよい。なお、他の分散キャッシュ4についても同様である。
また、図6は、処理実行部2−1〜2−Nが列データ22−1〜22−Nに対してどのようなアクセスが可能かを示す説明図である。本発明では、データベース3に記憶される1つのデータに対して、ある処理実行部が参照した後に別の処理実行部が該データの内容を更新しないように、各処理実行部の処理順序および分割単位を考慮した上で、一連の処理が分割されている。なお、上記参照は、更新のための参照を含む。これにより、予めデータベースの各データ項目に対して、更新の権限を与える一の処理実行部が割り当てられ、各処理実行部2−X(1≦X≦N)は、当該処理実行部2−Xに割り当てられているデータ項目のまとまりである列データ22−Xに対してのみ更新が可能で、かつ当該処理実行部2−Xおよびパイプラインにおいて当該処理実行部2−Xよりも前段に位置する処理実行部2−(X−1)に割り当てられているデータ項目のまとまりである列データ22−1〜22−(X−1)に対してのみ参照が可能であるというアクセス制限が課されることになる。
このように、各処理実行部2−1〜2−Nのブロック処理での更新値を保持する分散キャッシュと、アクセス制限を課すことによって、データベース操作に対しロック操作をすることなく、データハザードを回避させる。それは、実際にデータベースに書き込まれる前に、次の処理を開始したとしても、付随する分散キャッシュ4に保持されている内容および前段に位置する処理実行部から引き渡される内容を参照すれば、これまでの処理結果が取得できるからである。
次に、本実施形態の動作を図7〜図10のフローチャートを参照して説明する。ここでは、図2に示す実施形態における情報処理装置1の動作を、1番目の処理実行部2−1の動作と、2番目〜(N−1)番目の処理実行部2−Y(2≦Y<N)の動作と、N番目の処理実行部2−Nの動作とに分けて説明する。
まず、図7に示すフローチャートを参照して、1番目処理実行部2−1の動作について説明する。図7は、本実施形態における処理実行部2−1の動作例を示すフローチャートである。図7に示すように、処理順序が1番目の処理実行部2−1は、処理対象10が情報処理装置1に入力されるまで待ち、処理対象10が入力されたら次のステップS101へ進む(ステップS100)。
ステップS101では、処理実行部2−1は、データベース3を検索して、処理対象10を示す情報に含まれるキー11に対応するレコード20を特定し、そのレコード20から列データ22−1〜22−Nを取得する。また、処理実行部2−1は、ここで取得した列データ22−1〜22−Nを、今回の処理対象10に対する一連の処理における列データ22−1〜22−Nの内容を保持する変数であるASS_DATA[1]〜ASS_DATA[N]に代入する。
また、処理実行部2−1は、処理対象10を示す情報に含まれる引数12に、ARGUMENTという別名を与え、ステップS103に進む(ステップS102)。なお、ARGUMENTは、指示内容を格納する変数として用いている。
次に、処理実行部2−1は、全処理実行部に共通する処理動作を行う(ステップS103)。図8は、全処理実行部2に共通する動作の処理フローの一例を示す処理フローである。ここでは、1番目の処理実行部2−1から呼び出された処理動作として説明する。従って、図8におけるX=1である。なお、本例では、全処理実行部に対して分散キャッシュが割り当てられている場合を例にしているが、例えば、DBデータの更新処理を含まないブロック処理が割り当てられた処理実行部に対して分散キャッシュの割り当てを省略する場合には、当該処理(ステップS103)は、DBデータの更新処理を含むブロック処理が割り当てられた処理実行部に共通する処理として実装すればよい。なお、DBデータの更新処理を含まないブロック処理が割り当てられた処理実行部は、図8におけるステップS112のみを実行すればよい。
全ての処理実行部2−1〜2−Nに共通する動作として、まず、処理実行部2−Xは、処理実行部2−Xは、当該処理実行部2−Xに付随する分散キャッシュ4−Xを検索し、今回の処理対象10に対する一連の処理における列データ22−Xと同じ列データ22−Xの内容が登録されているか否かを判定する(ステップS110)。処理実行部2−Xは、例えば、分散キャッシュ4−Xに、処理対象10を示す情報に含まれるキー11と等しいキー21を持つキャッシュエントリが存在するか否かを判定すればよい。そのようなキャッシュエントリが存在していれば(ステップS110のYes)、ステップS111に進む。
ステップS111では、ASS_DATA[X]の内容を、分散キャッシュ4−Xで検索された該当する列データ22−Xの内容に書き換える。これにより、今回の処理対象10にかかる列データ22−Xに関して、これまでに更新した結果が、データベース3に反映されていない場合(または反映されたときには、既に読み出し処理が終了していた場合)であっても、それまでの処理結果を反映させた上で、今回の一連の処理を行うことができるようになる。なお、分散キャッシュ4−Xに該当する列データ22−Xが複数存在していた場合には、そのうちの最新の列データ22−X(キー11と等しいキー21を持つキャッシュエントリのうち最も新しく追記されたキャッシュエントリとして登録されている列データ22−X)の内容を優先させる。前述のとおり、分散キャッシュ4−XをFIFO形式のキュー等により実現することによって、分散キャッシュ4−Xは、追記された順序がわかる形式でキャッシュエントリを保持することができるので、該当する列データ22−Xのうち最新の列データ22−Xを特定することは容易である。
一方、該当するキャッシュエントリが存在しなければ(ステップS110のNo)、ASS_DATA[X]には、今回の処理対象にかかる列データ22−Xに関して、既にこれまでの処理結果が反映された後のデータベース3から読み出された内容が保持されているとして、そのままステップS112へ進む。
ASS_DATA[X]にこれまでの処理結果を反映させる処理が終了すると、ステップS112では、当該処理実行部2−Xに割り当てられている所定の処理を実行する。ここでは、キー11やARGUMENTを参照したり、中間データ40−X(例えば、引数12を内部のイベント指示に変換したものや引数12に対して所定の演算を加えたもの)を生成してもよい。また、ASS_DATA[1]〜ASS_DATA[N]のうち、ASS_DATA[1]〜ASS_DATA[X]を参照したり、ASS_DATA[X]を更新してもよい。なお、ASS_DATA[1]〜ASS_DATA[X−1]については、前の処理実行部によってこれまでの処理結果が反映された上で処理された結果が引き渡されるので、当該処理実行部2−Xにおいても参照可能となる。なお、X=1の場合には、当該処理実行部2−1に対応づけられた列データ22−1の内容、すなわちASS_DATA[1]の内容のみを参照および更新可能である。
ステップS112における当該処理実行部2−Xに割り当てられている所定の処理が完了すると、処理実行部2−Xは、その処理で更新した列データ22−Xの内容、すなわちASS_DATA[X]の内容を、その列データ22−Xを識別するためのキー11とともに、分散キャッシュ4−Xに記憶させる(ステップS113)。これは、今回の処理によって更新した列データ22−Xの内容がデータベース3に反映される前に、同じ処理対象10が指定された一連の処理が開始された場合に、今回更新した列データ22−Xの内容を用いらせるための処理である。なお、分散キャッシュ4−Xに今回の更新にかかるキャッシュエントリを追記した結果、分散キャッシュ4−Xの記憶容量を超えることになる場合には、最も古いキャッシュエントリが押し出されて消去される。
全ての処理実行部2−1〜2−Nに共通する動作は、以上により終了し、処理実行部2−1は、元の動作に復帰する。
なお、ステップS110〜ステップS111の処理およびステップS113の処理は、独立したステップとしてステップS112において随時実行されるようにしてもよい。例えば、各処理実行部2が共通して備える選択部(図示せず。)が、当該選択部を備える処理実行部2−Xがブロック処理でASS_DATA[1]〜ASS_DATA[N]を参照するための関数を提供し、その関数内で分散キャッシュ4−Xに保持されている最新の内容を優先させるような選択処理を実行するようにしてもよい。また、例えば、各処理実行部2が共通して備える登録部(図示せず。)が、当該登録部を備える処理実行部2−Xがブロック処理でASS_DATA[N]を更新するための関数を提供し、その関数内でASS_DATA[X]を更新するとともに分散キャッシュ4−Xに更新後の内容を追記させるような登録処理を実行するようにしてもよい。
全ての処理実行部2−1〜2−Nに共通する動作(図8のステップS110〜S113)が終了すると、処理実行部2−1は、キー11,ASS_DATA[1]〜ASS_DATA[N],1番目の中間データを、2番目の処理実行部2−2に出力する(ステップS104)。以上で1つの処理対象10に対する処理実行部2−1の処理は終了する。処理実行部2−1は、ステップS100に戻り、次のブロック処理の開始タイミングを待つ。
例えば、図12に示した課金装置900に本発明を適用した場合、処理実行部2−2に相当するプロセッサコア901−1が、図7に示すフローチャートに従って動作することになる。なお、図12に示す課金装置900の例では、DBデータである累計額922に対して、プロセッサコア901−2にその更新の権限が与えられている。従って、累計額922が列データ22−2に相当する。なお、列データ22−1,22−3に相当するDBデータは存在しない。すなわち、プロセッサコア901−1,901−3に割り当てられたブロック処理にはDBデータの更新処理が含まれず、列データ22−1,22−3は情報量が0(データ項目が0)である。このような場合には、プロセッサコア901−1,901−3に対応する分散キャッシュ4−1,4−3を省略することも可能である。
プロセッサコア901−1は、例えば、図7に示すフローチャートに従い、名札910が入力されるまで待ち、名札910が入力されたらステップS101に進む(ステップS100)。ステップS101では、プロセッサコア901−1は、入力された名札910と等しい人名921を持つレコード920を課金情報データベース902から検索し、検索されたレコード920の現在の累計額922を取得する。ここで取得した累計額922をASS_DATA[2]に代入する。なお、本例では、ASS_DATA[1]およびASS_DATA[3]は存在しない。また、指示内容は常に固定であるため、ステップS102の動作は省略される。また、プロセッサコア901−1に割り当てられたブロック処理では、DBデータの更新処理を含まず、またデータベースからの読み出し以外の処理も含まれていないため、全処理実行部に共通の処理(図9のステップS122、具体的には図8のステップS110〜S113)は全て省略される。
そして、プロセッサコア901−1は、名札910と、ASS_DATA[2](ここでは、課金情報データベース902から読み出した、入力された名札910と等しい人名921を持つレコード920の累計額922の内容)とを、次のプロセッサコア901−2に出力する(ステップS104)。以上で、プロセッサコア901−1は、1回の名札910の入力に対するブロック処理を終了し、次のブロック処理の開始タイミングを待つことになる。
仮に、”田中”が記された名札910が続けて入力されていた場合には、プロセッサコア901−1は、2回目の名札910の入力に対するブロック処理として、再度”田中”と等しい人名922を持つレコード920を読み出して、ASS_DATA[2]に代入し、次のプロセッサコア901−2に引き渡すことになる。なお、パイプライン方式による並列処理では、プロセッサコア901−1が2回目の名札910の入力に対するブロック処理を実行しているときに、プロセッサコア901−2が1回目の名札910の入力に対するブロック処理を実行することになる。従って、プロセッサコア901−1における2回目の”田中”の入力に対するブロック処理では、1回目の”田中”の入力によって更新されるはずの内容がまだ反映されていない累計額922の内容を課金情報データベース902から読み込むことになる。
次に、図9に示すフローチャートを参照して、2番目〜N−1番目の処理実行部2−Y(2≦Y<N)の動作について説明する。図9は、本実施形態における2番目〜N−1番目の処理実行部2−Y(2≦Y<N)の動作例を示すフローチャートである。図9に示すように、処理順序が2番目〜N−1番目の処理実行部2−Yは、(Y−1)番目の処理実行部2−(Y−1)から、キー11,ASS_DATA[1]〜ASS_DATA[N],(Y−1)番目の中間データが入力されるまで待ち、それら情報が入力されたら次のステップS121へ進む(ステップS120)。
ステップS121では、処理実行部2−Yは、前の処理実行部2−(Y−1)から引き渡された(Y−1)番目の中間データに、ARGMENTという別名を与え、ステップS122へ進む。
次に、処理実行部2−Yは、全処理実行部に共通する処理動作を行う(ステップS122)。なお、ステップS122の動作は、図7における処理実行部2−1が読み出すステップS103として説明した動作と同様である。すなわち、図8に示すように、当該処理実行部2−X(ここでは、X=Y)が更新を管理している列データ22−Xの内容を、これまでの処理結果を反映した内容とした上で、必要に応じて列データ22−Xの更新をしたり、その内容を分散キャッシュ4−Xに追記したりする。なお、X=2の場合には、当該処理実行部2−2に対応づけられた列データ22−2の内容、すなわち、ASS_DATA[2]の内容をこれまでの処理結果を反映した内容とした上で、必要に応じてASS_DATA[2]の内容を更新したり、その結果を分散キャッシュ4−2に追記したりする。その際、処理実行部2−2は、ASS_DATA[1],ASS_DATA[2]の参照が可能である。
全ての処理実行部2−1〜2−Nに共通する動作(図8のステップS110〜S113)が終了すると、処理実行部2−Yは、キー11,ASS_DATA[1]〜ASS_DATA[N],Y番目の中間データを、(Y+1)番目の処理実行部2−(Y+1)に出力する(ステップS123)。以上で1つの処理対象10に対する処理実行部2−Yの処理は終了する。処理実行部2−Yは、ステップS120に戻り、次のブロック処理の開始タイミングを待つ。
例えば、図12に示した課金装置900に本発明を適用した場合、処理実行部2−2に相当するプロセッサコア901−2が、図9に示すフローチャートに従って動作することになる。プロセッサコア901−2は、例えば、図9に示すフローチャートに従い、プロセッサコア901−1から、名札910とASS_DATA[2]とが入力されるまで待ち、それら情報が入力されたらステップS121に進む(ステップS120)。なお、プロセッサコア901−2においても、指示内容は常に固定であるため、ステップS121の動作は省略される。
次に、プロセッサコア901−2は、DBデータの更新処理を含むブロック処理が割り当てられたプロセッサコアに共通する処理動作を行う(ステップS122)。ここでは、まず、当該プロセッサコア901−2に割り当てられている列データ22−2である累計額922の内容を、これまでの処理結果を反映した内容にするための処理を行う。プロセッサコア901−2は、当該プロセッサコア901−2に付随する分散キャッシュ4−2を検索し、今回の処理対象10(名札910)に対する一連の処理における累計額922と同じ累計額922の内容が登録されているか否かを判定する(ステップS110)。例えば、”田中”が記された名札910に対して処理をしている場合には、”田中”と等しい人名922を持つキャッシュエントリが存在するか否かを判定すればよい。そのようなキャッシュエントリが存在していれば(ステップS110のYes)、ASS_DATA[2]の内容を分散キャッシュ4−Xで検索された該当する累計額922の最新の内容に書き換える。
一方、該当するキャッシュエントリが存在しなければ(ステップS110のNo)、ASS_DATA[2]には既にこれまでの処理結果が反映された内容が保持されているとして、ステップS112へ進む。
ASS_DATA[2]にこれまでの処理結果を反映させる処理が終了すると、ステップS112では、当該処理実行部2−Xに割り当てられている所定の処理を実行する。ここでは、プロセッサコア901−2は、ASS_DATA[2]に1を加える。ステップS112における当該プロセッサコア901−2に割り当てられている所定の処理が完了すると、プロセッサコア901−2は、その処理で更新した累計額922の内容、すなわちASS_DATA[2]の内容を、その累計額922を識別するための人名921とともに、分散キャッシュ4−2に記憶させる(ステップS113)。なお、分散キャッシュ4−2には、少なくとも2回分のキャッシュエントリが保持できる記憶容量を持たせればよい。
そして、プロセッサコア901−2は、名札910と、ASS_DATA[2](ここでは、ステップS112で更新した累計額922の内容)とを、次のプロセッサコア901−3に出力する(ステップS123)。以上で、プロセッサコア901−1は、1回の名札910の入力に対するブロック処理を終了し、次のブロック処理の開始タイミングを待つことになる。
仮に、”田中”が記された名札910が続けて入力されていた場合には、プロセッサコア901−2は、2回目の名札910の入力に対するブロック処理として、再度”田中”の累計額922の更新処理を行い、次のプロセッサコア901−3に引き渡すことになる。なお、2回目のブロック処理のステップS112では、ASS_DATA[2]の内容として、プロセッサコア901−1から引き渡される、実際に課金情報データベース902から読み出された内容ではなく、1回目のブロック処理におけるステップS113で分散キャッシュ4−2に追記され、2回目のブロック処理のステップS111で書き換えられた内容が用いられることになる。また、2回目のブロック処理が完了した時点で、分散キャッシュ4−2には、1回目の処理で更新された”田中”の累計額922の内容と、2回目の処理で更新された”田中”の累計額922の内容とが保持されることになる。
なお、さらに”田中”が記された名札910が続けて入力されていた場合には、プロセッサコア901−2は、3回目の名札910の入力に対するブロック処理として、再度”田中”の累計額922の更新処理を行い、次のプロセッサコア901−3に引き渡すことになる。なお、3回目のブロック処理のステップS112では、2回目のブロック処理のステップS113で分散キャッシュ4−2に追記され、3回目のブロック処理ステップS111で書き換えられた内容(最新の内容)が用いられることになる。また、3回目のブロック処理が完了した時点で、分散キャッシュ4−2には、2回目の処理で更新された”田中”の累計額922の内容と、3回目の処理で更新された”田中”の累計額922の内容とが保持されることになる。
なお、同じ人名を持つ名札910が間隔を明けて入力され、前に処理したときの更新内容が分散キャッシュ4−2から消去されている場合には、既にその内容は課金情報データベース902に反映され取得可能になっていることを意味しているので、プロセッサコア901−2は、プロセッサコア901−1から引き継いだASS_DATA[2]の内容をそのまま用いればよい。
次に、図10に示すフローチャートを参照して、最後(N番目)の処理実行部2−Nの動作について説明する。図10は、本実施形態におけるN番目の処理実行部2−Nの動作例を示すフローチャートである。図10に示すように、処理順序が最後の処理実行部2−Nは、(N−1)番目の処理実行部2−(N−1)から、キー11,ASS_DATA[1]〜ASS_DATA[N],(N−1)番目の中間データが入力されるまで待ち、それら情報が入力されたら次のステップS131へ進む(ステップS130)。
ステップS131では、処理実行部2−Nは、前の処理実行部2−(N−1)から引き渡された(N−1)番目の中間データに、ARGUMENTという別名を与え、ステップS132へ進む。
次に、処理実行部2−Nは、全処理実行部に共通する処理動作を行う(ステップS132)。なお、ステップS132の動作は、図7における処理実行部2−1が読み出すステップS103として説明した動作と同様である。すなわち、図8に示すように、当該処理実行部2−X(ここでは、X=N)が更新を管理している列データ22−Xの内容を、これまでの処理結果を反映した内容とした上で、必要に応じて列データ22−Xの更新をしたり、その内容を分散キャッシュ4−Xに追記したりする。なお、X=Nの場合には、当該処理実行部2−Nに対応づけられた列データ22−Nの内容、すなわち、ASS_DATA[N]の内容をこれまでの処理結果を反映した内容とした上で、必要に応じてASS_DATA[N]の内容を更新したり、その結果を分散キャッシュ4−Nに追記したりする。その際、処理実行部2−Nは、ASS_DATA[1]〜ASS_DATA[N−1]の参照が可能である。
全ての処理実行部2−1〜2−Nに共通する動作(図8のステップS110〜S113)が終了すると、処理実行部2−Nは、今回の処理対象10に対する一連の処理によって更新された列データ22−1〜22−Nの内容をデータベース3に反映させる(ステップS133)。処理実行部2−Nは、キー11と等しいキー21を持つレコード20をデータベース3から検索して、そのレコード20に含まれる列データ22−1〜22−Nの内容として、ASS_DATA[1]〜ASS_DATA[N]の内容を書き込む。
そして、処理実行部2−Nは、処理結果13を示す情報を出力する(ステップS134)。以上で1つの処理対象10に対する処理実行部2−Nの処理は終了する。処理実行部2−Nは、ステップS130に戻り、次のブロック処理の開始タイミングを待つ。
例えば、図12に示した課金装置900に本発明を適用した場合、処理実行部2−Nに相当するプロセッサコア901−3が、図10に示すフローチャートに従って動作することになる。プロセッサコア901−3は、例えば、図10に示すフローチャートに従い、プロセッサコア901−2から、名札910とASS_DATA[2]とが入力されるまで待ち、それら情報が入力されたらステップS131に進む(ステップS130)。なお、プロセッサコア901−3においても、指示内容は常に固定であるため、ステップS131の動作は省略される。
また、プロセッサコア901−3に割り当てられたブロック処理では、DBデータの更新処理を含まず、またデータベースへの書き込み処理以外の処理も含まれていないため、全処理実行部に共通の処理(図10のステップS132、具体的には図8のステップS110〜S113)は全て省略される。
次に、プロセッサコア901−3は、今回の名札910に対する一連の処理によって更新された列データである累計額922の内容を課金情報データベース902に反映させる(ステップS133)。プロセッサコア901−3は、名札910に記された人名と等しい人名921を持つレコード920を課金情報データベース902から検索して、そのレコード920に含まれる累計額922の内容として、ASS_DATA[2]の内容を書き込めばよい。そして、プロセッサコア901−3は、必要であれば処理結果13を示す情報を出力する(ステップS134)。以上で、プロセッサコア901−3は、1回の名札910の入力に対するブロック処理を終了し、次のブロック処理の開始タイミングを待つことになる。
仮に、”田中”が記された名札910が続けて入力されていた場合であっても、プロセッサコア901−2からは、その都度これまでの処理結果が反映された内容に基づいて更新された累計額922の内容がASS_DATA[2]として入力されるので、特別な処理をすることなく、引き渡されたASS_DATA[2]の内容をそのまま課金情報データベース902に書き込む処理を行えばよい。
以上のように、本実施形態によれば、データベースの整合性と結果の一貫性を保証し、かつストールを生じさせずに、データベースへのアクセス処理を含む一連の処理をパイプライン方式によって並列実行することができる。
図11は、図12に示した課金装置900に本発明を適用した場合のタイムチャートである。図11では、”田中”と記された名札910が3回連続されたときのタイムチャートを示している。まず、時刻t1において、2回目の名札910の入力を受けて、プロセッサコア901−1が、1回目の”田中”に対するブロック処理を開始する。プロセッサコア901−1は、1回目の”田中”に対するブロック処理では、課金情報データベース902から”田中”の現在の累計額922を読み出してその値(X=15)を人名921(”田中”)とともにプロセッサコア901−2に向けて出力する。なお、プロセッサコア901−2およびプロセッサコア901−3は、データ入力待ちである。
時刻t2において、プロセッサコア901−1からのデータ入力(”田中”,X=15)を受けて、プロセッサコア901−2が、1回目の”田中”に対するブロック処理を開始する。また、プロセッサコア901−2と並列に、2回目の名札910の入力を受けて、プロセッサコア901−1が、2回目の”田中”に対するブロック処理を開始する。なお、プロセッサコア901−3は、データ入力待ちである。
プロセッサコア901−2は、1回目の”田中”に対するブロック処理では、分散キャッシュ4−2に該当するデータがないのを確認した上で、引き渡された値(X=15)に基づいて課金処理(X←X+1)を行う。そして、更新後の値(X=16)を人名921(”田中”)と紐付けて分散キャッシュ4−2に追記した後、その値(X=16)を人名921(”田中”)とともにプロセッサコア901−3に向けて出力する。また、プロセッサコア901−1は、2回目の”田中”に対するブロック処理では、課金情報データベース902から”田中”の現在の累計額922を読み出してその値(X=15)を人名921(”田中”)とともにプロセッサコア901−2に向けて出力する。
時刻t3において、プロセッサコア901−2からのデータ入力(”田中”,X=16)を受けて、プロセッサコア901−3が、1回目の”田中”に対するブロック処理を開始する。また、プロセッサコア901−3と並列に、プロセッサコア901−1からのデータ入力(”田中”,X=15)を受けて、プロセッサコア901−2が、2回目の”田中”に対するブロック処理を開始する。また、プロセッサコア901−3およびプロセッサコア901−2と並列に、3回目の名札910の入力を受けて、プロセッサコア901−1が、3回目の”田中”に対するブロック処理を開始する。
プロセッサコア901−3は、1回目の”田中”に対するブロック処理では、プロセッサコア901−2から引き渡された更新後の累計額922の値(X=16)を、課金情報データベース902に書き込む。また、プロセッサコア901−2は、2回目の”田中”に対するブロック処理では、分散キャッシュ4−2に該当するデータ(時刻t2において追記したデータ)があるのを確認し、その値(X=16)に基づいて課金処理(X←X+1)を行う。そして、更新後の値(X=17)を人名921(”田中”)と紐付けて分散キャッシュ4−2に追記した後、その値(X=17)を人名921(”田中”)とともにプロセッサコア901−3に向けて出力する。また、プロセッサコア901−1は、3回目の”田中”に対するブロック処理では、課金情報データベース902から”田中”の現在の累計額922を読み出してその値(X=15)を人名921(”田中”)とともにプロセッサコア901−2に向けて出力する。
時刻t4において、プロセッサコア901−2からのデータ入力(”田中”,X=17)を受けて、プロセッサコア901−3が、2回目の”田中”に対するブロック処理を開始する。また、プロセッサコア901−3と並列に、プロセッサコア901−1からのデータ入力(”田中”,X=15)を受けて、プロセッサコア901−2が、3回目の”田中”に対するブロック処理を開始する。なお、プロセッサコア901−1は、データ入力待ちである。
プロセッサコア901−3は、2回目の”田中”に対するブロック処理では、プロセッサコア901−2から引き渡された更新後の累計額922の値(X=17)を、課金情報データベース902に書き込む。また、プロセッサコア901−2は、3回目の”田中”に対するブロック処理では、分散キャッシュ4−2に該当するデータ(時刻t2,t3において追記したデータ)があるのを確認し、そのうちの最新の値(X=17)に基づいて課金処理(X←X+1)を行う。そして、更新後の値(X=18)を人名921(”田中”)と紐付けて分散キャッシュ4−2に追記した後、その値(X=18)を人名921(”田中”)とともにプロセッサコア901−3に向けて出力する。
時刻t5において、プロセッサコア901−2からのデータ入力(”田中”,X=18)を受けて、プロセッサコア901−3が、3回目の”田中”に対するブロック処理を開始する。なお、プロセッサコア901−1およびプロセッサコア901−2は、データ入力待ちである。
プロセッサコア901−3は、3回目の”田中”に対するブロック処理では、プロセッサコア901−2から引き渡された更新後の累計額922の値(X=18)を、課金情報データベース902に書き込む。
図11に示すように、本発明を適用すれば、課金装置900が、”田中”と記された名札910を3回連続して受け取ったとしても、パイプラインストールを発生させずに期待される結果が得られる。
なお、上記実施形態には、データベースへのアクセス処理を含む一連の処理を、並列動作可能な処理実行部によるパイプライン方式で実行する情報処理装置であって、データベースに記憶されるデータである1つの記憶データ(DBデータ)に対して、該記憶データの内容をある処理実行部が参照した後に別の処理実行部が更新しないように一連の処理を複数のブロック処理に分割した各ブロック処理と1対1に対応し、所定のタイミングで、対応づけられた一のブロック処理を実行する処理実行部(例えば、処理実行部2−1〜2−N)と、少なくとも複数のブロック処理のうち記憶データの更新処理を含むブロック処理と対応づけられた処理実行部に付随して設けられ、該処理実行部がブロック処理で更新した記憶データの内容を、追記された順序がわかる形式で保持するキャッシュ部(例えば、キャッシュ部4−1〜4−N)とを備えた情報処理装置の構成が示されている。
また、上記実施形態には、各処理実行部が、ブロック処理で記憶データの内容を参照する場合に、データベースに格納されている内容よりも当該処理実行部に付随するキャッシュ部に保持されている最新の内容を優先して参照する情報処理装置の構成が示されている(例えば、図8のステップS110〜S111)。
また、上記実施形態には、各処理実行部が、当該処理実行部がブロック処理で更新した記憶データの内容を、当該処理実行部に付随するキャッシュ部に追記する登録部と、当該処理実行部がブロック処理で参照する記憶データの内容として、データベースに格納されている内容よりも当該処理実行部に付随するキャッシュ部に保持されている最新の内容を優先させる選択部とを含む情報処理装置の構成が示されている。
また、上記実施形態には、予めデータベースのデータ項目に対して、更新の権限を与える一の処理実行部が割り当てられている情報処理装置であって、各処理実行部は、記憶データのうち、当該処理実行部に割り当てられているデータ項目の記憶データに対してのみ更新が可能で、かつ当該処理実行部およびパイプラインにおいて当該処理実行部よりも前段に位置する処理実行部に割り当てられているデータ項目の記憶データに対してのみ参照が可能である情報処理装置の構成が示されている。
また、上記実施形態には、所定数以下のブロック処理でのみデータベースから記憶データの内容を読み出すように、かつ所定数以下のブロック処理でのみデータベースに対して記憶データの内容を書き込むように、一連の処理が分割されている情報処理装置の構成が示されている。
また、上記実施形態には、1番目に実行されるブロック処理でのみデータベースから記憶データの内容を読み出すように、かつ最後に実行されるブロック処理でのみデータベースに対して記憶データの内容を書き込むように、一連の処理が分割されている情報処理装置の構成が示されている。
また、上記実施形態には、キャッシュ部が、FIFO型のキューによって実現される情報処理装置の構成が示されている。また、上記実施形態には、複数の処理実行部が、1つ以上のプロセッサによって実現される情報処理装置の構成が示されている。