(57)【特許請求の範囲】
【請求項１】
処理の開始予定時刻が定められたイベントレコードを入力するイベント入力部と、
前記イベント入力部がイベントレコードを入力した入力時刻から前記イベントレコードの開始予定時刻までの時間を開始待ち時間として算出し、算出した開始待ち時間が第一の時間未満の時間である場合に第一の単位時間を前記イベントレコードの開始予定時刻を変換するための単位時間として特定し、算出した開始待ち時間が前記第一の時間以上第二の時間未満の時間である場合に第二の単位時間を前記イベントレコードの開始予定時刻を変換するための単位時間として特定する単位時間特定部と、
前記単位時間特定部により特定された単位時間に基づいて前記イベントレコードの開始予定時刻を前記単位時間を単位とする時刻に変換し、変換して得られた時刻を開始判定時刻として特定する開始判定時刻特定部と、
前記開始判定時刻特定部により特定された開始判定時刻に基づいて前記開始判定時刻に対応付けた記憶領域を所定の記憶装置に確保し、確保した記憶領域に前記イベントレコードを記憶するスケジューリング部と、
前記開始判定時刻に前記開始判定時刻に対応する記憶領域に記憶されている前記イベントレコードを参照し、前記イベントレコードを参照した参照時刻と前記イベントレコードの開始予定時刻とに基づいて前記イベントレコードの処理を開始するか否かを判定し、前記イベントレコードの処理を開始すると判定した場合に前記イベントレコードの処理を開始し、前記イベントレコードの処理を開始しないと判定した場合に前記イベントレコードを前記イベント入力部に入力するイベント処理部と
を備えることを特徴とするスケジューリング装置。
【請求項２】
前記スケジューリング装置は、第１の記憶装置と第２の記憶装置とを備え、
前記スケジューリング部は、前記イベント入力部が入力したイベントレコードを入力イベントとして記憶する記憶領域を前記第１の記憶装置に確保できる場合、前記入力イベントの開始予定時刻に対応付けた記憶領域を前記第１の記憶装置に確保し、確保した記憶領域に前記入力イベントを記憶し、前記入力イベントを記憶する記憶領域を前記第１の記憶装置に確保できない場合、前記第１の記憶装置に確保されている記憶領域のうち少なくともいずれかの記憶領域を解放領域として特定し、特定した解放領域に記憶されているイベントレコードを前記解放領域の開始判定時刻に対応付けて前記第２の記憶装置に記憶し、前記解放領域を前記入力イベントの開始予定時刻に対応付けて確保し、確保した解放領域に前記入力イベントを記憶し、
前記イベント処理部は、特定の開始判定時刻に前記第１の記憶装置に記憶されているイベントレコードのうち前記特定の開始判定時刻に対応する記憶領域に記憶されているイベントレコードを参照すると共に前記第２の記憶装置に記憶されているイベントレコードのうち前記特定の開始判定時刻に対応する記憶領域に記憶されているイベントレコードを参照する
ことを特徴とする請求項１記載のスケジューリング装置。
【請求項３】
前記スケジューリング部は、前記入力イベントを記憶する記憶領域を前記第１の記憶装置に確保できない場合、前記第１の記憶装置に確保されている記憶領域のうち所定の領域サイズより大きい領域サイズを有する記憶領域を前記解放領域として特定する
ことを特徴とする請求項２記載のスケジューリング装置。
【請求項４】
前記スケジューリング部は、前記入力イベントを記憶する記憶領域を前記第１の記憶装置に確保できない場合、前記第１の記憶装置に確保されている記憶領域のうち所定の領域サイズより大きい領域サイズを有する記憶領域であって前記入力イベントの入力時刻から所定時間後の時刻以降の開始判定時刻に対応する記憶領域を前記解放領域として特定することを特徴とする請求項３記載のスケジューリング装置。
【請求項５】
前記スケジューリング部は、前記入力イベントを記憶する記憶領域を前記第１の記憶装置に確保できない場合、前記第１の記憶装置に確保されている記憶領域のうち前記入力イベントの入力時刻から所定時間後の時刻以降の開始判定時刻に対応する記憶領域を前記解放領域として特定する
ことを特徴とする請求項２記載のスケジューリング装置。
【請求項６】
前記イベント処理部は、前記イベントレコードの開始予定時刻を含んだ開始許容時間帯であって所定の時間長を有する開始許容時間帯に前記イベントレコードの参照時刻が含まれる場合に前記イベントレコードの処理を開始し、前記開始許容時間帯に前記イベントレコードの参照時刻が含まれない場合に前記イベントレコードを前記イベント入力部に入力する
ことを特徴とする請求項１〜請求項５いずれかに記載のスケジューリング装置。
【請求項７】
前記単位時間特定部は、前記単位時間を意味するｖと、前記イベントレコードの入力時刻を意味するｔと、前記イベントレコードの開始予定時刻を意味するｓと、所定時間を意味するｕと、定数を意味するｋと、ａとｂとのうち大きい方の値を意味するＭａｘ（ａ，ｂ）と、ｘ以下の最大の整数を意味する［ｘ］と、ｘの指数関数を意味するｅｘｐ（ｘ）と、ｘの自然対数を意味するｌｏｇ（ｘ）とを用いた式であり、
前記式は、ｖ＝Ｍａｘ（ｕ，［ｋ・ｅｘｐ（［ｌｏｇ（ｓ−ｔ）］）／ｕ］・ｕ）である
ことを特徴とする請求項１〜請求項６いずれかに記載のスケジューリング装置。
【請求項８】
前記スケジューリング装置は、さらに、
前記第１の記憶装置に確保されている記憶領域の数が所定数を超えている場合、前記第１の記憶装置に確保されている記憶領域のうち少なくともいずれかの記憶領域を解放領域として特定し、特定した解放領域に記憶されているイベントレコードを前記解放領域の開始判定時刻に対応付けて前記第２の記憶装置に記憶し、前記第１の記憶装置の解放領域を解放する記憶領域数制限部を備える
ことを特徴とする請求項２記載のスケジューリング装置。
【請求項９】
イベント入力部が、処理の開始予定時刻が定められたイベントレコードを入力し、
単位時間特定部が、前記イベント入力部がイベントレコードを入力した入力時刻から前記イベントレコードの開始予定時刻までの時間を開始待ち時間として算出し、算出した開始待ち時間が第一の時間未満の時間である場合に第一の単位時間を前記イベントレコードの開始予定時刻を変換するための単位時間として特定し、算出した開始待ち時間が前記第一の時間以上第二の時間未満の時間である場合に第二の単位時間を前記イベントレコードの開始予定時刻を変換するための単位時間として特定し、
開始判定時刻特定部が、前記単位時間特定部により特定された単位時間に基づいて前記イベントレコードの開始予定時刻を前記単位時間を単位とする時刻に変換し、変換して得られた時刻を開始判定時刻として特定し、
スケジューリング部が、前記開始判定時刻特定部により特定された開始判定時刻に基づいて前記開始判定時刻に対応付けた記憶領域を所定の記憶装置に確保し、確保した記憶領域に前記イベントレコードを記憶し、
イベント処理部が、前記開始判定時刻に前記開始判定時刻に対応する記憶領域に記憶されている前記イベントレコードを参照し、前記イベントレコードを参照した参照時刻と前記イベントレコードの開始予定時刻とに基づいて前記イベントレコードの処理を開始するか否かを判定し、前記イベントレコードの処理を開始すると判定した場合に前記イベントレコードの処理を開始し、前記イベントレコードの処理を開始しないと判定した場合に前記イベントレコードを前記イベント入力部に入力する
ことを特徴とするスケジューリング方法。
【請求項１０】
処理の開始予定時刻が定められたイベントレコードを入力するイベント入力処理と、
前記イベント入力処理がイベントレコードを入力した入力時刻から前記イベントレコードの開始予定時刻までの時間を開始待ち時間として算出し、算出した開始待ち時間が第一の時間未満の時間である場合に第一の単位時間を前記イベントレコードの開始予定時刻を変換するための単位時間として特定し、算出した開始待ち時間が前記第一の時間以上第二の時間未満の時間である場合に第二の単位時間を前記イベントレコードの開始予定時刻を変換するための単位時間として特定する単位時間特定処理と、
前記単位時間特定処理により特定された単位時間に基づいて前記イベントレコードの開始予定時刻を前記単位時間を単位とする時刻に変換し、変換して得られた時刻を開始判定時刻として特定する開始判定時刻特定処理と、
前記開始判定時刻特定処理により特定された開始判定時刻に基づいて前記開始判定時刻に対応付けた記憶領域を所定の記憶装置に確保し、確保した記憶領域に前記イベントレコードを記憶するスケジューリング処理と、
前記開始判定時刻に前記開始判定時刻に対応する記憶領域に記憶されている前記イベントレコードを参照し、前記イベントレコードを参照した参照時刻と前記イベントレコードの開始予定時刻とに基づいて前記イベントレコードの処理を開始するか否かを判定し、前記イベントレコードの処理を開始すると判定した場合に前記イベントレコードの処理を開始し、前記イベントレコードの処理を開始しないと判定した場合に前記イベントレコードを前記イベント入力処理に入力するイベント処理と
をコンピュータに実行させるためのスケジューリングプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えば、タスクやイベントをスケジューリングして実行するスケジューリング装置、スケジューリング方法およびスケジューリングプログラムに関するものである。
【背景技術】
【０００２】
コンピュータにより所定の時刻にタスク（所定の情報源からの情報取得など）を実行させる場合や、離散事象（イベント）のシミュレーションを行う場合、タスクやイベントとその実行時刻（生起時刻）を対応付けて管理するために、優先度付き待ち行列と呼ばれるデータ構造が用いられる。優先度付き待ち行列は、イベントを挿入する操作、及び実行時刻が最も小さいイベントを取り出す操作を効率的に実現するデータ構造であるのが望ましい。
シミュレーションにおいては、非特許文献１のＣａｌｅｎｄａｒ  Ｑｕｅｕｅと呼ばれるデータ構造が用いられることが一般的である。この構造はイベントを実行時刻順に整列して保持する代わりに、実行時刻に対応する固定数のタイムスロットにイベントを振り分けて格納する。これにより、イベント数によらない挿入コストを実現している。実行時刻を所定の時間分解能で表現した場合に実行時刻が同一となるイベントは同一のタイムスロットに格納される。現在時刻と実行時刻との差が「単位時間×タイムスロット数」を超えない場合、タイムスロット内の実行時刻は全て同一となる。しかし、一般にはタイムスロット数を小さく設定し、「単位時間×タイムスロット数」を法として実行時刻とタイムスロットの割り当てを行う。すなわち、タイムスロット内には異なる実行時刻のイベントが混在し、現在時刻に対応しないイベントはスキップされる。
有限の時間分解能を設定しない方法として、浮動小数点数の実行時刻にハッシュ関数を適用し、ハッシュ値に基づいてタイムスロットを割り当てる方法が特許文献１に開示されている。この場合もタイムスロット内には異なる実行時刻のイベントが混在することになる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００１−６０２４１号公報、第９頁、図３
【非特許文献】
【０００４】
【非特許文献１】Ｃａｌｅｎｄａｒ  Ｑｕｅｕｅｓ：Ａ  Ｆａｓｔ  Ｏ（１）  Ｐｒｉｏｒｉｔｙ  Ｑｕｅｕｅ  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ  ｆｏｒ  ｔｈｅ  Ｓｉｍｕｌａｔｉｏｎ  Ｅｖｅｎｔ  Ｓｅｔ  Ｐｒｏｂｌｅｍ、Ｃｏｍｍｕｎｉｃａｔｉｏｎｓ  ｏｆ  ｔｈｅ  ＡＣＭ、第３１巻、第１０号
【非特許文献２】ロバート・セジウィック著、野下ほか訳、「アルゴリズムＣ＋＋」、ＩＳＢＮ  ９７８−４７６４９０２２２０
【発明の概要】
【発明が解決しようとする課題】
【０００５】
従来のスケジューリングに用いられてきた優先度付き待ち行列は、コンピュータの主記憶上に全てのイベントが格納できることを前提としており、主記憶の容量を超えるような大量のイベントを扱うことは想定されていない。
しかし、１００億以上存在するＷｅｂページの内容をそれぞれに固有の周期で繰り返し収集するような場合においては、個々のＷｅｂページに対する収集イベントを主記憶上に保持するには大量の主記憶が必要となって実現コストが増大してしまう。
また、主記憶の容量が極めて限られた組み込み機器等においては、二次記憶を活用することでより多くのイベントを扱えるようにすることが求められる。
【０００６】
Ｃａｌｅｎｄａｒ  Ｑｕｅｕｅを単純に二次記憶上で実現した場合、タイムスロット数が少ないと同一タイムスロット内に実行時刻が異なるイベントが多数混在し、タイムスロットの内容を読み出す際に不要なデータ転送が発生して処理時間が増大してしまう。
一方、実行時刻の混在が起こらない程度にタイムスロット数を増加させると、タイムスロットごとに割り当て可能な書き込みバッファの容量が減少し、二次記憶に対する小規模な書き込みが多数発生して実効的な転送速度が低下してしまう。
この課題は、タイムスロットの時間分解能を小さくしてスケジューリングの精度を上げようとすると特に顕著となる。単位時間の減少に伴い、実行時刻の混在を避けるために必要なタイムスロット数（＝最大スケジューリング期間／単位時間）が増加するためである。
【０００７】
本発明は、例えば、タイムスロット数を削減せずに書き込みバッファ数のみを削減し、少ないハードウェアリソースで大量のイベントを効率的に処理できるようにすることを目的とする。
【課題を解決するための手段】
【０００８】
本発明のスケジューリング装置は、
処理の開始予定時刻が定められたイベントレコードを入力するイベント入力部と、
前記イベント入力部がイベントレコードを入力した入力時刻から前記イベントレコードの開始予定時刻までの時間を開始待ち時間として算出し、算出した開始待ち時間が長いほど長い時間を単位時間として特定する単位時間特定部と、
前記単位時間特定部により特定された単位時間に基づいて前記イベントレコードの開始予定時刻を前記単位時間を単位とする時刻に変換し、変換して得られた時刻を開始判定時刻として特定する開始判定時刻特定部と、
前記開始判定時刻特定部により特定された開始判定時刻に基づいて前記開始判定時刻に対応付けた記憶領域を所定の記憶装置に確保し、確保した記憶領域に前記イベントレコードを記憶するスケジューリング部と、
前記開始判定時刻に前記開始判定時刻に対応する記憶領域に記憶されている前記イベントレコードを参照し、前記イベントレコードを参照した参照時刻と前記イベントレコードの開始予定時刻とに基づいて前記イベントレコードの処理を開始するか否かを判定し、前記イベントレコードの処理を開始すると判定した場合に前記イベントレコードの処理を開始し、前記イベントレコードの処理を開始しないと判定した場合に前記イベントレコードを前記イベント入力部に入力するイベント処理部とを備える。
【発明の効果】
【０００９】
本発明によれば、例えば、タイムスロット数を削減せずに書き込みバッファ数（記憶領域数）のみを削減し、少ないハードウェアリソースで大量のイベントを効率的に処理できるようにすることを目的とする。
【図面の簡単な説明】
【００１０】
【図１】実施の形態１におけるスケジューリングシステム１００の機能構成図。
【図２】実施の形態１におけるイベントレコード２００のフォーマットを示す図。
【図３】実施の形態１におけるバッファ記憶部１３０とバケット記憶部１４０との概要図。
【図４】実施の形態１におけるバッファ群３００のデータ構造を示す図。
【図５】実施の形態１におけるバッファヘッダ３２９のフォーマットを示す図。
【図６】実施の形態１における実行部１１０のイベント実行処理を示すフローチャート。
【図７】実施の形態１におけるスケジュール部１２０のイベントスケジュール処理を示すフローチャート。
【図８】実施の形態１における格納先バッファ決定処理（Ｓ２２０）を示すフローチャート。
【図９】実施の形態１における実行間隔ｘと第２の単位時間ｖとの関係を表したグラフの一例を示す図。
【図１０】実施の形態１におけるスケジューリングシステム１００のハードウェア資源の一例を示す図。
【図１１】実施の形態２におけるスケジューリングシステム１００の機能構成図。
【図１２】実施の形態２におけるバッファ群３００のデータ構造を示す図。
【図１３】実施の形態２におけるバッファヘッダ３７０のフォーマットを示す図。
【図１４】実施の形態２におけるスケジュール部１２０のイベントスケジュール処理を示すフローチャート。
【図１５】実施の形態２におけるバッファヘッダ数制限処理（Ｓ２８０）を示すフローチャート。
【発明を実施するための形態】
【００１１】
実施の形態１．
イベントレコードの入力時刻からイベントレコードの開始予定時刻までの開始待ち時間（後述する実行間隔ｘ）に基づいてイベントレコードをスケジューリングする形態について説明する。
【００１２】
図１は、実施の形態１におけるスケジューリングシステム１００の機能構成図である。
実施の形態１におけるスケジューリングシステム１００の機能構成について、図１に基づいて以下に説明する。
【００１３】
スケジューリングシステム１００（スケジューリング装置の一例）は、実行部１１０、スケジュール部１２０、バッファ記憶部１３０およびバケット記憶部１４０を備える。
【００１４】
スケジュール部１２０は、イベント入力部１２１、格納先バッファ決定部１２２およびイベント格納部１２３を備える。
【００１５】
イベント入力部１２１は、処理の開始予定時刻が定められたイベントレコード２００を入力する。
後述する「実行時刻２１０」は「開始予定時刻」の一例である。
【００１６】
格納先バッファ決定部１２２（単位時間特定部の一例）は、イベント入力部１２１がイベントレコード２００を入力した入力時刻からイベントレコード２００の開始予定時刻までの時間を開始待ち時間として算出する。格納先バッファ決定部１２２は、算出した開始待ち時間が長いほど長い時間を単位時間として特定する。
格納先バッファ決定部１２２（開始判定時刻特定部の一例）は、特定した単位時間に基づいてイベントレコード２００の開始予定時刻を前記単位時間を単位とする時刻に変換し、変換して得られた時刻を開始判定時刻として特定する。
【００１７】
後述する「実行間隔ｘ」「第２の単位時間ｖ」「開始時刻」は、それぞれ上記した「開始待ち時間」「単位時間」「開始判定時刻」の一例である。
【００１８】
イベント格納部１２３（スケジューリング部の一例）は、格納先バッファ決定部１２２により特定された開始判定時刻に基づいて、開始判定時刻に対応付けた記憶領域（バッファ）をバッファ記憶部１３０に確保する。イベント格納部１２３は、確保した記憶領域にイベントレコード２００を記憶する。
【００１９】
例えば、イベント格納部１２３は、イベント入力部１２１が入力したイベントレコード２００を入力イベントとして記憶する記憶領域をバッファ記憶部１３０に確保できる場合、入力イベントの開始予定時刻に対応付けた記憶領域をバッファ記憶部１３０に確保する。イベント格納部１２３は確保した記憶領域に入力イベントを記憶する。入力イベントを記憶する記憶領域をバッファ記憶部１３０に確保できない場合、イベント格納部１２３は、バッファ記憶部１３０に確保されている記憶領域のうち少なくともいずれかの記憶領域を解放領域として特定する。イベント格納部１２３は、特定した解放領域に記憶されているイベントレコード２００を解放領域の開始判定時刻に対応付けてバケット記憶部１４０に記憶し、解放領域を入力イベントの開始予定時刻に対応付けて確保し、確保した解放領域に入力イベントを記憶する。
【００２０】
例えば、イベント格納部１２３は、入力イベントを記憶する記憶領域をバッファ記憶部１３０に確保できない場合、バッファ記憶部１３０に確保されている記憶領域のうち所定の領域サイズ（ページ数）より大きい領域サイズを有する記憶領域を解放領域として特定する。
または、イベント格納部１２３は、入力イベントを記憶する記憶領域をバッファ記憶部１３０に確保できない場合、バッファ記憶部１３０に確保されている記憶領域のうち所定の領域サイズより大きい領域サイズを有する記憶領域であって入力イベントの入力時刻から所定時間後の時刻以降の開始判定時刻に対応する記憶領域を解放領域として特定する。
または、イベント格納部１２３は、入力イベントを記憶する記憶領域をバッファ記憶部１３０に確保できない場合、バッファ記憶部１３０に確保されている記憶領域のうち入力イベントの入力時刻から所定時間後の時刻以降の開始判定時刻に対応する記憶領域を解放領域として特定する。
【００２１】
実行部１１０（イベント処理部の一例）は、開始判定時刻に開始判定時刻に対応する記憶領域に記憶されているイベントレコードを参照する。
実行部１１０は、イベントレコード２００を参照した参照時刻とイベントレコード２００の開始予定時刻とに基づいてイベントレコード２００の処理を開始するか否かを判定する。
実行部１１０は、イベントレコード２００の処理を開始すると判定した場合にイベントレコード２００の処理を開始し、イベントレコード２００の処理を開始しないと判定した場合にイベントレコード２００をイベント入力部１２１に入力する。
【００２２】
例えば、実行部１１０は、特定の開始判定時刻にバッファ記憶部１３０に記憶されているイベントレコード２００のうち特定の開始判定時刻に対応する記憶領域に記憶されているイベントレコード２００を参照する。さらに、実行部１１０は、バケット記憶部１４０に記憶されているイベントレコード２００のうち特定の開始判定時刻に対応する記憶領域に記憶されているイベントレコード２００を参照する。
【００２３】
例えば、実行部１１０は、イベントレコード２００の開始予定時刻を含んだ開始許容時間帯であって所定の時間長（例えば、後述する時刻許容誤差２２０）を有する開始許容時間帯にイベントレコード２００の参照時刻が含まれる場合にイベントレコード２００の処理を開始する。開始許容時間帯にイベントレコード２００の参照時刻が含まれない場合、実行部１１０はイベントレコード２００をイベント入力部１２１に入力する。
または、実行部１１０は、イベントレコード２００を参照した参照時刻とイベントレコード２００の開始予定時刻とに関わらず開始判定時刻にイベントレコード２００の処理を開始する。
【００２４】
バッファ記憶部１３０（第１の記憶装置の一例）は、イベントレコード２００の開始判定時刻に対応付けた記憶領域（バッファ）を確保し、確保した記憶領域にイベントレコード２００を記憶する。
【００２５】
バケット記憶部１４０（第２の記憶装置の一例）は、バッファ記憶部１３０に確保された特定の記憶領域に記憶されているイベントレコード２００をイベントレコード２００の開始判定時刻に対応する記憶領域（バケット）に記憶する。
【００２６】
図２は、実施の形態１におけるイベントレコード２００のフォーマットを示す図である。
実施の形態１におけるイベントレコード２００について、図２に基づいて説明する。
【００２７】
イベントレコード２００には、実行時刻２１０、時刻許容誤差２２０および実行内容２３０が予め設定される。
実行時刻２１０は、処理を開始する予定時刻を示す。
時刻許容誤差２２０は、実行時刻２１０に対する許容時間を示す。
実行内容２３０は、処理の実行に必要な情報を示す。例えば、実行内容２３０は、起動するプログラムの名称とプログラムの引数との組み合わせや、呼び出すサブルーチンの名称とサブルーチンのパラメータとの組み合わせを示す。
【００２８】
イベントレコード２００に対する処理は、実行時刻２１０を基準時刻にして時刻許容誤差２２０の期間内に開始する必要がある。つまり、イベントレコード２００の処理が開始される処理開始時刻ＴＳは実行時刻ＴＥと時刻許容誤差Ｔαとを用いて「ＴＥ−Ｔα≦ＴＳ≦ＴＥ＋Ｔα」で表される。
例えば、実行時刻２１０が「２０１０年１月２８日１６時３５分３０秒」であり、時刻許容誤差２２０が「１時間」である場合、イベントレコード２００の処理は「２０１０年１月２８日１５時３５分３０秒」から「２０１０年１月２８日１７時３５分３０秒」までの間に開始される。
以下、イベントレコード２００の処理を開始できる期間を「処理可能期間」という。
【００２９】
図３は、実施の形態１におけるバッファ記憶部１３０とバケット記憶部１４０との概要図である。
実施の形態１におけるバッファ記憶部１３０とバケット記憶部１４０との概要について、図３に基づいて以下に説明する。
【００３０】
バッファ記憶部１３０はバケット記憶部１４０に比べて記憶容量が小さいが、データに対するアクセスが速く、データアクセスに要する遅延時間が小さい。
例えば、バッファ記憶部１３０をランダムアクセスメモリ（ＲＡＭ）で、バケット記憶部１４０を磁気ディスク装置で実装する。
【００３１】
バッファ記憶部１３０とバケット記憶部１４０には、処理前のイベントレコード２００が記憶される。
【００３２】
バッファ記憶部１３０には、複数のバッファＢＦ（バッファ群３００）が設けられる。
複数のバッファＢＦはそれぞれに異なる開始時刻（ｔ，ｔ＋ｕ，・・・）に対応付けられている。
【００３３】
イベントレコード２００は、バッファＢＦに記憶されるときに実行時刻２１０までの時間の長さ（以下、「実行間隔」という）に応じて第２の単位時間を決められ、実行時刻２１０が第２の単位時間で丸められ、丸められた実行時刻２１０に対応するバッファＢＦに記憶される。
例えば、実行時刻２１０が「２０１０年１月２８日１６時３５分３０秒」であり、単位時間が「３０分」である場合、イベントレコード２００は「２０１０年１月２８日１６時３０分００秒」に対応するバッファＢＦに記憶される。
【００３４】
第２の単位時間は、実行間隔が長いほど大きい単位の時間になり、実行間隔が短いほど小さい単位の時間になる。例えば、実行間隔が「１０分」であれば第２の単位時間を「１分」とし、実行間隔が「１時間」であれば第２の単位時間を「４分」とし、実行間隔が「１日」であれば第２の単位時間を「１時間」とする。
第２の単位時間は、所定の第１の単位時間（例えば「１分」）を最小の単位として定められる。つまり、第２の単位時間は第１の単位時間の整数倍の時間である。
【００３５】
第１の単位時間を「ｕ」、イベントレコード２００をスケジュールする最長の期間を「最大スケジュール期間Ｄ」とすると、現在時刻ＴにおいてバッファＢＦの開始時刻ｔＢＦは「Ｔ−ｕ＜ｔＢＦ＜Ｔ＋Ｄ」の範囲内の時刻になる。
【００３６】
バッファＢＦはイベントレコード２００が記憶される場合にのみ確保される。
例えば、図３では、バッファＢＦｔ＋４ｕ、ＢＦｔ＋６ｕ、ＢＦｔ＋８ｕ〜ＢＦｔ＋１０ｕは確保されていない。
【００３７】
バケット記憶部１４０には、バッファＢＦの開始時刻ｔＢＦになり得る全ての開始時刻に対応付けて複数のバケットＢＴ（バケット群）が設けられる。
例えば、図３では、最も早い開始時刻ｔから第１の単位時間ｕ毎にバケットＢＴが設けられている。
例えば、開始時刻をファイル名に含んだファイルがバケットＢＴとして生成される。
【００３８】
空き容量不足によりバッファ記憶部１３０にイベントレコード２００を記憶できない場合、バッファ記憶部１３０の少なくともいずれかのバッファＢＦが選択される。選択されたバッファＢＦに記憶されているイベントレコード２００はバッファＢＦと同じ開始時刻に対応するバケットＢＴに記憶される。そして、バッファＢＦが解放され、バッファ記憶部１３０の空き容量が増加する。
例えば、図３においてバッファＢＦｔ＋１１ｕが選択された場合、バッファＢＦｔ＋１１ｕに記憶されている２つのイベントレコード２００がバケットＢＴｔ＋１１ｕに記憶されている４つのイベントレコード２００の後ろに記憶され、バッファＢＦｔ＋１１ｕが解放される。
【００３９】
バッファＢＦに記憶されたイベントレコード２００はバッファＢＦの開始時刻に読み出され、読み出された時刻（開始時刻）がイベントレコード２００を処理できる処理可能期間内の時刻であればイベントレコード２００は処理される。
同様に、バケットＢＴに記憶されたイベントレコード２００はバケットＢＴの開始時刻に読み出され処理可能期間内の時刻であれば処理される。
読み出された時刻が処理可能期間内の時刻でない場合、バッファＢＦまたはバケットＢＴから読みだされたイベントレコード２００は再スケジュールされて特定のバッファＢＦに記憶される。
【００４０】
図４は、実施の形態１におけるバッファ群３００のデータ構造を示す図である。
実施の形態１におけるバッファ群３００のデータ構造について、図４に基づいて以下に説明する。
【００４１】
バッファ群３００は、開始指標３１０、バッファヘッダ配列３２０、ポインタ配列３３０およびバッファ３９９を有する。
【００４２】
バッファヘッダ配列３２０はバッファヘッダ３２９を要素とする配列であり、バッファヘッダ３２９は開始時刻３２１に対応付けられている。バッファヘッダ配列３２０の要素数Ｎはバッファヘッダ３２９が取り得る開始時刻の数に等しく、最大スケジュール期間Ｄと第１の単位時間ｕとを用いて「［Ｄ／ｕ］＋１」で与えられる。［Ｘ］はＸ以下の最大の整数を表す。
開始時刻３２１に対応するバッファ３９９が確保された場合、バッファヘッダ３２９にはポインタ配列アドレス３２５が設定される。ポインタ配列アドレス３２５はポインタ配列３３０の先頭アドレスを示す。開始時刻３２１に対応するバッファ３９９が確保されていない場合、バッファヘッダ３２９にポインタ配列アドレス３２５は設定されない。
ポインタ配列３３０は割り当てられたページの先頭アドレスを要素とする配列であり、先頭の要素から順に使用される。割り当てられたページにはイベントレコード２００が記憶される。ページは固定長の記憶領域である。例えば、最初に割り当てられたページの先頭アドレスがポインタ配列３３０の０番目の要素に設定される。ページに空き容量が無くなった場合、新たにページが割り当てられ、新たに割り当てられたページの先頭アドレスがポインタ配列３３０の１番目に要素に設定される。
以下、空き容量が無くなったページを「充填済みページ３４０」といい、空き容量が残っているページを「未充填ページ３５０」という。また、割り当てられたページ（充填済みページ３４０、未充填ページ３５０）を「バッファ３９９」という。図中の充填済みページ３４０および未充填ページ３５０は開始時刻ｔに対応するバッファ３９９である。
【００４３】
バッファ３９９を構成する各ページは論理的に連続した領域を表し、イベントレコード２００は複数ページに跨って記憶される場合もある（例えば、図中の「イベントレコードＤ」）。
【００４４】
開始指標３１０は、最も早い開始時刻３２１に対応するバッファヘッダ３２９の要素番号（配列の添え字）を示す。
図４では、開始指標３１０は開始時刻ｔに対応するバッファヘッダ３２９の要素番号「２」を示す。要素番号「２」のバッファヘッダ３２９に関連付けられたバッファ３９９が開始時刻ｔに処理され又は再スケジュールされた場合、バッファ３９９およびポインタ配列３３０は解放され、開始指標３１０には次の要素番号「３」が設定される。要素番号「２」のバッファヘッダ３２９は新たに開始時刻「ｔ＋Ｎ・ｕ」に対応付けられる。「Ｎ」はバッファヘッダ配列３２０の要素数であり、「ｕ」は第１の単位時間である。
【００４５】
図５は、実施の形態１におけるバッファヘッダ３２９のフォーマットを示す図である。
実施の形態１におけるバッファヘッダ３２９について、図５および図４に基づいて以下に説明する。
【００４６】
バッファヘッダ３２９には、開始時刻３２１、最大ページ数３２２、使用ページ数３２３、空き容量３２４およびポインタ配列アドレス３２５が設定される。
ポインタ配列アドレス３２５はポインタ配列３３０の先頭アドレスを示す。バッファ３９９が割り当てられていない場合、ポインタ配列アドレス３２５は無効アドレス（例えば「０」）を示す。
最大ページ数３２２はポインタ配列３３０の要素数、つまり、割り当てることができるページ数を示す。
使用ページ数３２３はポインタ配列３３０の要素のうち使用されている要素の数、つまり、割り当てられているページ数を示す。
空き容量３２４はポインタ配列３３０に関連付けられている未充填ページ３５０の空き容量を示す。
【００４７】
図６は、実施の形態１における実行部１１０のイベント実行処理を示すフローチャートである。
実施の形態１における実行部１１０のイベント実行処理について、図６に基づいて以下に説明する。
【００４８】
まず、イベント実行処理の概要について説明する。
【００４９】
実行部１１０は、バッファ群３００およびバケット群に対応する次の開始時刻ｔを特定し（Ｓ１１０）、開始時刻ｔまで待機する（Ｓ１１１）。
実行部１１０は、開始時刻ｔに対応するバッファ（ｔ）に未選択のイベントレコード２００が残っているか否かを判定する（Ｓ１２０）。
バッファ（ｔ）に未選択のイベントレコード２００が残っている場合（Ｓ１２０「ＹＥＳ」）、実行部１１０は、バッファ（ｔ）から未選択のイベントレコード２００を１つ選択し（Ｓ１２１）、選択したイベントレコード２００を処理可能な時刻であるか否かを判定する（Ｓ１２２）。
選択したイベントレコード２００を処理可能な時刻である場合（Ｓ１２２「ＹＥＳ」）、実行部１１０は、選択したイベントレコード２００の処理を実行する（Ｓ１２３）。
選択したイベントレコード２００を処理可能な時刻でない場合（Ｓ１２２「ＮＯ」）、実行部１１０は、選択したイベントレコード２００をスケジュール部１２０に入力する（Ｓ１２４）。
バッファ（ｔ）に未選択のイベントレコード２００が残っていない場合（Ｓ１２０「ＮＯ」）、実行部１１０は、バッファ（ｔ）を解放する（Ｓ１２５）。
その後、実行部１１０は、開始時刻ｔに対応するバケット（ｔ）をバッファ（ｔ）と同様に処理する（Ｓ１３０〜Ｓ１３５）。
【００５０】
次に、イベント実行処理の詳細について説明する。
【００５１】
Ｓ１１０において、実行部１１０は、バッファ記憶部１３０の開始指標３１０を参照し、開始指標３１０に指定されているバッファヘッダ３２９を参照し、バッファヘッダ３２９に設定されている開始時刻ｔを特定する。
Ｓ１１０の後、Ｓ１１１に進む。
【００５２】
Ｓ１１１において、実行部１１０はＳ１１０で特定した開始時刻ｔまで待機する。
Ｓ１１１の後、Ｓ１２０に進む。
【００５３】
Ｓ１２０において、実行部１１０は、開始時刻ｔのバッファヘッダ３２９に設定されているポインタ配列アドレス３２５を参照し、ポインタ配列アドレス３２５で特定されるポインタ配列３３０を参照する。
実行部１１０は、ポインタ配列３３０に設定されているアドレスで特定されるページを参照し、選択していないイベントレコード２００がページ内に残っているか否かを判定する。
以下、開始時刻ｔに対応するバッファを「バッファ（ｔ）」といい、選択していないイベントレコード２００を「未選択イベント」という。
バッファ（ｔ）内に未選択イベントが残っている場合（ＹＥＳ）、Ｓ１２１に進む。
バッファ（ｔ）内に未選択イベントが残っていない場合（ＮＯ）、Ｓ１２５に進む。
【００５４】
Ｓ１２１において、実行部１１０は、バッファ（ｔ）から未選択イベントを一つ選択する。
以下、選択した未選択イベントを「選択イベント」という。
Ｓ１２１の後、Ｓ１２２に進む。
【００５５】
Ｓ１２２において、実行部１１０は、選択イベントの実行時刻２１０と時刻許容誤差２２０に基づいて、選択イベントを処理できる時刻であるか否かを判定する。
現在時刻Ｔが実行時刻ＴＥと時刻許容誤差Ｔαとに対して「ＴＥ−Ｔα≦Ｔ≦ＴＥ＋Ｔα」の関係を満たせば、現在時刻Ｔは選択イベントを処理できる時刻である。
選択イベントを処理できる時刻である場合（ＹＥＳ）、Ｓ１２３に進む。
選択イベントを処理できない時刻である場合（ＮＯ）、Ｓ１２４に進む。
【００５６】
Ｓ１２３において、実行部１１０は、選択イベントの実行内容２３０に指定された処理を実行する。
Ｓ１２３の後、Ｓ１２０に戻る。
【００５７】
Ｓ１２４において、実行部１１０は、選択イベントをスケジュールし直すため選択イベントをスケジュール部１２０に入力する。
Ｓ１２４の後、Ｓ１２０に戻る。
【００５８】
Ｓ１２５において、実行部１１０は、バッファ（ｔ）内の全てのイベントレコード２００に対してＳ１２１〜Ｓ１２４を処理したためバッファ（ｔ）を解放する。
バッファ（ｔ）のページとバッファ（ｔ）のポインタ配列３３０とをバッファ記憶部１３０に返却し、開始時刻ｔに対応するバッファヘッダ３２９を初期化し、開始指標３１０を更新することにより、バッファ（ｔ）を解放することができる。
バッファ（ｔ）を解放することによりバッファ（ｔ）のページが空きページになり、バッファ記憶部１３０に空きページが増える。空きページは任意のバッファに割り当てられる。
【００５９】
実行部１１０は、開始時刻ｔに対応するバッファヘッダ３２９を以下のようにして初期化する。以下、開始時刻ｔに対応するバッファヘッダ３２９を「バッファヘッダ（ｔ）」という。
実行部１１０は、バッファヘッダ配列３２０内のバッファヘッダ３２９それぞれに対応する開始時刻のうち最も遅い開始時刻を最終開始時刻Ｅとして特定し、最終開始時刻Ｅに第１の単位時間ｕを加えた時刻をバッファヘッダ（ｔ）の開始時刻３２１に設定する。最終開始時刻Ｅはバッファヘッダ配列３２０の要素数Ｎと第１の単位時間ｕとを用いて「Ｅ＝ｔ＋（（Ｎ−１）×ｕ）」で表され、バッファヘッダ（ｔ）の開始時刻３２１には「ｔ＋（Ｎ×ｕ）」が設定される。
実行部１１０は、バッファヘッダ（ｔ）の最大ページ数３２２、使用ページ数３２３および空き容量３２４に「０」を設定する。
実行部１１０は、バッファヘッダ（ｔ）のポインタ配列アドレス３２５に無効アドレス（例えば「０」）を設定する。
【００６０】
実行部１１０は、開始指標３１０に「１」を加えて開始指標３１０を更新する。但し、開始指標３１０に「１」を加えた値が開始指標３１０の最大数「Ｎ−１」を超える場合、実行部１１０は開始指標３１０に「０」を設定する。「Ｎ」はバッファヘッダ配列３２０の要素数である。
【００６１】
Ｓ１２５の後、Ｓ１３０に進む。
【００６２】
Ｓ１３０〜１３５において、実行部１１０は、バッファ（ｔ）に対する処理（Ｓ１２０〜Ｓ１２５）と同様に、バケット（ｔ）を処理する。バケット（ｔ）は開始時刻ｔに対応するバケットを示す。
つまり、バケット（ｔ）に未選択イベントが残っている場合（Ｓ１３０「ＹＥＳ」）、未選択イベントを選択し（Ｓ１３１）、選択イベントを処理可能な時刻であるか否かを判定する（Ｓ１３２）。
選択イベントを処理可能な時刻であれば選択イベントを実行し（Ｓ１３３）、選択イベントを処理可能な時刻でなければ選択イベントをスケジュール部１２０に入力する（Ｓ１３４）。
バケット（ｔ）から未選択イベントが無くなった場合（Ｓ１３０「ＮＯ」）、バケット（ｔ）を解放する（例えば、ファイルを削除する）（Ｓ１３５）。
【００６３】
実行部１１０は、バケット（ｔ）を解放した後（Ｓ１３５）、Ｓ１１０に戻り次の開始時刻に対応するバッファおよびバケットを処理する。
【００６４】
図７は、実施の形態１におけるスケジュール部１２０のイベントスケジュール処理を示すフローチャートである。
実施の形態１におけるスケジュール部１２０のイベントスケジュール処理について、図７に基づいて以下に説明する。
【００６５】
まず、イベントスケジュール処理の概要について説明する。
【００６６】
イベント入力部１２１は外部または実行部１１０からイベントレコード２００を入力する（Ｓ２１０）。
格納先バッファ決定部１２２はイベントレコード２００の実行時刻および現在時刻に基づいてイベントレコード２００の格納先バッファを決定する（Ｓ２２０）。
イベント格納部１２３は格納先バッファにイベントレコード２００を記憶する空き容量が有るか否かを判定する（Ｓ２３０）。
格納先バッファに空き容量が有る場合（Ｓ２３０「ＹＥＳ」）、イベント格納部１２３はイベントレコード２００を格納先バッファに記憶する（Ｓ２７０）。
格納先バッファに空き容量が無い場合（Ｓ２３０「ＮＯ」）、イベント格納部１２３はイベントレコード２００を記憶する空きページがバッファ記憶部１３０に有るか否かを判定する（Ｓ２４０）。
バッファ記憶部１３０に空きページが有る場合（Ｓ２４０「ＹＥＳ」）、イベント格納部１２３は格納先バッファに空きページを割り当て（Ｓ２６０）、イベントレコード２００を格納先バッファに記憶する（Ｓ２７０）。
バッファ記憶部１３０に空きページが無い場合（Ｓ２４０「ＮＯ」）、イベント格納部１２３は時刻閾値とページ閾値とを初期設定し（Ｓ２５０）、開始時刻が時刻閾値以降で且つ使用ページ数がページ閾値以上であるバッファを検索する（Ｓ２５１）。
該当バッファが無い場合（Ｓ２５２「ＮＯ」）、イベント格納部１２３はページ閾値および時刻閾値を変更し（Ｓ２５６）、変更後のページ閾値および時刻閾値に対応する該当バッファを検索する（Ｓ２５１）。
該当バッファが有る場合（Ｓ２５２「ＹＥＳ」）、イベント格納部１２３は該当バッファ内のイベントレコード２００をバケット記憶部１４０に移動し（Ｓ２５３）、該当バッファ内の使用ページを解放し（Ｓ２５４）、バッファ記憶部１３０に空きページを確保できたか否かを判定する（Ｓ２５５）。
バッファ記憶部１３０に空きページを確保できた場合（Ｓ２５５「ＹＥＳ」）、イベント格納部１２３は格納先バッファに空きページを割り当て（Ｓ２６０）、イベントレコード２００を格納先バッファに記憶する（Ｓ２７０）。
まだ、バッファ記憶部１３０に空きページを確保できない場合（Ｓ２５５「ＮＯ」）、イベント格納部１２３はページ閾値および時刻閾値を変更し（Ｓ２５６）、変更後のページ閾値および時刻閾値に対応する該当バッファを検索する（Ｓ２５１）。
【００６７】
次に、イベントスケジュール処理の詳細について説明する。
【００６８】
Ｓ２１０において、イベント入力部１２１は、実行部１１０が再スケジュールのために出力したイベントレコード２００を入力する。
また、イベント入力部１２１は、新たに発生したイベントレコード２００を入力する。例えば、イベント入力部１２１は、ユーザが入力装置（キーボード、マウスなど）を用いて指定したイベントレコード２００を入力する。また例えば、特定の端末装置からネットワークを介して送信されたイベントレコード２００をスケジューリングシステム１００の通信装置が受信し、受信されたイベントレコード２００を入力する。
以下、入力したイベントレコード２００を「入力イベント」という。
Ｓ２１０の後、Ｓ２２０に進む。
【００６９】
Ｓ２２０において、格納先バッファ決定部１２２は、入力イベントを記憶するバッファを決定する。
以下、決定するバッファを「格納先バッファ」という。
格納先バッファの決定方法については後述する。
Ｓ２２０の後、Ｓ２３０に進む。
【００７０】
Ｓ２３０において、イベント格納部１２３は、格納先バッファに入力イベントを記憶する空き容量が有るか否かを判定する。格納先バッファのバッファヘッダ３２９に設定されている空き容量３２４が入力イベントのレコード長以上であれば、格納先バッファに入力イベントを記憶する空き容量が有る。また、格納先バッファにポインタ配列３３０が割り当てられていない場合（バッファヘッダ３２９のポインタ配列アドレス３２５に無効アドレスが設定されている場合）、格納先バッファに入力イベントを記憶する空き容量が無い。
格納先バッファに入力イベントを記憶する空き容量が有る場合（ＹＥＳ）、Ｓ２７０に進む。
格納先バッファに入力イベントを記憶する空き容量が無い場合（ＮＯ）、Ｓ２４０に進む。
【００７１】
Ｓ２４０において、イベント格納部１２３は、入力イベントを記憶する空きページがバッファ記憶部１３０に有るか否かを判定する。入力イベントのレコード長から格納先バッファの空き容量３２４を差し引いたサイズ分の空きページがバッファ記憶部１３０に有れば、入力イベントを記憶する空きページがバッファ記憶部１３０に有る。
入力イベントを記憶する空きページがバッファ記憶部１３０に有る場合（ＹＥＳ）、Ｓ２６０に進む。
入力イベントを記憶する空きページがバッファ記憶部１３０に無い場合（ＮＯ）、Ｓ２５０に進む。
【００７２】
Ｓ２５０において、イベント格納部１２３は、解放するバッファを特定するための時刻閾値とページ閾値とを初期設定する。
時刻閾値は近いうちにイベント実行処理（図６参照）されるバッファを除外するための閾値であり、ページ閾値は使用ページ数が少ないバッファを除外するための閾値である。
例えば、現在時刻Ｔに「ｎ×ｕ」を加えた値を時刻閾値の初期値にする。「ｎ」は正の整数であり、「ｕ」は第１の単位時間である。また、バッファヘッダ３２９に設定される最大ページ数３２２の初期値をページ閾値の初期値にする。
Ｓ２５０の後、Ｓ２５１に進む。
【００７３】
Ｓ２５１において、イベント格納部１２３は、バッファヘッダ３２９に時刻閾値以降の開始時刻３２１とページ閾値以上の使用ページ数３２３が設定されているバッファをバッファ記憶部１３０内で検索する。
例えば、イベント格納部１２３は、開始指標３１０によって特定されるバッファヘッダ３２９から開始時刻３２１の昇順または降順にバッファヘッダ配列３２０を検査し、条件に合うバッファを検索する。
以下、条件に合うバッファを「該当バッファ」という。
Ｓ２５１の後、Ｓ２５２に進む。
【００７４】
Ｓ２５２において、該当バッファが有った場合（ＹＥＳ）、Ｓ２５３に進む。
Ｓ２５２において、該当バッファが無かった場合（ＮＯ）、Ｓ２５６に進む。
【００７５】
Ｓ２５３において、イベント格納部１２３はバケット記憶部１４０内のバケットのうち該当バッファと同じ開始時刻に対応するバケットを特定する。以下、特定したバケットを「対応バケット」という。
イベント格納部１２３は、該当バッファのページに記憶されているイベントレコード２００を対応バケットの最後に追加して記憶する。例えば、イベント格納部１２３は充填済みページ３４０に記憶されている複数のイベントレコード２００をページ単位で対応バケットに記憶する。また、イベント格納部１２３は未充填ページ３５０に記憶されている１つ又は複数のイベントレコード２００をレコード単位で対応バケットに記憶する。
イベント格納部１２３は、全ての該当バッファについて上記の処理を行う。
Ｓ２５３の後、Ｓ２５４に進む。
【００７６】
Ｓ２５４において、イベント格納部１２３は、該当バッファを解放するために該当バッファのページと該当バッファのポインタ配列３３０とをバッファ記憶部１３０に返却し、該当バッファのバッファヘッダ３２９を初期化する。イベント格納部１２３は、最大ページ数３２２と使用ページ数３２３と空き容量３２４とに「０」を設定し、ポインタ配列アドレス３２５に無効アドレス（例えば「０」）を設定して該当バッファのバッファヘッダ３２９を初期化する。
イベント格納部１２３は、全ての該当バッファについて上記の処理を行う。
該当バッファを解放することにより、割り当て可能な空きページが増える。
Ｓ２５４の後、Ｓ２５５に進む。
【００７７】
Ｓ２５５において、イベント格納部１２３は、入力イベントを記憶する空きページがバッファ記憶部１３０に有るか否かをＳ２４０と同じく判定する。
入力イベントを記憶する空きページがバッファ記憶部１３０に有る場合（ＹＥＳ）、Ｓ２６０に進む。
入力イベントを記憶する空きページがバッファ記憶部１３０に無い場合（ＮＯ）、Ｓ２５６に進む。
【００７８】
Ｓ２５６において、イベント格納部１２３は、ページ閾値を小さくし、また時刻閾値を小さくする。ページ閾値と時刻閾値とのいずれかのみを変更しても構わない。
例えば、ページ閾値が「１６」である場合にイベント格納部１２３は４分の１の値「４（＝１６／４）」をページ閾値に新たに設定する。
また例えば、イベント格納部１２３はページ閾値が「０」である場合、全てのバッファを解放対象にするために現在時刻を時刻閾値に設定する。
Ｓ２５６の後、Ｓ２５１に戻る。
【００７９】
Ｓ２６０において、イベント格納部１２３は、入力イベントを記憶するための空きページを格納先バッファに以下のように割り当てる。
【００８０】
イベント格納部１２３は、格納先バッファにポインタ配列３３０が割り当てられていない場合（バッファヘッダ３２９のポインタ配列アドレス３２５が無効アドレスである場合）、格納先バッファにポインタ配列３３０を割り当てる。イベント格納部１２３は、割り当てたポインタ配列３３０のアドレスをバッファヘッダ３２９のポインタ配列アドレス３２５に設定する。
イベント格納部１２３は、格納先バッファに空きページを割り当て、割り当てた空きページのアドレスをポインタ配列３３０内の未使用の要素に設定する。ポインタ配列３３０内に未使用の要素が足りず空きページのアドレスを設定できない場合、イベント格納部１２３は最大ページ数３２２が大きいポインタ配列３３０を格納先バッファに新たに割り当てる。イベント格納部１２３は、元のポインタ配列３３０に設定されているアドレスを新たなポインタ配列３３０にコピーし、元のポインタ配列３３０をバッファ記憶部１３０に返却する。イベント格納部１２３は、バッファヘッダ３２９の最大ページ数３２２に新たなポインタ配列３３０の要素数を設定し、ポインタ配列アドレス３２５に新たなポインタ配列３３０のアドレスを設定する。ポインタ配列３３０内に未使用の要素が足りない場合とは、「最大ページ数３２２−使用ページ数３２３」が割り当てる空きページ数より小さい場合である。
イベント格納部１２３は、割り当てた空きページのページ数をバッファヘッダ３２９の使用ページ数３２３に加算する。
【００８１】
Ｓ２６０の後、Ｓ２７０に進む。
【００８２】
Ｓ２７０において、イベント格納部１２３は、入力イベントを格納先バッファの未充填ページ３５０に記憶し、バッファヘッダ３２９の空き容量３２４を更新する。
Ｓ２７０により、イベントスケジュール処理は終了する。
【００８３】
図８は、実施の形態１における格納先バッファ決定処理（Ｓ２２０）を示すフローチャートである。
実施の形態１における格納先バッファ決定処理（Ｓ２２０）（図７参照）について、図８に基づいて以下に説明する。
【００８４】
Ｓ２２１において、格納先バッファ決定部１２２は、現在時刻から入力レコードの実行時刻までの時間を算出する。
以下、算出する時間を「実行間隔」という。
Ｓ２２１の後、Ｓ２２２に進む。
【００８５】
Ｓ２２２において、格納先バッファ決定部１２２は、実行間隔に基づいて第２の単位時間を特定する。
第２の単位時間は実行間隔が短いほど短く、実行間隔が長いほど長い。
【００８６】
例えば、格納先バッファ決定部１２２は、以下の単調増加関数式により第２の単位時間ｖを算出する。「ｕ」は第１の単位時間、「ｘ」は実行間隔、「ｋ」は第２の単位時間ｖと実行間隔ｘとのおおよその比を定める値である。「Ｍａｘ（ａ，ｂ）」はａとｂとのうち大きい値を示す。「ｅｘｐ（Ｘ）」はＸの指数関数であり、「ｌｏｇ（Ｘ）」はＸの自然対数である。「［Ｘ］」はＸ以下の最大のを示す。
【００８７】
ｖ（ｘ）＝Ｍａｘ（ｕ，［ｋ・ｅｘｐ（［ｌｏｇ（ｘ）］）／ｕ］・ｕ）
【００８８】
図９は、実施の形態１における実行間隔ｘと第２の単位時間ｖとの関係を表したグラフの一例を示す図である。
上記の式において「ｋ＝１／１２」、「ｕ＝６０［秒］」とした場合、実行間隔ｘと第２の単位時間ｖとは図９に示すような関係になる。
実行間隔ｘが「約５０分（３０００秒）」までは第２の単位時間は第１の単位時間ｕ（＝６０秒）と同じであるが、実行間隔が「１時間」「１日」「１年」と長くなるにつれて第２の単位時間は「４分」「１時間２３分」「２３．３日」と長くなる。
【００８９】
但し、格納先バッファ決定部１２２は、上記以外の式や実行間隔と第２の単位時間とを対応付けた対応表などに基づいて第２の単位時間を特定しても構わない。
【００９０】
図８に戻り、格納先バッファ決定処理（Ｓ２２０）の説明を続ける。
【００９１】
Ｓ２２２の後、Ｓ２２３に進む。
【００９２】
Ｓ２２３において、格納先バッファ決定部１２２は、入力イベントの実行時刻２１０を第２の単位時間を単位とする時刻に変換し、変換して得られた時刻を格納先バッファの開始時刻として特定する。
【００９３】
例えば、入力イベントの実行時刻２１０が「２０１０年１月２８日１６時３５分３０秒」であり、第２の単位時間が「１分」である場合、実行時刻２１０の「１分」未満の時刻「３０秒」を切り捨てて「２０１０年１月２８日１６時３５分００秒」を格納先バッファの開始時刻とする。
また、第２の単位時間が「４分」である場合、実行時刻２１０の「４分」未満の時刻「３分３０秒」を切り捨てて「２０１０年１月２８日１６時３２分００秒」を格納先バッファの開始時刻とする。
また、第２の単位時間が「１時間」であれば「２０１０年１月２８日１６時００分００秒」、第２の単位時間が「１日」であれば「２０１０年１月２８日００時００分００秒」、第２の単位時間が「１月」であれば「２０１０年１月１日００時００分００秒」を格納先バッファの開始時刻とする。
【００９４】
Ｓ２２３により、格納先バッファ決定処理（Ｓ２２０）は終了する。
【００９５】
図１０は、実施の形態１におけるスケジューリングシステム１００のハードウェア資源の一例を示す図である。
図１０において、スケジューリングシステム１００は、ＣＰＵ９１１（Ｃｅｎｔｒａｌ・Ｐｒｏｃｅｓｓｉｎｇ・Ｕｎｉｔ）（マイクロプロセッサ、マイクロコンピュータともいう）を備えている。ＣＰＵ９１１は、バス９１２を介してＲＯＭ９１３、ＲＡＭ９１４、通信ボード９１５、表示装置９０１、キーボード９０２、マウス９０３、ドライブ装置９０４、磁気ディスク装置９２０と接続され、これらのハードウェアデバイスを制御する。ドライブ装置９０４は、ＦＤ（Ｆｌｅｘｉｂｌｅ・Ｄｉｓｋ・Ｄｒｉｖｅ）、ＣＤ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ）、ＤＶＤ（Ｄｉｇｉｔａｌ・Ｖｅｒｓａｔｉｌｅ・Ｄｉｓｃ）などの記憶媒体を読み書きする装置である。
【００９６】
通信ボード９１５は、有線または無線で、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネット、電話回線などの通信網に接続している。
【００９７】
磁気ディスク装置９２０には、ＯＳ９２１（オペレーティングシステム）、ウィンドウシステム９２２、プログラム群９２３、ファイル群９２４が記憶されている。
【００９８】
プログラム群９２３には、実施の形態において「〜部」として説明する機能を実行するプログラムが含まれる。プログラムは、ＣＰＵ９１１により読み出され実行される。すなわち、プログラムは、「〜部」としてコンピュータを機能させるものであり、また「〜部」の手順や方法をコンピュータに実行させるものである。
【００９９】
ファイル群９２４には、実施の形態において説明する「〜部」で使用される各種データ（入力、出力、判定結果、計算結果、処理結果など）が含まれる。
【０１００】
実施の形態において構成図およびフローチャートに含まれている矢印は主としてデータや信号の入出力を示す。
【０１０１】
実施の形態において「〜部」として説明するものは「〜回路」、「〜装置」、「〜機器」であってもよく、また「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明するものは、ファームウェア、ソフトウェア、ハードウェアまたはこれらの組み合わせのいずれで実装されても構わない。
【０１０２】
実施の形態１において、バッファ内でイベントレコード２００の格納領域を固定長のページを単位として拡張するので、バッファごとの要求に応じてバッファ記憶部１３０を効率良く使用することができる。また、各バッファの格納領域（複数のページ）は物理的に連続している必要はないため、領域の拡張の際に既存領域の内容を新たな領域にコピーする処理は発生しない。
【０１０３】
第２の単位時間ｖは、実行時刻と現在時刻との差（実行間隔）の単調増加関数に基づいて設定する。その理由は、動的に発生するイベントにおいては、その実行時刻よりも実行間隔が重要であることが多く、実行間隔に対する相対誤差を一定とすると実行間隔が大きいほど大きな単位時間を用いることが許容されると考えられるためである。つまり、実行時刻２１０が遅いイベントレコード２００ほど大きな時刻許容誤差２２０が設定されると考えられるためである。
【０１０４】
実行間隔ｘに対して単調増加する第２の単位時間ｖを用いると、開始時刻の取り得る値の種類を大幅に減少させることができる。例えば、最大スケジュール期間Ｄを「１年」、第１の単位時間ｕを「６０秒」とすると、第１の単位時間ｕを単位とする開始時刻の数は１年を６０秒で割って５２５，６００個である。しかし、図９のように第２の単位時間ｖを用いると、開始時刻の数は２３５個に減少する。これに伴ってバッファ数も減少するのでバッファ当たりの割り当て可能なページ数が増加する。そして、バッファからバケットへのイベントレコード２００の書き込みを大きな単位で行うことが可能になる。
例えば、バッファのページにイベントレコード２００が一つしか記憶されていなければレコード単位でバケットに書き込みを行うことになるが、バッファのページに多くのイベントレコード２００が記憶されていればページ単位でバケットに書き込みを行うことができる。バケット記憶部１４０は磁気ディスク装置によって実装されることが想定されるため、書き込みの単位を大きくすることでランダムアクセスの発生が抑制され、磁気ディスク装置の性能低下の防止につながる。小さい単位で多くの書き込みを行うと磁気ディスク装置の性能が低下することが知られている。
【０１０５】
第２の単位時間ｖの整数倍に丸めた（切り捨てた）開始時刻は、第１の単位時間ｕの整数倍に丸めた開始時刻より小さくなる。すなわち、バケット内にはより大きな実行時刻を持つイベントレコード２００が格納されることになる。その結果、図６のステップＳ１３２の条件が不成立になり、ステップＳ１３４における再スケジュールが実行される可能性が生じる。この場合、バケット記憶部１４０のバケットから当該イベントレコード２００を読み出すのに要した時間が無駄になり、読み出しの効率低下につながる。このように、第２の単位時間ｖの導入はバケット記憶部１４０に対する書き込みと読み出しとで反対の効果を持つが、読み出しに対する効率低下の影響は実質的に問題にならないと考えられる。なぜなら、バッファやバケットの開始時刻が固定されているため、適用される第２の単位時間ｖの値（実行時刻のばらつき）が現在時刻の経過と共に減少するからである。また、第２の単位時間ｖが大きいという条件下では上記のように実行時刻に対する許容誤差も大きいと考えられ、イベントレコード２００の時刻許容誤差２２０が大きな値を持ち、ステップＳ１３２の条件が不成立になる割合が小さいと言える。
【０１０６】
ステップＳ２２０は、イベントレコード２００をバケットに書き込むまで一時的に格納するバッファを実行時刻と現在時刻との差に応じて増加する第２の単位時間ｖを用いて最大スケジュール期間Ｄを不均等に分割した時刻に対応させる。これにより、バッファの細分化によるバッファ記憶部１３０の利用効率の低下を防ぎ、スケジューリング精度を向上するためにより小さな第１の単位時間ｕを使用することが可能になる。
また、ステップＳ２４０は、バッファの個別の容量ではなく、バッファ記憶部１３０の全体の空き容量に応じてバケットへの書き込みを起動する。これにより、イベントレコード２００の実行時刻の分布によらず、バッファ記憶部１３０を有効に利用することができる。
また、ステップＳ２５１は十分なページ数を持つバッファのみを書き込み対象とするので、バケット記憶部１４０に対して小さな単位で書き込みを行うことを可能な限り避け、書き込み速度の低下を抑制することができる。
また、ステップＳ２５１は、現在時刻からｎ単位時間以内の開始時刻を持つバッファを書き込み対象外とするので、短時間の内に処理されるイベントレコード２００をバケットへ書き込んでバケットから読み出すということを回避し、処理時間を短縮することができる。
また、ステップＳ１２４およびステップＳ１３４は時刻許容誤差を満たさないイベントレコード２００を再スケジュールするので、大きな実行間隔を持つイベントレコード２００を高い時間精度で実行することが可能である。
【０１０７】
イベント実行処理（図６参照）において、実行時刻２１０から時刻許容誤差２２０の期間内の時刻ではなく実行時刻２１０から所定の許容時間内の時刻をイベントレコード２００の処理可能な時刻としても構わない（Ｓ１２２）。
また、実行部１１０は、処理可能な時刻であるか否かの判定（Ｓ１２２）を行わずに選択イベントの処理を実行しても構わない（Ｓ１２３）。つまり、イベントレコード２００は現在時刻Ｔ、実行時刻２１０および時刻許容誤差２２０に関わらず開始時刻に処理されても構わない。
【０１０８】
イベントスケジュール処理（図７参照）において、ページ閾値と時刻閾値とのいずれかに基づいて該当バッファの条件を定めてもよい（Ｓ２５１）。つまり、開始時刻３２１に関わらず使用ページ数３２３がページ閾値以上であるバッファを該当バッファとしてもよい。また、使用ページ数３２３に関わらず開始時刻３２１が時刻閾値以降であるバッファを該当バッファとしてもよい。
【０１０９】
実施の形態１において、例えば、以下のようなスケジューリングシステム１００について説明した。
【０１１０】
スケジューリングシステム１００は、処理部（実行部１１０）、第１の記憶部（バケット記憶部１４０）、第２の記憶部（バッファ記憶部１３０）およびスケジューリング部（スケジュール部１２０）を備える。
処理部は、実行時刻と実行内容とを記述したイベントレコードに従って処理を実行する。
第１の記憶部は、実行時刻を第１の単位時間の整数倍で表した値である第１の開始時刻に基づいて複数の領域（バケット）に分けてイベントレコードを記憶する。
第２の記憶部は、実行時刻と現在時刻との差（実行間隔）の大きさに応じて変化する第２の単位時間の整数倍で実行時刻を表した値である第２の開始時刻に基づいて複数の領域（バッファ）に分けてイベントレコードを記憶する。
スケジューリング部は、イベントレコードを第２の記憶部の領域の１つに一時的に記憶させた後に、当該第２の記憶部の領域の第２の開始時刻と一致する第１の開始時刻を持つ第１の記憶部の領域に記憶させる。
【０１１１】
第２の単位時間は、実行時刻と現在時刻との差の単調増加関数に従う。
【０１１２】
スケジューリング部は、イベントレコードを記憶させるのに十分な容量が第２の記憶部に存在しない場合に以下の処理をする。
スケジューリング部は、第２の記憶部の各領域に記憶されたイベントレコードを第２の開始時刻の順に第２の記憶部の領域の第２の開始時刻と一致する第１の開始時刻を持つ第１の記憶部の領域に書き込む。
スケジューリング部は、当該第２の記憶部の領域を空にする。
【０１１３】
スケジューリング部は、第２の記憶部にイベントレコードを記憶させるのに十分な容量が存在しない場合に以下の処理をする。
スケジューリング部は、第２の記憶部の各領域のうちイベントレコードを記憶している容量が所定の値以上である領域に記憶されたイベントレコードを、第２の開始時刻の順に、第２の記憶部の領域の第２の開始時刻と一致する第１の開始時刻を持つ第１の記憶部の領域に書き込む。
スケジューリング部は、当該第２の記憶部の領域を空にする。
なおもイベントレコードを記憶させるのに十分な容量が第２の記憶部に存在しない場合にのみ、スケジューリング部は以下の処理をする。
スケジューリング部は、第２の記憶部の各領域のうちイベントレコードを記憶している容量が所定の値に満たない領域に記憶されたイベントレコードを、第２の開始時刻の順に、第２の記憶部の領域の第２の開始時刻と一致する第１の開始時刻を持つ第１の記憶部の領域に書き込む。
スケジューリング部は、当該第２の記憶部の領域を空にする。
【０１１４】
スケジューリング部は、イベントレコードを記憶させるのに十分な容量が第２の記憶部に存在しない場合に以下の処理をする。
スケジューリング部は、第２の記憶部の各領域のうち現在時刻との差が所定の値を超える第２の開始時刻を持つ領域に記憶されたイベントレコードを、第２の開始時刻の順に、第２の記憶部の領域の第２の開始時刻と一致する第１の開始時刻を持つ第１の記憶部の領域に書き込む。
スケジューリング部は、当該第２の記憶部の領域を空にする。
なおもイベントレコードを記憶させるのに十分な容量が第２の記憶部に存在しない場合にのみ、スケジューリング部は以下の処理をする。
スケジューリング部は、第２の記憶部の各領域のうち現在時刻との差が所定の値に満たない第２の開始時刻を持つ領域に記憶されたイベントレコードを、第２の開始時刻の順に、第２の記憶部の領域の第２の開始時刻と一致する第１の開始時刻を持つ第１の記憶部の領域に書き込む。
スケジューリング部は、当該第２の記憶部の領域を空にする。
【０１１５】
処理部は、現在時刻に対応する第１の開始時刻を持つ第１の記憶部の領域からイベントレコードを読み出し、読み出したイベントレコードの実行時刻に関わらず当該イベントレコードの処理を実行する。
【０１１６】
処理部は、現在時刻に対応する第１の開始時刻を持つ第１の記憶部の領域からイベントレコードを読み出す。
処理部は、読み出したイベントレコードの実行時刻が現在時刻より１単位時間以上大きい場合、当該イベントレコードの処理を実行しない。
スケジューリング部は、当該イベントレコードを第２の記憶部の領域の１つに一時的に記憶させた後に、当該第２の記憶部の領域の第２の開始時刻と一致する前記第１の開始時刻を持つ第１の記憶部の領域に当該イベントレコードを記憶する。
【０１１７】
イベントレコードは時刻許容誤差の値を含む。
処理部は、現在時刻に対応する第１の開始時刻を持つ第１の記憶部の領域からイベントレコードを読み出す。
処理部は、読み出したイベントレコードの実行時刻と現在時刻との差が時刻許容誤差を超えている場合、当該イベントレコードの処理を実行しない。
スケジューリング部は、当該イベントレコードを第２の記憶部の領域の１つに一時的に記憶させた後に、当該第２の記憶部の領域の第２の開始時刻と一致する第１の開始時刻を持つ第１の記憶部の領域に当該イベントレコードを記憶する。
【０１１８】
処理部は、現在時刻に対応する第２の開始時刻を持つ第２の記憶部の領域からイベントレコードを読み出し、読み出したイベントレコードの実行時刻に関わらず当該イベントレコードの処理を実行する。
処理部は、第２の記憶部の領域からイベントレコードを全て読み出した後に、現在時刻に対応する第１の開始時刻を持つ第１の記憶部の領域からイベントレコードを読み出し、読み出したイベントレコードの実行時刻に関わらず当該イベントレコードの処理を実行する。
【０１１９】
処理部は、現在時刻に対応する第２の開始時刻を持つ第２の記憶部の領域からイベントレコードを読み出す。
処理部は、読み出したイベントレコードの実行時刻が現在時刻より１単位時間以上大きい場合、当該イベントレコードの処理を実行せず、スケジューリング部に当該イベントレコードを第２の記憶部の領域の１つに記憶させる。
処理部は、第２の記憶部の領域からイベントレコードを全て読み出した後に、現在時刻に対応する第１の開始時刻を持つ第１の記憶部の領域からイベントレコードを読み出す。
処理部は、読み出したイベントレコードの実行時刻が現在時刻より１単位時間以上大きい場合に当該イベントレコードの処理を実行せず、スケジューリング部に当該イベントレコードを第２の記憶部の領域の１つに記憶させる。
【０１２０】
イベントレコードは時刻許容誤差の値を含む。
処理部は、現在時刻に対応する第２の開始時刻を持つ第２の記憶部の領域からイベントレコードを読み出す。
処理部は、読み出したイベントレコードの実行時刻と現在時刻との差が時刻許容誤差を超えている場合に当該イベントレコードの処理を実行せず、スケジューリング部に当該イベントレコードを第２の記憶部の領域の１つに記憶させる。
処理部は、第２の記憶部の領域からイベントレコードを全て読み出した後に、現在時刻に対応する第１の開始時刻を持つ第１の記憶部の領域からイベントレコードを読み出す。
処理部は、読み出したイベントレコードの実行時刻と現在時刻との差が時刻許容誤差を超えている場合に当該イベントレコードの処理を実行せず、スケジューリング部に当該イベントレコードを第２の記憶部の領域の１つに記憶させる。
【０１２１】
スケジューリングシステム１００は、現在時刻と実行時刻との差に対応して書き込みバッファの時間分解能を変化させることで、タイムスロット数を削減せずに書き込みバッファ数のみを削減し、少ないハードウェアリソースで大量イベントを効率的に処理することを可能にする。
【０１２２】
実施の形態２．
木構造でバッファ群３００を管理する形態について説明する。
また、バッファ数が所定数を超えている場合、特定バッファに記憶されているイベントレコード２００をバケット記憶部１４０に移動し、特定バッファを解放する形態について説明する。
【０１２３】
図１１は、実施の形態２におけるスケジューリングシステム１００の機能構成図である。
実施の形態２におけるスケジューリングシステム１００の機能構成について、図１１に基づいて以下に説明する。
【０１２４】
スケジュール部１２０は、実施の形態１の構成（図１参照）に加えて、バッファヘッダ数制限部１２４を備える。
【０１２５】
バッファヘッダ数制限部１２４（記憶領域数制限部の一例）は、バッファ記憶部１３０に確保されている記憶領域の数が所定数を超えている場合、バッファ記憶部１３０に確保されている記憶領域のうち少なくともいずれかの記憶領域を解放領域として特定する。バッファヘッダ数制限部１２４は、特定した解放領域に記憶されているイベントレコード２００を解放領域の開始判定時刻に対応付けてバケット記憶部１４０に記憶し、バッファ記憶部１３０の解放領域を解放する。
【０１２６】
スケジューリングシステム１００のその他の構成は実施の形態１と同じである。
但し、バケット記憶部１４０はバッファ群３００を木構造で管理する。
【０１２７】
図１２は、実施の形態２におけるバッファ群３００のデータ構造を示す図である。
図１３は、実施の形態２におけるバッファヘッダ３７０のフォーマットを示す図である。
実施の形態２におけるバッファ群３００のデータ構造について、図１２および図１３に基づいて以下に説明する。
【０１２８】
図１２に示すように、バッファ群３００は、実施の形態１で説明した配列構造（図４参照）ではなく、木構造で管理される。
バッファヘッダ木３１１は、木構造の根の部分に位置するバッファヘッダ３２９ａのアドレスを示す。
【０１２９】
図１３に示すように、バッファヘッダ３２９には開始時刻３２１、最大ページ数３２２、使用ページ数３２３、空き容量３２４、左子ノードアドレス３２６、右子ノードアドレス３２７およびポインタ配列アドレス３２５が設定される。
開始時刻３２１〜ポインタ配列アドレス３２５は実施の形態１（図５参照）と同じである。
左子ノードアドレス３２６と右子ノードアドレス３２７とはそれぞれ他のバッファヘッダ３２９のアドレスを示す。
【０１３０】
図１２において、バッファヘッダ３２９ａ〜ｇの位置は開始時刻３２１に応じて定まる。
例えば、バッファヘッダ３２９ａの右子ノードアドレス３２７に関連付けられたバッファヘッダ３２９ｂはバッファヘッダ３２９ａより後の開始時刻３２１を示す。また、バッファヘッダ３２９ａの左子ノードアドレス３２６に関連付けられたバッファヘッダ３２９ｅはバッファヘッダ３２９ａより前の開始時刻３２１を示す。つまり、バッファヘッダ３２９ａの開始時刻３２１はバッファヘッダ３２９ｂより早い時刻であってバッファヘッダ３２９ｅより遅い時刻である。同様に、バッファヘッダ３２９ｂの開始時刻３２１はバッファヘッダ３２９ｃより早い時刻であってバッファヘッダ３２９ｄより遅い時刻である。
【０１３１】
このような木構造は赤黒木、二色木または二分木などと呼ばれる。
木構造の基本操作は公知技術であるため、バッファヘッダ３２９の挿入や削除など木構造の基本操作については説明を省略する。例えば、木構造の基本操作については非特許文献２に開示されている。
【０１３２】
図１４は、実施の形態２におけるスケジュール部１２０のイベントスケジュール処理を示すフローチャートである。
実施の形態２におけるスケジュール部１２０のイベントスケジュール処理について、図１４に基づいて以下に説明する。
【０１３３】
実施の形態２におけるイベントスケジュール処理では、実施の形態１で説明した処理（図７参照）に加えて、バッファヘッダ数制限処理（Ｓ２８０）を実行する。
バッファヘッダ数制限処理（Ｓ２８０）において、バッファヘッダ数制限部１２４は、バッファヘッダ数が多い場合に特定バッファ内のイベントレコード２００をバケット記憶部１４０に移動し、特定バッファを解放する。
以下に、バッファヘッダ数制限処理（Ｓ２８０）の詳細について説明する。
【０１３４】
図１５は、実施の形態２におけるバッファヘッダ数制限処理（Ｓ２８０）を示すフローチャートである。
実施の形態２におけるバッファヘッダ数制限処理（Ｓ２８０）について、図１５に基づいて以下に説明する。
【０１３５】
Ｓ１２８ａにおいて、バッファヘッダ数制限部１２４は、木構造内に格納先バッファのバッファヘッダ３２９が有るか否かを判定する。
格納先バッファのバッファヘッダ３２９が有る場合（ＹＥＳ）、Ｓ２８２に進む。
格納先バッファのバッファヘッダ３２９が無い場合（ＮＯ）、Ｓ２８１ｂに進む。
【０１３６】
Ｓ２８１ｂにおいて、バッファヘッダ数制限部１２４は、格納先バッファのバッファヘッダ３２９を生成し、格納先バッファの開始時刻に基づいて木構造内でのバッファヘッダ３２９の挿入位置を決定し、決定した位置にバッファヘッダ３２９を挿入する。そして、バッファヘッダ数制限部１２４は、バッファヘッダ３２９の各項目を設定する。
Ｓ２８１ｂの後、Ｓ２８２に進む。
【０１３７】
Ｓ２８２において、バッファヘッダ数制限部１２４は、木構造内のバッファヘッダ数を所定のヘッダ数閾値と大小比較する。
バッファヘッダ数がヘッダ数閾値より大きい場合（ＹＥＳ）、Ｓ２８３に進む。
バッファヘッダ数がヘッダ数閾値以下の場合（ＮＯ）、バッファヘッダ数制限処理（Ｓ２８０）は終了する。
【０１３８】
Ｓ２８３〜Ｓ２８９において、バッファヘッダ数制限部１２４は、イベントスケジュール処理（図７、図１４参照）のＳ２５０〜Ｓ２５６と同様に、開始時刻が時刻閾値以降で且つ使用ページ数がページ閾値以上である該当バッファを解放する。
但し、バッファヘッダ数制限部１２４は、該当バッファを解放したことによりバッファヘッダ数がヘッダ数閾値以下になった場合にバッファヘッダ数制限処理（Ｓ２８０）を終了する。
【０１３９】
バッファヘッダ数制限部１２４は該当バッファを以下のように解放する。
バッファヘッダ数制限部１２４は開始時刻が時刻閾値以降で且つ使用ページ数がページ閾値以上である該当バッファを検索する（Ｓ２８５）。
バッファヘッダ数制限部１２４は該当バッファに記憶されているイベントレコード２００を該当バッファと同じ開始時刻３２１に対応するバケットに記憶する（Ｓ２８６）。バッファヘッダ数制限部１２４は該当バッファをバッファ記憶部１３０に返却し、該当バッファのバッファヘッダ３２９を木構造から削除する（Ｓ２８７）。
【０１４０】
実施の形態２によれば、任意個のバッファヘッダ３２９を木構造として保持するので、不要なバッファヘッダ３２９に記憶領域を割り当てる必要がなくなり、バッファ記憶部１３０をより効率的に使用できる。
また、ステップＳ２８２はバッファヘッダ数に上限を設けるので、多数で小容量のバッファが長期間存続してバッファ記憶部１３０の空き領域が減少してしまうことを避け、性能低下を防ぐことができる。
【０１４１】
実施の形態１のイベントスケジュール処理（図７参照）において、実施の形態２と同様に格納先バッファに空き容量が有るか否か（Ｓ２３０）およびバッファ記憶部１３０に空きページが有るか否か（Ｓ２４０）に関わらず、特定のバッファを解放してもよい。
例えば、バッファ群全体の使用ページ数が所定のページ数を超えている場合に時刻閾値とページ閾値との条件を満たすバッファを解放してもよい。
また、バッファ群全体のバッファ数（ポインタ配列３３０の数、バッファヘッダ配列３２０に設定されているポインタ配列アドレス３２５の数）が所定のバッファ数を超えている場合に時刻閾値とページ閾値との条件を満たすバッファを解放してもよい。
【０１４２】
実施の形態２において、例えば、以下のようなスケジューリングシステム１００について説明した。
スケジューリング部（スケジュール部１２０）は、少なくとも１つのイベントレコード２００が記憶されたバッファ記憶部１３０の領域（バッファ）の数が所定の値を超える場合に、イベントレコード２００を記憶させるのに十分な容量がバッファ記憶部１３０に存在しない場合と同様の処理を行う。
【符号の説明】
【０１４３】
１００  スケジューリングシステム、１１０  実行部、１２０  スケジュール部、１２１  イベント入力部、１２２  格納先バッファ決定部、１２３  イベント格納部、１２４  バッファヘッダ数制限部、１３０  バッファ記憶部、１４０  バケット記憶部、２００  イベントレコード、２１０  実行時刻、２２０  時刻許容誤差、２３０  実行内容、３００  バッファ群、３１０  開始指標、３１１  バッファヘッダ木、３２０  バッファヘッダ配列、３２１  開始時刻、３２２  最大ページ数、３２３  使用ページ数、３２４  空き容量、３２５  ポインタ配列アドレス、３２６  左子ノードアドレス、３２７  右子ノードアドレス、３２９  バッファヘッダ、３３０  ポインタ配列、３４０  充填済みページ、３５０  未充填ページ、３９９  バッファ、９０１  表示装置、９０２  キーボード、９０３  マウス、９０４  ドライブ装置、９１１  ＣＰＵ、９１２  バス、９１３  ＲＯＭ、９１４  ＲＡＭ、９１５  通信ボード、９２０  磁気ディスク装置、９２１  ＯＳ、９２２  ウィンドウシステム、９２３  プログラム群、９２４  ファイル群。
【図１】
0005465067.tif 000002
【図２】
0005465067.tif 000003
【図３】
0005465067.tif 000004
【図４】
0005465067.tif 000005
【図５】
0005465067.tif 000006
【図６】
0005465067.tif 000007
【図７】
0005465067.tif 000008
【図８】
0005465067.tif 000009
【図９】
0005465067.tif 000010
【図１０】
0005465067.tif 000011
【図１１】
0005465067.tif 000012
【図１２】
0005465067.tif 000013
【図１３】
0005465067.tif 000014
【図１４】
0005465067.tif 000015
【図１５】
0005465067.tif 000016