以下に、本願の開示するアクセス制御プログラム、制御装置およびアクセス制御方法の実施例を図面に基づいて詳細に説明する。なお、実施例によりこの発明が限定されるものではない。
[実施例に係る制御装置の構成]
図1は、実施例に係る制御装置の構成を示すブロック図である。図1に示すように、制御装置1は、制御部2と、HDD(Hard Disk Drive)3と、RAM(Random Access Memory)4とを有する。
制御部2は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。そして、制御部2は、例えば、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの集積回路の電子回路に対応する。または、制御部2は、CPU(Central Processing Unit)やMPU(Micro Processing Unit)などの電子回路に対応する。さらに、制御部2は、アプリケーション21と、ライブラリ22と、OS(Operating System)23とを有する。
アプリケーション21は、バッチ処理によって実行されるプログラムである。ライブラリ22は、アプリケーション21から呼び出される複数のモジュールを含む。モジュールは、例えば、ファイルに関するオープン処理であったり、読み出し処理であったり、書き込み処理であったり、シーク処理であったり、クローズ処理であったりする。オープン処理は、後述するオープン処理部221に対応する。読み出し処理は、後述する読み出し処理部222に対応する。書き込み処理は、後述する書き込み処理部223に対応する。シーク処理は、後述するシーク処理部224に対応する。クローズ処理は、後述するクローズ処理部225に対応する。OS23は、ライブラリ22の各モジュールから呼び出されるファイルの入出力制御機能に関するモジュールを有する。
HDD3には、処理対象ファイル30が記憶される。処理対象ファイル30は、アプリケーション21によって読み書きされる対象である。この処理対象ファイル30は、データベース(DB:DataBase)で用いられるテーブルと異なる一般的なファイルであり、例えばテキストファイルである。なお、処理対象ファイル30は、アクセス領域の一例である。
ここで、一般的なファイル、ここでは処理対象ファイル30からデータを読み出したり、書き込んだりするバッチ処理における問題について説明する。バッチ処理によって実行される複数のアプリケーション21は、同一の処理対象ファイル30からデータを読み出したり、書き込んだりする。このとき、複数のアプリケーション21が、同一の処理対象ファイル30の同じ領域に書き込んだりすることがある。すなわち、アプリケーション21間でデータの競合が発生することがある。
図2は、アプリケーション間でデータの競合が発生する一例を説明する図である。なお、バッチ処理によって実行される2つのアプリケーション21を、バッチアプリケーションAとバッチアプリケーションBとして説明する。図2に示すように、バッチアプリケーションAとバッチアプリケーションBとが並列に処理されていることとする。バッチアプリケーションAとバッチアプリケーションBは、同一の処理対象ファイル30を処理対象としている。処理対象ファイル30には、あらかじめ、支店名毎に、商品番号と実績とが対応付けて記憶されている。バッチアプリケーションAは、支店名が「東京」、商品番号が「A−100」に対応付けられた実績の値に100を加算する処理を処理内容としている。一方、バッチアプリケーションBは、支店名が「東京」、商品番号が「A−100」に対応付けられた実績の値に200を加算する処理を処理内容としている。
このような状況の下、バッチアプリケーションAが、処理対象ファイル30からデータを順に読み出し、支店名が「東京」、商品番号が「A−100」に合致するデータを読み出す。ここでは、バッチアプリケーションAは、支店名が「東京」、商品番号が「A−100」、実績が「5000」のデータを読み出す(a1)。
次に、バッチアプリケーションBが処理対象ファイル30からデータを順に読み出し、支店名が「東京」、商品番号が「A−100」に合致するデータを取り出す。ここでは、バッチアプリケーションBは、支店名が「東京」、商品番号が「A−100」、実績が「5000」のデータを読み出す(a1)。続いて、バッチアプリケーションBが、読み出したデータの実績の値「5000」に「200」を加算し、加算した実績の値「5200」を含むデータを処理対象ファイル30に書き込む。ここでは、処理対象ファイル30の支店名が「東京」、商品番号が「A−100」に対応付けられた実績の値は、「5200」(a2)と記憶される。
次に、バッチアプリケーションAが、読み出したデータの実績の値「5000」に「100」を加算し、加算した実績の値「5100」を含むデータを処理対象ファイル30に書き込む。ここでは、処理対象ファイル30の支店名が「東京」、商品番号が「A−100」に対応付けられた実績の値は、「5100」(a3)と記憶される。すなわち、バッチアプリケーションBによって書き込まれた実績の値「5200」がバッチアプリケーションAによって書き込まれた実績の値「5100」によって更新されてしまう。つまり、バッチアプリケーションAとバッチアプリケーションBとの間で競合が発生してしまう。
そこで、制御装置1は、アプリケーション21間でデータの競合が発生した場合にデータの整合性を保つために、競合した処理をエラーとする。すなわち、制御装置1は、バッチ処理によって実行される複数のアプリケーション21それぞれについて、アプリケーション21から処理対象ファイル30に現にアクセスした際のアクセス位置およびアクセスサイズに対応する領域の情報を蓄積する。そして、制御装置1は、蓄積された領域の情報に基づいて、複数のアプリケーション21のいずれかのアプリケーション21が処理対象ファイル30に現にアクセスした際に、アクセスした領域を対象に排他制御を実行する。排他制御を実行する単位は、所定の長さの固定長のブロック長である。ブロック長は、予め定められた長さであっても良いし、過去に値が更新されたデータのサイズから統計的に割り出された長さであっても良い。このような制御装置1について、以降では、詳細に説明する。
図1に戻って、RAM4には、統計情報40と、排他情報50と、更新後ログ60とが展開される。ここでは、統計情報40、排他情報50および更新後ログ60の展開イメージについて、図3を参照しながら説明する。図3は、実施例に係るアクセス制御処理で用いられる情報の展開イメージを示す図である。
統計情報40は、ファイルのブロック長を定めるために用いられる情報である。統計情報40には、アプリケーション21が処理対象ファイル30を更新した際の、「実際に更新されたサイズ」などの統計情報エントリ41が含まれる。図3に示すように、統計情報エントリ41は、アプリケーション21および処理対象ファイル30毎に生成される。なお、統計情報40の詳細なデータ構造は、後述する。
排他情報50は、ライブラリ22内の各処理部が排他制御を行うために用いられる情報である。排他情報50には、リソース情報51とトランザクション情報52とアクセス情報53と排他キュー54とが含まれる。
リソース情報51は、リソースである処理対象ファイル30毎に、オープンしているアプリケーション21の数、現時点のブロック長、使用されているブロックのブロック情報512などのリソース情報エントリ511が含まれる。リソース情報エントリ511のうちブロック情報512には、リソースである処理対象ファイル30の中のブロック毎に、ブロックをアクセスした遷移が示され、後述する排他キュー54の先頭と最後のアドレスとが記憶される。図3に示すように、ブロック情報512は、ブロック毎に生成される。
トランザクション情報52には、トランザクションエントリ521が含まれる。トランザクションエントリ521には、アプリケーション21毎に、各アプリケーション21がリソースである処理対象ファイル30の中のブロックをアクセスした遷移が示され、後述する排他キュー54の先頭と最後のアドレスとが記憶される。図3に示すように、トランザクションエントリ521は、アプリケーション21毎に生成される。
アクセス情報53は、アプリケーション21がファイルをアクセスする際に用いられる。図3に示すように、アクセス情報53は、アプリケーション21毎に生成される。排他キュー54には、ブロックがアクセスされた際の排他モード、アプリケーション21の処理方向で前後に獲得された他の排他キュー54のアドレス、ブロックのアクセス方向で前後に獲得された他の排他キュー54のアドレスが記憶される。ここでいう排他モードとは、ブロックを占有することを示す占有モード(EX)とブロックを占有しないことを示す共有モード(SH)とが存在する。一例として、更新対象のブロックの場合、占有モードが記憶され、参照対象のブロックの場合、共有モードが記憶される。図3に示すように、排他キュー54は、アプリケーション21がブロックにアクセスする毎に生成される。なお、排他情報50の詳細なデータ構造は、後述する。
更新後ログ60には、実際に更新されるデータがブロック単位で記憶される。更新後ログ60に記憶されたデータは、処理対象ファイル30へのアクセス終了時に一括して処理対象ファイル30に書き込まれる。これは、処理対象ファイル30を並行してアクセスしている全てのアプリケーション21について、同じブロックに対して更新処理が行われないことを確認してから当該ブロックにデータを書き込むためである。図3に示すように、排他キュー54が更新対象のブロックに対応する場合、更新されるデータを記憶する更新後ログ60のアドレスは、当該排他キュー54に記憶される。
このような統計情報40および排他情報50を用いて、制御装置1は、バッチ処理によって実行されるアプリケーション21からアクセスされる処理対象ファイル30のアクセス制御処理を実行する。図4は、実施例に係るアクセス制御処理の概略を説明する図である。なお、バッチ処理によって実行される2つのアプリケーション21を、アプリケーションAとアプリケーションBとして説明する。図4に示すように、アプリケーションAとアプリケーションBとが並列に処理されている。アプリケーションAとアプリケーションBは、共に同一の処理対象ファイル30としてファイルaを処理対象とする。
アクセス制御処理は、アプリケーション21によって処理されるオープン時に、統計情報40に記憶された「実際に更新されたデータのサイズ」を元にファイルaをブロック単位に分割する。ここでは、統計情報40に記憶された「実際に更新されたデータのサイズ」が32バイトであるとすると、アクセス制御処理は、32バイトをブロック長として、ファイルaを分割する。
そして、アクセス制御処理は、アプリケーションAについて、ファイルaにアクセスした際のアクセス位置およびアクセスサイズに対応する領域の情報を蓄積する。例えば、アクセス制御処理は、アプリケーションAからファイルaに対して96バイトの読み出し要求があると、実際に読み出した領域、読み出した領域であるブロックのアクセス情報を排他情報50に蓄積する。ここでは、アクセス制御処理は、ブロック1,2,3に対応する排他キュー54をアプリケーションAの処理方向でつなげる。排他キュー54には、排他モードとして共有モード「SH」が記憶される。そして、アクセス制御処理は、アプリケーションAからファイルaに対して96バイトのデータの書き込み要求があると、書き込み対象の領域であるブロックのアクセス情報を排他情報50に蓄積する。ここでは、アクセス制御処理は、書き込み要求のデータのうちブロック3に対応する部分だけが実際に更新されるとすると、ブロック3に対応する排他キュー54をアプリケーションAの処理方向でつなげる。排他キュー54には、排他モードとして排他モード「EX」が記憶される。なお、実際に更新される部分は、ブロック単位で更新後ログ60に書き込まれる。
そして、アクセス制御処理は、アプリケーションBについて、ファイルaにアクセスした際のアクセス位置およびアクセスサイズに対応する領域の情報を蓄積する。例えば、アクセス制御処理は、アプリケーションBからファイルaに対して64バイトの読み出し要求があると、実際に読み出した領域、読み出した領域であるブロックのアクセス情報を排他情報50に蓄積する。ここでは、アクセス制御処理は、ブロック1,2に対応する排他キュー54をアプリケーションBの処理方向でつなげる。排他キュー54には、排他モードとして共有モード「SH」が記憶される。さらに、アクセス制御処理は、同じブロック同士について、ブロックのアクセス方向で排他キュー54をつなげる。ここでは、アクセス制御処理は、ブロック1に対応するアプリケーションAの排他キュー54の次にアプリケーションBの排他キュー54をつなげる。
そして、アクセス制御処理は、排他情報50に基づいて、実際に更新される部分を含むブロックを対象に排他制御を実行する。ここでは、アクセス制御処理は、実際に更新される部分を含むブロック3を対象に排他制御を実行する。仮に、アプリケーションBがその後の処理で、ブロック3に対応するデータの書き込み要求があると、このブロック3を排他対象とし、このブロック3への処理をエラーとする。
図1に戻って、ライブラリ22は、オープン処理部221、読み出し処理部222、書き込み処理部223、シーク処理部224およびクローズ処理部225を有する。ライブラリ22の各処理部は、アプリケーション21によって呼び出される。なお、読み出し処理部222および書き込み処理部223は、蓄積部の一例である。また、書き込み処理部223は、実行部の一例である。
オープン処理部221は、アプリケーション21によって指定された処理対象ファイル30をオープンする。
例えば、オープン処理部221は、指定された処理対象ファイル30のファイル名が、リソース情報51に存在しているか否かを判定する。そして、オープン処理部221は、処理対象ファイル30のファイル名がリソース情報51に存在していないと判定した場合、処理対象ファイル30に対応する新たなリソース情報エントリ511をリソース情報51に登録する。加えて、オープン処理部221は、アプリケーション21且つ処理対象ファイル30に対応する統計情報エントリ41にデフォルトを設定する。一方、オープン処理部221は、処理対象ファイル30のファイル名がリソース情報51に存在していると判定した場合、他のアプリケーション21がオープン中であれば、オープン中のアプリケーション21と同じブロック長を、使用するブロック長とする。そして、オープン処理部221は、オープン中でなければ、統計情報40の処理対象ファイル30に対応するブロック長を取り出し、取り出したブロック長を使用するブロック長とする。そして、オープン処理部221は、アプリケーション21に対応するトランザクションエントリ521を獲得して、処理対象ファイル30をオープンする。
ここで、統計情報のデータ構造の一例を、図5A〜図5Cを参照して説明する。図5Aは、統計情報のデータ構造を示す図である。図5Bは、統計情報内の統計情報エントリのデータ構造を示す図である。図5Cは、統計情報エントリの具体例を示す図である。
図5Aに示すように、統計情報40は、エントリ数40aと統計情報エントリ41とを記憶する。エントリ数40aは、統計情報エントリ41の数を示す。統計情報エントリ41は、実際の統計情報の管理テーブルを示す。統計情報エントリ41は、処理対象ファイル30のファイル名およびアプリケーション名毎に存在する。
図5Bに示すように、統計情報エントリ41は、総量41c、回数41d、最大値41e、最小値41f、平均値41g、チューニング種別41hおよびチューニングブロック長41iをファイル名41aおよびアプリケーション名41bに対応付けて記憶する。ファイル名41aは、処理対象ファイル30のファイル名を示す。すなわち、ファイル名41aは、バッチ処理を実行するアプリケーション21からアクセスする処理対象ファイル30のファイル名である。アプリケーション名41bは、バッチ処理を実行するアプリケーション21のファイル名である。
総量41cは、アプリケーション名41bで示されるアプリケーション21がファイル名41aで示される処理対象ファイル30に対して過去に更新した総サイズを示す。回数41dは、アプリケーション名41bで示されるアプリケーション21がファイル名41aで示される処理対象ファイル30に対して過去に更新した回数を示す。最大値41eは、アプリケーション名41bで示されるアプリケーション21がファイル名41aで示される処理対象ファイル30に対して過去に更新した際の最大サイズを示す。最小値41fは、アプリケーション名41bで示されるアプリケーション21がファイル名41aで示される処理対象ファイル30に対して過去に更新した際の最小サイズを示す。平均値41gは、アプリケーション名41bで示されるアプリケーション21がファイル名41aで示される処理対象ファイル30に対して過去に更新した際の平均サイズを示す。すなわち、最大値41e、最小値41fおよび平均値41gは、「実際に更新されたデータのサイズ」に対応する。
チューニング種別41hは、ブロック長のチューニング種別を示す。すなわち、チューニング種別41hは、オープン処理部221がブロック長を決定する際に用いられるチューニング種別である。チューニング種別41hには、例えば、最大値41eをブロック長とする場合「MAX」、最小値41fをブロック長とする場合「MIN」、平均値41gをブロック長とする場合「AVE」が設定される。チューニング種別41hには、後述するチューニングブロック長41iをブロック長とする場合「DEF」が設定される。なお、チューニング種別41hが省略されている場合には、例えば「AVE」が設定される。チューニングブロック長41iは、あらかじめ設定されたブロック長を示す。なお、チューニング種別41hおよびチューニングブロック長41iは、例えばユーザによって指定される。
図5Cに示すように、一例として、ファイル名41aが「日次売り上げ」である場合、アプリケーション名41bとして「アプリ(東京)」、総量41cとして「6400byte」、回数41dとして「100」と記憶している。最大値41eとして「128byte」、最小値41fとして「8byte」、平均値41gとして「64byte」、チューニング種別41hとして「AVE」、チューニングブロック長41iとして「」と記憶している。
図1に戻って、読み出し処理部222は、アプリケーション21によって指定された処理対象ファイル30のアクセス位置およびアクセスサイズより、対応するブロックのデータを読み出す。例えば、読み出し処理部222は、アプリケーション21によって指定された処理対象ファイル30のアクセス位置およびアクセスサイズより、アクセス対象となるブロックを算出する。そして、読み出し処理部222は、排他情報50内に、算出した各ブロックの共有モード(SH)の排他キュー54をつなげる。具体的に、読み出し処理部222は、算出したブロックに対応する排他キュー54を、アプリケーション21に対応するトランザクションエントリ521から接続される方向、つまりアプリケーション21の処理方向でつなげる。また、読み出し処理部222は、算出したブロックに対応する排他キュー54を、リソース情報51内のブロック情報512から接続される方向、つまりブロックのアクセス方向でつなげる。そして、読み出し処理部222は、算出した各ブロックのデータを読み出し、アクセス位置を更新する。
ここで、排他情報50のデータ構造の一例を、図6〜図9を参照して説明する。図6A〜図6Cは、排他情報内のリソース情報のデータ構造を示し、図7A〜図7Bは、排他情報内のトランザクション情報のデータ構造を示す。図8は、排他情報内のアクセス情報のデータ構造を示し、図9は、排他情報内の排他キューのデータ構造を示す。
図6Aは、排他情報内のリソース情報のデータ構造を示す図である。図6Aに示すように、リソース情報51は、エントリ数51aとリソース情報エントリ511とを記憶する。エントリ数51aは、リソース情報エントリ511の数を示す。リソース情報エントリ511は、実際のリソース情報の管理テーブルを示す。リソース情報エントリ511は、処理対象ファイル30のファイル名毎に存在する。
図6Bは、リソース情報内のリソース情報エントリのデータ構造を示す図である。図6Bに示すように、リソース情報エントリ511は、オープン数511b、ブロック長511c、ブロック数511dおよびブロック情報512をファイル名511aに対応付けて記憶する。ファイル名511aは、当リソース情報エントリ511が管理する処理対象ファイル30のファイル名を示す。オープン数511bは、ファイル名511aが示す処理対象ファイル30をオープンしているアプリケーション21の数を示す。ブロック長511cは、現時点のブロック長を示す。ブロック長511cには、オープン処理部221によって統計情報40から取り出されたブロック長がオープン時に格納される。ブロック数511dは、ブロック情報512の総数を示す。ブロック情報512は、ファイル名511aが示す処理対象ファイル30のリソースであるブロックの情報である。ブロック情報512は、ブロック毎に存在する。
図6Cは、リソース情報エントリ内のブロック情報のデータ構造を示す図である。図6Cに示すように、ブロック情報512は、ブロック番号512a、先頭排他キューアドレス512bおよび最終排他キューアドレス512cを対応付けて記憶する。ブロック番号512aは、当ブロック情報512が管理するブロックの番号を示す。先頭排他キューアドレス512bは、ブロック番号512aが示すブロックに関する排他キューのうち先頭の排他キューのアドレスを示す。最終排他キューアドレス512cは、ブロック番号512aが示すブロックに関する排他キューのうち最終の排他キューのアドレスを示す。すなわち、ブロック情報512は、ブロック番号512aが示すブロックに対するアクセス方向を管理する。
図7Aは、排他情報内のトランザクション情報のデータ構造を示す図である。図7Aに示すように、トランザクション情報52は、エントリ数52aとトランザクションエントリ521とを記憶する。エントリ数52aは、トランザクションエントリ521の数を示す。トランザクションエントリ521は、実際のトランザクションの管理テーブルを示す。トランザクションエントリ521は、アプリケーション21毎に存在する。
図7Bは、トランザクション情報内のトランザクションエントリのデータ構造を示す図である。図7Bに示すように、トランザクションエントリ521は、トランザクションID(identification)521a、先頭アクセス情報アドレス521b、先頭排他キューアドレス521cおよび最終排他キューアドレス521dを対応付けて記憶する。トランザクションID521aは、当トランザクションエントリ521が管理するトランザクションのIDを示す。先頭アクセス情報アドレス521bは、当トランザクションエントリ521が管理するトランザクションでアクセスしているファイルのアクセス情報53のうち先頭のアクセス情報53のアドレスを示す。先頭排他キューアドレス521cは、トランザクションID521aが示すトランザクションに関する排他キューのうち先頭の排他キューのアドレスを示す。最終排他キューアドレス521dは、トランザクションID521aが示すトランザクションに関する排他キューのうち最終の排他キューのアドレスを示す。すなわち、トランザクションエントリ521は、トランザクションID521aが示すトランザクションで処理されるアプリケーション21の処理方向を管理する。
図8は、排他情報内のアクセス情報のデータ構造を示す図である。図8に示すように、アクセス情報53は、ファイル名53a、アクセス位置53b、ファイルポインタ53cおよび次アドレス53dを対応付けて記憶する。ファイル名53aは、当アクセス情報が管理する処理対象ファイル30のファイル名を示す。すなわち、ファイル名53aは、トランザクションID521aが示すトランザクションでアクセスしている処理対象ファイル30のファイル名である。アクセス位置53bは、ファイル名53aで示される処理対象ファイル30の最新のアクセス位置を示す。すなわち、アクセス位置53bは、ファイルの先頭からのオフセットで表される。ファイルポインタ53cは、ファイル名53aが示すファイルのファイルポインタを示す。次アドレス53dは、次のアクセス情報のアドレスを示す。すなわち、次アドレス53dには、同じトランザクションでさらに異なるファイルがアクセスされる場合には、次のアクセス情報が設定される。
図9は、排他情報内の排他キューのデータ構造を示す図である。図9に示すように、排他キュー54は、排他モード54b、前トランザクションアドレス54c、次トランザクションアドレス54d、前ブロックアドレス54eおよび次ブロックアドレス54fをブロック情報アドレス54aに対応付けて記憶する。また、排他キュー54は、待ち状態54g、ステータス54hおよび更新後ログ域54iをブロック情報アドレス54aに対応付けて記憶する。
排他キュー54は、処理対象ファイル30のブロックへのアクセス毎に生成される。ブロック情報アドレス54aは、当排他キュー54が管理するブロック情報512のアドレスを示す。排他モード54bは、当排他キュー54の排他モードを示す。一例として、ブロックを占有することを示す占有モードとして「EX」が設定され、ブロックを占有しないことを示す共有モードとして「SH」が設定される。
前トランザクションアドレス54cは、当排他キュー54で管理するブロック情報512に関し、前に獲得している他のトランザクションの排他キューのアドレスを示す。例えば、前トランザクションアドレス54cには、先頭の場合、NULLが設定され、先頭でない場合、当トランザクションの前で獲得した他のトランザクションの排他キューのアドレスが設定される。次トランザクションアドレス54dは、当排他キュー54で管理するブロック情報512に関し、次に獲得したトランザクションの排他キューのアドレスを示す。例えば、次トランザクションアドレス54dには、最後の場合、NULLが設定され、最後でない場合、当トランザクションの次に獲得した他のトランザクションの排他キューのアドレスが設定される。すなわち、ライブラリ22は、前トランザクションアドレス54c、次トランザクションアドレス54dおよびブロック情報512を用いることで、ブロック情報512内のブロック番号512aが示すブロックに対するアクセスの遷移を辿ることができる。
前ブロックアドレス54eは、当排他キュー54で管理するトランザクションに関し、前に獲得したブロック情報512の排他キューのアドレスを示す。例えば、前ブロックアドレス54eには、先頭の場合、NULLが設定され、先頭でない場合、当トランザクションで当ブロックの前に獲得したブロックの排他キューのアドレスが設定される。次ブロックアドレス54fは、当排他キュー54で管理するトランザクションに関し、次に獲得したブロック情報512の排他キューのアドレスを示す。例えば、次ブロックアドレス54fには、最後の場合、NULLが設定され、最後でない場合、当トランザクションで当ブロックの次に獲得したブロックの排他キューのアドレスが設定される。すなわち、ライブラリ22は、前ブロックアドレス54e、次ブロックアドレス54fおよびトランザクションエントリ521を用いることで、トランザクションエントリ521のトランザクションで処理されるアプリケーション21の処理の遷移を辿ることができる。
待ち状態54gは、当排他キュー54で管理するブロックの競合解消待ちの有無を示す。例えば、待ち状態54gには、待ち状態にない場合はNULLが設定され、待ち状態にある場合はNULL以外が設定される。ステータス54hは、当排他キュー54で管理するブロックの競合解消待ちに対する結果通知域を示す。例えば、ステータス54hには、正常である場合正常であることを示す「NORMAL」が設定され、異常である場合異常であることを示す「ERROR」が設定される。更新後ログ域54iは、当排他キュー54で管理するブロックに書き込まれるデータを指す更新後ログ60のアドレスを示す。例えば、後述する書き込み処理部223は、当排他キュー54で管理するブロックに対し更新処理が行われた場合に、トランザクションのコミット時に処理対象ファイル30に書き込まれるデータを記憶した更新後ログ60のアドレスを設定する。
図1に戻って、書き込み処理部223は、アプリケーション21によって指定された処理対象ファイル30のアクセス位置およびアクセスサイズより、対応するブロックへのデータの書き込み処理を行う。例えば、書き込み処理部223は、書き込みサイズより、書き込み対象となるブロックを算出する。そして、書き込み処理部223は、算出した全ブロックのデータを読み込み、読み込んだデータと書き込み依頼されているデータとを比較し、ブロック毎に変更の有無を判定する。
変更が無いブロックについて、書き込み処理部223は、参照対象であると判断し、排他情報50内に、算出した各ブロックの共有モード(SH)の排他キュー54をつなげる。一例として、書き込み処理部223は、該当ブロックに対応する排他キュー54を、アプリケーション21に対応するトランザクションエントリ521から接続される方向、つまりアプリケーション21の処理方向でつなげる。また、読み出し処理部222は、該当ブロックに対応する排他キュー54を、リソース情報51内のブロック情報512から接続される方向、つまりブロックのアクセス方向でつなげる。
変更が有るブロックについて、書き込み処理部223は、更新対象、すなわち排他対象であると判断し、排他情報50内に、算出した各ブロックの占有モード(EX)の排他キュー54をつなげる。一例として、書き込み処理部223は、該当ブロックに対応する排他キュー54を、アプリケーション21に対応するトランザクションエントリ521から接続される方向、つまりアプリケーション21の処理方向でつなげる。また、読み出し処理部222は、該当ブロックに対応する排他キュー54を、リソース情報51内のブロック情報512から接続される方向、つまりブロックのアクセス方向でつなげる。そして、書き込み処理部223は、変更が有るブロックに対応する更新後のデータを更新後ログ60に一時的に書き込む。
そして、書き込み処理部223は、排他情報50を参照し、排他対象のブロックについて、他に占有モード(EX)の排他キュー54が存在しているか否かを判定する。一例として、書き込み処理部223は、リソース情報51内の排他対象のブロックに対応するブロック情報512から排他キュー54を辿り、他の排他キュー54のうち占有モード(EX)の排他キュー54が存在しているか否かを判定する。そして、書き込み処理部223は、他に占有モード(EX)の排他キュー54が存在している場合、排他エラーとする。これにより、複数のアプリケーション21は、並行に動作していても、同じアクセス対象の処理対象ファイル30に対して相互に影響を及ぼすことなくアクセスすることができる。
そして、書き込み処理部223は、他に占有モード(EX)の排他キュー54が存在している場合、当該排他キュー54が待ち状態にあれば、排他エラーを通知すべく、当該排他キュー54に対して異常であることを設定する。一例として、書き込み処理部223は、当該排他キュー54の待ち状態54gがNULL以外であれば、待ち状態であると判断し、ステータス54hを異常でスケジュールする。なお、待ち状態にある場合とは、後述するクローズ処理部225によって排他情報50がメモリロックされる場合である。
そして、書き込み処理部223は、他に占有モード(EX)の排他キュー54が存在していない場合、統計情報40の該当する統計情報エントリ41を更新する。
ここで、排他対象のブロックについて、図10を参照して説明する。図10は、排他対象のブロックについて説明する図である。図10では、処理対象ファイル30のブロックが5バイトであるとする。また、アプリケーション21によって指定された書き込みサイズは、28バイトであるとする。
図10上図に示すように、書き込み対象領域の更新前のデータが表されている。ここでは、書き込み対象となるブロックは、1〜6ブロックである。
図10下図に示すように、書き込み依頼されているデータが実際に更新された場合の更新後のデータが表されている。書き込み処理部223は、書き込み対象となる全ブロックのデータを読み込み、読み込んだデータと書き込み依頼されているデータとを比較し、ブロック毎に変更の有無を判定する。ここでは、変更が有るのは、ブロック2とブロック5である。ブロック2では、更新前のデータが「“, 10」であるのに対し、更新後のデータが「“,105」であるので、変更が有ると判定される。ブロック5では、更新前のデータが「“,250」であるのに対し、更新後のデータが「“,100」であるので、変更が有ると判定される。すなわち、ブロック2,5は、排他対象のブロックと判断される。
図1に戻って、シーク処理部224は、指定された位置にアクセス位置を変更し、処理対象ファイル30のオフセットを変更する。
クローズ処理部225は、処理対象ファイル30のクローズ処理として、排他情報50を用いて、他のアプリケーション21とデータの競合が発生しているか否かを判定する。なお、クローズ処理部225は、クローズ処理の間、他のアプリケーション21の処理と同時に動作しないように、排他情報50をメモリロックする。これは、クローズ処理の間、他のアプリケーション21の処理が同時に動作していると、動作に伴い排他情報50が追加されるからである。すなわち、クローズ処理部225は、排他情報50が追加されなくなるまで、排他情報50を用いたデータの競合の判定を待たされることになるからである。
例えば、クローズ処理部225は、自身のアプリケーション21におけるトランザクションエントリ521から接続される方向に排他キュー54を検索する。そして、クローズ処理部225は、排他モードが占有モード(EX)である排他キュー54があれば、さらに、当該排他キュー54の前に排他モードが共有モード(SH)である他のアプリケーション21の排他キュー54を検索する。この検索は、排他キュー54が管理するブロックに対応するブロック情報512から接続される方向に辿る。そして、クローズ処理部225は、前に排他モードが共有モード(SH)である他のアプリケーション21の排他キュー54があれば、他のアプリケーション21のトランザクションが終了するのを待つ。そして、クローズ処理部225は、他のアプリケーション21からの書き込み処理部223によってステータス54hを異常でスケジュールされた場合、データの競合が発生したと判断し、エラーで復帰する。一方、クローズ処理部225は、排他モードが共有モード(SH)である排他キュー54があれば、さらに、当該排他キュー54の後ろに排他モードが占有モード(EX)である他のアプリケーション21の排他キュー54を検索する。そして、そして、クローズ処理部225は、後ろに排他モードが占有モード(EX)である他のアプリケーション21の排他キュー54があれば、その排他キュー54のステータス54hを正常でスケジュールする。
また、クローズ処理部225は、処理対象ファイル30のクローズ処理として、排他キュー54の検索後に、処理対象ファイル30への更新処理を行う。例えば、クローズ処理部225は、自身のアプリケーション21におけるトランザクションエントリ521から接続される方向に、排他モードが占有モード(EX)である排他キュー54を検索する。そして、クローズ処理部225は、排他モードが占有モード(EX)である排他キュー54について、更新後ログ域54iが指す更新後ログ60のデータを処理対象ファイル30に書き込む。
また、クローズ処理部225は、処理対象ファイル30のクローズ処理として、処理対象ファイル30をクローズする。
次に、実施例に係るアクセス制御処理の排他制御について、図11を参照して説明する。図11は、実施例に係るアクセス制御処理の排他制御を説明する図である。図11では、アプリケーションAおよびアプリケーションBが並行して処理対象ファイル30を用いたバッチ処理を実行している。リソース情報51には、処理対象ファイル30に対応するブロック情報512がブロック1〜12毎に記憶されている。トランザクション情報52には、アプリケーションに対応するトランザクションエントリ521がアプリケーションA,B毎に記憶されている。図11に示すように、アプリケーションAでは、処理対象ファイル30について、ブロック1〜4に関する、読み出しサイズのデータを読み出し、ブロック1〜4に関する、書き込み依頼されているデータを書き込む処理をする。この際、実際に更新されるのは、ブロック2〜3であるとする。また、アプリケーションBでは、処理対象ファイル30について、ブロック1〜4に関する、読み出しサイズのデータを読み出し、ブロック1〜4に関する、書き込み依頼されているデータを書き込む処理をする。この際、実際に更新されるのは、ブロック3〜4であるとする。すると、アプリケーションAとアプリケーションBとは、ブロック3が競合する。
このような状況の下、例えば、アプリケーションAから書き込み処理部223が呼び出されると、書き込み処理部223は、ブロック3を更新対象、すなわち排他対象であると判断する。そして、書き込み処理部223は、リソース情報51内の排他対象のブロック3に対応するブロック情報512から排他キュー54を辿り、他の排他キュー54のうち占有モード(EX)の排他キュー54が存在しているか否かを判定する。ここでは、書き込み処理部223は、アプリケーションBに占有モード(EX)の排他キュー54が存在していると判定する。そこで、書き込み処理部223は、ブロック3が占有モード(EX)で排他されているので、競合が発生したと判断し、排他エラーとする。これにより、アプリケーションA,Bは、並行に動作していても、同じアクセス対象の処理対象ファイル30に対して相互に影響を及ぼすことなく書き込む処理をすることができる。
[オープン処理の手順]
次に、図12を参照して、オープン処理の手順を説明する。図12は、実施例に係るオープン処理の手順を示すフローチャートである。なお、図12では、アプリケーション21からオープンする処理対象ファイル30のファイル名が指定されたとする。
オープン処理部221は、アプリケーション21から指定されたファイルのリソース情報51があるか否かを判定する(ステップS11)。例えば、オープン処理部221は、リソース情報51を参照して、アプリケーション21から指定されたファイルのファイル名に対応するリソース情報エントリ511があるか否かを判定する。
ファイルのリソース情報51があると判定した場合(ステップS11;Yes)、オープン処理部221は、ステップS14に移行する。一方、ファイルのリソース情報51がないと判定した場合(ステップS11;No)、オープン処理部221は、リソース情報51内に新たなリソース情報エントリ511を登録する(ステップS12)。そして、オープン処理部221は、統計情報40内に、アプリケーション21および指定されたファイルに対応する新たな統計情報エントリ41を登録し、デフォルトを設定する(ステップS13)。そして、オープン処理部221は、ステップS14に移行する。
ステップS14では、オープン処理部221は、統計情報40からブロック長を取り出す(ステップS14)。例えば、オープン処理部221は、統計情報40から、アプリケーション21および指定されたファイルに対応するブロック長を、チューニング種別41hに応じて取り出す。一例として、オープン処理部221は、チューニング種別41hが「AVE」であれば、平均値41gに設定された値をブロック長として取り出す。
続いて、オープン処理部221は、指定されたファイルをオープン中の他のアプリケーション21が存在するか否かを判定する(ステップS15)。例えば、オープン処理部221は、指定されたファイルに対応するリソース情報エントリ511を参照して、オープン数511bの値が0より大きいか否かを判定する。
指定されたファイルをオープン中の他のアプリケーション21が存在すると判定した場合(ステップS15;Yes)、オープン処理部221は、オープン中のアプリケーション21と同じブロック長を使用させる(ステップS16)。すなわち、オープン処理部221は、指定されたファイルに対応するリソース情報エントリ511を参照して、ブロック長511cの値をブロック長として取り出す。そして、オープン処理部221は、ステップS18に移行する。
一方、指定されたファイルをオープン中の他のアプリケーション21が存在しないと判定した場合(ステップS15;No)、オープン処理部221は、統計情報40から取り出したブロック長をそのまま使用させる(ステップS17)。そして、オープン処理部221は、ステップS18に移行する。
そして、オープン処理部221は、アクセスを開始するアクセス開始位置を初期化する(ステップS18)。そして、オープン処理部221は、トランザクション情報52からアプリケーション21に対応するトランザクションエントリ521を獲得する(ステップS19)。このとき、オープン処理部221は、アプリケーション21からアクセスするファイルに対応するアクセス情報53を獲得し、獲得したアクセス情報53内のアクセス位置53bにアクセス開始位置を設定する。そして、オープン処理部221は、指定されたファイルのオープン処理を実行する(ステップS20)。
[読み出し処理の手順]
次に、図13を参照して、読み出し処理の手順を説明する。図13は、実施例に係る読み出し処理の手順を示すフローチャートである。なお、図13では、アプリケーション21から処理対象ファイル30のファイル名、アクセス位置およびアクセスサイズが指定されたとする。
読み出し処理部222は、アプリケーション21から指定されたアクセス位置、アクセスサイズより、アクセス対象となるブロックのブロック番号を算出する(ステップS21)。
そして、読み出し処理部222は、算出した全てのブロック番号に対する全ブロックの排他情報50を設定する(ステップS22)。すなわち、読み出し処理部222は、リソースに関するキューに共有モード(SH)の排他キュー54をつなぐ。例えば、読み出し処理部222は、算出した全ブロックに対応する共有モード(SH)の排他キュー54を、アプリケーション21に対応するトランザクションエントリ521から接続される方向でつなげる。一例として、読み出し処理部222は、アプリケーション21に対応するトランザクションエントリ521の先頭排他キューアドレス521cおよび最終排他キューアドレス521dを設定するとともに、排他キュー54の前ブロックアドレス54eおよび次ブロックアドレス54fを設定する。また、読み出し処理部222は、算出した全ブロックに対応する共有モード(SH)の排他キュー54を、各ブロックについてリソース情報51内のブロック情報512から接続される方向でつなげる。一例として、読み出し処理部222は、ブロックに対応する先頭排他キューアドレス512bおよび最終排他キューアドレス512cを設定するとともに、排他キュー54の前トランザクションアドレス54cおよび次トランザクションアドレス54dを設定する。
そして、読み出し処理部222は、算出したブロック番号のブロックのデータを、指定されたファイルから読み出す(ステップS23)。そして、読み出し処理部222は、アクセス位置を更新し、該当するアクセス情報53のアクセス位置53bに設定する(ステップS24)。
[書き込み処理の手順]
次に、図14Aおよび図14Bを参照して、書き込み処理の手順を説明する。図14Aおよび図14Bは、実施例に係る書き込み処理の手順を示すフローチャートである。なお、図14Aでは、アプリケーション21から処理対象ファイル30のファイル名、アクセス位置、アクセスサイズおよび書き込み依頼データが指定されたとする。
書き込み処理部223は、アプリケーション21から指定されたアクセス位置、アクセスサイズより、アクセス対象となるブロックのブロック番号を算出する(ステップS31)。そして、書き込み処理部223は、算出した全ブロック番号に対する全ブロックのデータを読み出し、書き込み依頼データとの比較処理を実行する(ステップS32)。なお、比較処理は、図14Bで説明する。
続いて、書き込み処理部223は、比較処理の結果、変更があるか否かを判定する(ステップS32A)。変更がないと判定した場合(ステップS32A;No)、書き込み処理部223は、算出した全てのブロック番号に対する全ブロックの排他情報50を設定する(ステップS33)。すなわち、書き込み処理部223は、リソースに関するキューに共有モード(SH)の排他キュー54をつなぐ。例えば、書き込み処理部223は、算出した全ブロックに対応する共有モード(SH)の排他キュー54を、アプリケーション21に対応するトランザクションエントリ521から接続される方向でつなげる。また、書き込み処理部223は、算出した全ブロックに対応する共有モード(SH)の排他キュー54を、各ブロックについてリソース情報51内のブロック情報512から接続される方向でつなげる。そして、書き込み処理部223は、ステップS40に移行する。
一方、変更があると判定した場合(ステップS32A;Yes)、書き込み処理部223は、リソースに関するキューに占有モード(EX)の排他キュー54をつなぐ。例えば、書き込み処理部223は、変更があったブロックに対応する占有モード(EX)の排他キュー54を、変更があったブロックについてリソース情報51内のブロック情報512から接続される方向でつなげる。そして、書き込み処理部223は、変更があったブロックに対応する更新後のデータを更新後ログ60に書き込む(ステップS34)。このとき、書き込み処理部223は、排他キュー54の更新後ログ域54iに、更新後ログ60に書き込まれた更新後のデータの先頭アドレスを設定する。
そして、書き込み処理部223は、変更があったブロックと同じブロックに対応する他の排他キュー54が存在するか否かを判定する(ステップS35)。例えば、書き込み処理部223は、リソース情報51内の該当ブロックに対応するブロック情報512から排他キュー54を辿り、他の排他キュー54が存在するか否かを判定する。
変更があったブロックと同じブロックに対応する他の排他キュー54が存在しないと判定した場合(ステップS35;No)、書き込み処理部223は、ステップS38に移行する。一方、変更があったブロックと同じブロックに対応する他の排他キュー54が存在すると判定した場合(ステップS35;Yes)、書き込み処理部223は、当該排他キュー54が占有モード(EX)であるか否かを判定する(ステップS36)。当該排他キュー54が占有モード(EX)でないと判定した場合(ステップS36;No)、書き込み処理部223は、ステップS38に移行する。
一方、当該排他キュー54が占有モード(EX)であると判定した場合(ステップS36;Yes)、書き込み処理部223は、同じブロックについてデータが競合すると判断し、排他エラーとする。その際、書き込み処理部223は、自分の排他キュー54の後ろにつながっている他のトランザクションの排他キュー54を検索する。そして、書き込み処理部223は、待ち状態54gにNULL以外が設定されていれば、同じブロックについてデータが競合しているので、ステータス54hを「異常」と設定してスケジュールする(ステップS37)。そして、書き込み処理部223は、書き込み処理をエラーとして終了する。
ステップS38では、書き込み処理部223は、変更があったブロックに対応する占有モード(EX)の排他キュー54を、アプリケーション21に対応するトランザクションエントリ521から接続される方向でそのままつなぐ(ステップS38)。そして、書き込み処理部223は、RAM4の作業用メモリ上の統計情報を更新する(ステップS39)。例えば、書き込み処理部223は、指定されたファイルへのアクセスについて、変更があったブロックの「実際に更新されたサイズ」の総量、これまでに更新した回数、更新した際の最大サイズおよび最小サイズを、作業用メモリに統計情報として一時的に記憶する。そして、書き込み処理部223は、ステップS40に移行する。
ステップS40では、書き込み処理部223は、アクセス位置を更新し、該当するアクセス情報53のアクセス位置53bに設定する(ステップS40)。
次に、比較処理について説明する。書き込み処理部223は、全ブロックの比較処理を実施したか否かを判定する(ステップS41)。一方、全ブロックの比較処理を実施していないと判定した場合(ステップS41;No)、書き込み処理部223は、実施していないブロックを選択する(ステップS41A)。
そして、書き込み処理部223は、選択したブロックについて、読み出しデータおよび書き込み依頼データの比較元/比較先を位置づける(ステップS42)。そして、書き込み処理部223は、選択したブロック内の全データを比較したか否かを判定する(ステップS43)。選択したブロック内の全データを比較したと判定した場合(ステップS43;Yes)、書き込み処理部223は、次のブロックを選択すべく、ステップS41に移行する。
一方、選択したブロック内の全データを比較していないと判定した場合(ステップS43;No)、書き込み処理部223は、比較元のデータと比較先のデータとを比較する(ステップS44)。書き込み処理部223は、比較元のデータと比較先のデータとが一致しているか否かを判定する(ステップS45)。
一致していると判定した場合(ステップS45:Yes)、書き込み処理部223は、ステップS47に移行する。一方、一致していないと判定した場合(ステップS45;No)、書き込み処理部223は、一致していないデータについて「実際に更新されたサイズ」を加算する(ステップS46)。そして、書き込み処理部223は、ステップS47に移行する。
ステップS47では、書き込み処理部223は、比較元のデータと比較先のデータとの位置を更新する(ステップS47)。そして、書き込み処理部223は、更新した位置でのデータの比較をすべく、ステップS43に遷移する。
そして、ステップS41では、書き込み処理部223は、全ブロックの比較処理を実施したと判定した場合(ステップS41;Yes)、判定処理を終了する。
[シーク処理の手順]
次に、図15を参照して、シーク処理の手順を説明する。図15は、実施例に係るシーク処理の手順を示すフローチャートである。なお、図15では、アプリケーション21から処理対象ファイル30のアクセス位置が指定されたとする。
シーク処理部224は、指定されたアクセス位置を更新し、該当するアクセス情報53のアクセス位置53bに設定する(ステップS51)。そして、シーク処理部224は、指定されたアクセス位置に応じて、ファイルのオフセットを変更する(ステップS52)。
[クローズ処理の手順]
次に、図16を参照して、クローズ処理の手順を説明する。図16は、実施例に係るクローズ処理の手順を示すフローチャートである。なお、図16では、アプリケーション21から処理対象ファイル30のクローズ処理命令が発行されたとする。
まず、クローズ処理部225は、リソース情報51および排他キュー54の全体にメモリロックを獲得する(ステップS61)。クローズ処理命令が発行されたアプリケーション21からのクローズ処理が終了するまで、他のアプリケーション21の処理が同時に動作しないようにするためである。
そして、クローズ処理部225は、次の排他キュー54は存在するか否かを判定する(ステップS62)。例えば、クローズ処理部225は、自身のアプリケーション21におけるトランザクションエントリ521に設定された先頭排他キューアドレス521cから順番に次に接続される排他キュー54が存在するか否かを判定する。次の排他キュー54が存在すると判定した場合(ステップS62;Yes)、クローズ処理部225は、次の排他キュー54を選択し、選択した排他キュー54が占有モード(EX)であるか否を判定する(ステップS63)。
選択した排他キュー54が占有モード(EX)であると判定した場合(ステップS63;Yes)、クローズ処理部225は、自己の排他キュー54の前に他のアプリケーション21の共有モード(SH)の排他キュー54があるか否かを判定する(ステップS64)。例えば、クローズ処理部225は、自己の排他キュー54が管理するブロックに対応するブロック情報512から接続される方向にある排他キュー54を辿る。そして、クローズ処理部225は、自己の排他キュー54の前に他のアプリケーション21の共有モード(SH)の排他キュー54があるか否かを判定する。
自己の排他キュー54の前に他のアプリケーション21の共有モード(SH)の排他キュー54がないと判定した場合(ステップS64;No)、クローズ処理部225は、次の排他キュー54を判定すべく、ステップS62に移行する。一方、自己の排他キュー54の前に他のアプリケーション21の共有モード(SH)の排他キュー54があると判定した場合(ステップS64;Yes)、クローズ処理部225は、他のアプリケーション21のトランザクションが終了するまで待つ(ステップS65)。他のアプリケーション21のトランザクションが終了するまで、他のアプリケーション21が自己の排他キュー54によって管理されるブロックと同一のブロックに対して書き込み処理をするかしないか不明であるからである。
他のアプリケーション21のトランザクションが終了した後、クローズ処理部225は、自己の排他キュー54のステータス54hが正常であるか否かを判定する(ステップS69)。すなわち、クローズ処理部225は、他のアプリケーション21からの書き込み処理部223によって自己の排他キュー54のステータス54hが異常でスケジュールされていないかどうかを判定する。自己の排他キュー54のステータス54hが正常であると判定した場合(ステップS69;Yes)、クローズ処理部225は、次の排他キュー54を判定すべく、ステップS62に移行する。
一方、自己の排他キュー54のステータス54hが正常でないと判定した場合(ステップS69;No)、クローズ処理部225は、データの競合が発生したと判断し、エラーで処理を終了する。
ステップS63では、選択した排他キュー54が占有モード(EX)でないと判定した場合(ステップS63;No)、クローズ処理部225は、自己の排他キュー54の後に他のアプリケーション21の占有モード(EX)の排他キュー54があるか否かを判定する(ステップS66)。例えば、クローズ処理部225は、自己の排他キュー54が管理するブロックに対応するブロック情報512から接続される方向にある排他キュー54を辿る。そして、クローズ処理部225は、自己の排他キュー54の後に他のアプリケーション21の占有モード(EX)の排他キュー54があるか否かを判定する。
自己の排他キュー54の後に他のアプリケーション21の占有モード(EX)の排他キュー54がないと判定した場合(ステップS66;No)、クローズ処理部225は、次の排他キュー54を判定すべく、ステップS62に移行する。一方、自己の排他キュー54の後に他のアプリケーション21の占有モード(EX)の排他キュー54があると判定した場合(ステップS66;Yes)、クローズ処理部225は、他の排他キュー54のトランザクションが終了待ち状態か否かを判定する(ステップS67)。例えば、クローズ処理部225は、他の排他キュー54の待ち状態54gがNULL以外であるか否かを判定する。
他の排他キュー54のトランザクションが終了待ち状態であると判定した場合(ステップS67;Yes)、クローズ処理部225は、ステータス54hを「正常」と設定してスケジュールする(ステップS68)。これは、同じブロックについてデータが競合していないと判断されるからである。そして、クローズ処理部225は、次の排他キュー54を判定すべく、ステップS62に移行する。
一方、他の排他キュー54のトランザクションが終了待ち状態でないと判定した場合(ステップS67;No)、クローズ処理部225は、次の排他キュー54を判定すべく、ステップS62に移行する。
ステップS62では、次の排他キュー54が存在しないと判定した場合(ステップS62;No)、クローズ処理部225は、自己のトランザクションで管理している占有モード(EX)の排他キュー54を検索する。そして、クローズ処理部225は、更新後データをファイルに書き込む(ステップS70)。例えば、クローズ処理部225は、自己のアプリケーション21におけるトランザクションエントリ521から接続される方向に、占有モード(EX)の排他キュー54を検索する。そして、クローズ処理部225は、占有モード(EX)の排他キュー54の更新後ログ域54iが指す更新後ログ60のデータをファイルに書き込む。
そして、クローズ処理部225は、ファイルのクローズ処理を実行する。そして、クローズ処理部225は、作業用メモリ上の統計情報を統計情報40内の該当する統計情報エントリ41に更新する(ステップS71)。そして、クローズ処理部225は、自己のトランザクションの全ての排他キュー54および更新後データを開放し、トランザクションを終了する(ステップS72)。
[アクセス制御処理の具体例]
次に、実施例に係るアクセス制御処理の具体例について、図17を参照して説明する。図17は、実施例に係るアクセス制御処理の具体例を説明する図である。図17に示すように、バッチアプリケーション21が定期的に実行される。バッチアプリケーション21は、東京、大阪、名古屋それぞれについて、日次売上から月次売上を算出し、月次売上用の処理対象ファイル30に書き込むトランザクションを実行する。
各バッチアプリケーション21は、プログラミングに応じてライブラリ22のopen_EX()のモジュール、read_EX()のモジュール、write_EX()のモジュール、seek_EX()のモジュール、close_EX()のモジュールを呼び出す。ここでは、open_EX()は、オープン処理部221に対応する。read_EX()は、読み出し処理部222に対応する。write_EX()は、書き込み処理部223に対応する。seek_EX()は、シーク処理部224に対応する。close_EX()は、クローズ処理部225に対応する。
各モジュールは、統計情報40および排他情報50を用いて処理する。すなわち、東京に関するバッチアプリケーション21は、東京に関する日次売上を読み出すために、read_EX()を呼び出して読み込みファイルから東京に対応するデータを読み出す。そして、バッチアプリケーション21は、読み出したデータを用いて月次売上を算出し、東京に関する月次売上を書き込むために、write_EX()を呼び出して処理対象ファイル30へ東京に対応するデータを書き込む。そして、バッチアプリケーション21は、close_EX()を呼び出して、読み込みファイルおよび処理対象ファイル30をクローズする。大阪、名古屋に関するバッチアプリケーション21も、東京の場合と同様に、それぞれ大阪、名古屋に対応するデータを処理対象ファイル30へ書き込む。
アクセス制御処理は、東京、大阪、名古屋のバッチアプリケーション21を並列して実行しても、処理対象ファイル30に書き込むブロックが競合しなければ、それぞれの地名に対応する部分に算出結果を正しく書き込むことができる。アクセス制御処理は、仮に処理対象ファイル30に書き込むブロックが競合しても、エラーとすることができる。したがって、アクセス制御処理は、東京、大阪、名古屋のバッチアプリケーション21を並列して実行しても、相互に影響を及ぼすことなく、同じ処理対象ファイル30にアクセスすることができる。
[制御装置の具体例]
次に、実施例に係る制御装置1の具体的な構成例について、図18を参照して説明する。図18は、実施例に係る制御装置の具体的な構成例を示す図である。図18に示すように、アプリケーション21は、ライブラリ22で提供される各モジュールでプログラミングされたプログラムである。
ライブラリ22には、各モジュールが提供されている。ここでは、open_EX()のモジュール、read_EX()のモジュール、write_EX()のモジュール、close_EX()のモジュールが提供されている。open_EX()は、オープン処理部221に対応する。read_EX()は、読み出し処理部222に対応する。write_EX()は、書き込み処理部223に対応する。close_EX()は、クローズ処理部225に対応する。
そして、各モジュールは、それぞれ統計情報40および排他情報50にアクセスする。加えて、各モジュールは、それぞれOS23が提供しているモジュールを呼び出す。すなわち、open_EX()のモジュールは、OS23が提供するopen()を呼び出す。read_EX()のモジュールは、OS23が提供するread()を呼び出す。write_EX()のモジュールは、OS23が提供するwrite()を呼び出す。close_EX()のモジュールは、OS23が提供するclose()を呼び出す。そして、OS23が提供されたモジュールから処理対象ファイル30がアクセスされる。
このような構成を有する制御装置1は、アクセス制御処理を実行する。
[実施例の効果]
上記実施例によれば、制御装置1は、バッチ処理によって実行される複数のアプリケーション21それぞれについて、アプリケーション21が処理対象ファイル30の記憶領域にアクセスした際のアクセス位置およびアクセス領域のサイズに対応する領域であるブロックの排他情報50を蓄積する。そして、制御装置1は、蓄積されたブロックの排他情報50に基づいて、複数のアプリケーション21のいずれかのアプリケーション21が処理対象ファイル30の記憶領域にアクセスした際に、記憶領域におけるブロックの排他制御50で特定される領域を対象に排他制御を実行する。かかる構成によれば、制御装置1は、複数のアプリケーション21を並列して処理しても、いずれか一方のアプリケーション21での処理対象ファイル30単位での待ちがなくなり、バッチ処理を効率的に実現できる。すなわち、制御装置1は、複数のアプリケーションによってアクセスされる処理対象ファイル30への影響を相互に及ぼすことなくアクセス可能となる。また、ユーザは事前に処理対象ファイル30をDB(DataBase)に移行させなくても、制御装置1は、項目(ブロック)単位で排他制御を実現できる。
また、上記実施例によれば、制御装置1は、処理対象ファイル30の記憶領域を所定の長さのブロックに論理的に分割し、ブロックの排他情報50を蓄積する。そして、制御装置1は、アクセスした領域に対応するブロックを対象に排他制御を実行する。かかる構成によれば、制御装置1は、ブロック単位で排他制御することで、複数のアプリケーション21を並列して処理してもファイル単位での待ちがなくなり、バッチ処理を効率的に実現できる。
また、上記実施例によれば、制御装置1は、アプリケーション21毎に、読み出し領域に対応するブロックの排他情報50および書き込み領域のうち書き込むデータと値が異なる領域に対応するブロックの排他情報50を蓄積する。そして、制御装置1は、蓄積された他のアプリケーション21に対応するブロックの排他情報50を参照し、現に書き込む領域のうち書き込むデータと値が異なる領域に対応するブロックと同じブロックの排他情報50があるか否かを判定する。そして、制御装置1は、同じブロックの排他情報50があれば、参照したブロックの排他情報50が書き込みに関わるブロックの排他情報50である場合に、当該ブロックを対象に排他制御を実行する。かかる構成によれば、制御装置1は、書き込むデータと値が異なる領域に対応するブロックを対象に排他制御を実行することで、排他制御の範囲を局所化できる。
また、上記実施例によれば、制御装置1は、ブロックの長さを、現に値が更新されたデータのサイズを用いた長さとし、処理対象ファイル30の記憶領域を当該長さのブロックに分割し、アクセスされたブロックの情報を蓄積する。かかる構成によれば、制御装置1は、ブロック長を実際に値が更新されたデータのサイズに則して変えることで、ブロック長を最適化できる。
[プログラムなど]
なお、実施例では、HDD3に、1つの処理対象ファイル30が記憶されるとしたが、複数の処理対象ファイル30が記憶されるとしても良い。HDD3には、アプリケーション21がアクセスするファイルを記憶するようにすれば良い。
制御装置1は、既知のパーソナルコンピュータ、ワークステーションなどの情報処理装置に、上記した制御部2、HDD3およびRAM4などの各機能を搭載することによって実現することができる。
また、図示した装置の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、装置の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、ライブラリ22をOS23と統合しても良い。一方、オープン処理部221を、処理対象ファイル30のブロック長を決定する処理部と処理対象ファイル30をオープンする処理部とに分散しても良い。また、HDD3を制御装置1の外部装置としてネットワーク経由で接続するようにしても良い。
また、上記実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、図1に示した制御装置1と同様の機能を実現するアクセス制御プログラムを実行するコンピュータの一例を説明する。図19は、アクセス制御プログラムを実行するコンピュータの一例を示す図である。
図19に示すように、コンピュータ200は、各種演算処理を実行するCPU203と、ユーザからのデータの入力を受け付ける入力装置215と、表示装置209を制御する表示制御部207とを有する。また、コンピュータ200は、記憶媒体からプログラムなどを読取るドライブ装置213と、ネットワークを介して他のコンピュータとの間でデータの授受を行う通信制御部217とを有する。また、コンピュータ200は、各種情報を一時記憶するメモリ201と、HDD205を有する。そして、メモリ201、CPU203、HDD205、表示制御部207、ドライブ装置213、入力装置215、通信制御部217は、バス219で接続されている。
ドライブ装置213は、例えばリムーバブルディスク211用の装置である。HDD205は、アクセス制御プログラム205aおよびアクセス制御関連情報205bを記憶する。
CPU203は、アクセス制御プログラム205aを読み出して、メモリ201に展開し、プロセスとして実行する。かかるプロセスは、制御装置1の各機能部に対応する。また、CPU203は、プロセスを実行時に、制御装置1の統計情報40、排他情報50を展開する。アクセス制御関連情報205bは、処理対象ファイル30に対応する。そして、例えばリムーバブルディスク211が、アクセス制御プログラム205aなどの各情報を記憶する。
なお、アクセス制御プログラム205aについては、必ずしも最初からHDD205に記憶させておかなくても良い。例えば、コンピュータ200に挿入されるフレキシブルディスク(FD)、CD−ROM、DVDディスク、光磁気ディスク、ICカードなどの「可搬用の物理媒体」に当該プログラムを記憶させておく。そして、コンピュータ200がこれらからアクセス制御プログラム205aを読み出して実行するようにしても良い。