(57)【特許請求の範囲】
【請求項１】
あるプロセスによる処理結果であるデータを他のプロセスが引き継いで処理することにより一連の処理が行われる計算機システムにおいて、
処理結果であるデータを出力する第１のプロセス及び該出力プロセスが出力したデータを引き継いで処理を行なう複数の第２のプロセスのいずれからもアクセス可能なバッファと、
前記第１のプロセスから発行された出力命令に応じて、当該出力命令により指定されるデータを、前記バッファをラップアラウンドに用いて順次書き込む手段と、
前記第２のプロセスの各々から発行された入力命令に応じて、前記バッファに書き込まれたデータを読み出し、前記第１のプロセスからの出力順に前記入力命令を発行した第２のプロセスに読み込ませる手段と、
前記書き込み手段がデータを書き込もうとする前記バッファの領域に、前記第２のプロセスのいずれかが読み込みを行なっていないデータが保持されている場合に、前記第１のプロセスを待ち状態にする第１の待合せ設定手段と、
前記読み込ませる手段がデータを読み込もうとする前記バッファの領域に、前記書き込む手段により書き込まれたデータが存在しない場合に、前記第２のプロセスを待ち状態にする第２の待合せ設定手段と、
前記第１のプロセスが待ち状態か否か判定し、前記第１のプロセスが待ち状態にあると判断したときに、前記第２のプロセスによるデータの読み込み状況を調べ、前記読み込み状況が予め定められた状態となったときに前記第１のプロセスの待ち状態を解除する第１の待合せ解除手段と、
前記第２のプロセスの各々について待ち状態か否か判定し、待ち状態にある第２のプロセス存在すると判断したときに、前記第１のプロセスによるデータの書き込み状況を調べ、前記書き込み状況が予め定められた状態となったときに前記第２のプロセスの待ち状態を解除する第２の待合せ解除手段とを有することを特徴とする計算機システム。
【請求項２】
請求項１記載の計算機システムにおいて、前記第一のプロセスが発行した出力命令に応じて、前記バッファに書き込まれたデータを、前記バッファに書き込まれた順にしたがって、外部記憶装置に出力する手段を有することを特徴とする計算機システム。
【請求項３】
請求項１記載の計算機システムにおいて、前記複数の第二のプロセスの中の少なくとも一つのプロセスは、前記バッファに書き込まれた順序に従って、前記バッファに書き込まれたデータを外部記憶装置に出力する処理を実行するプロセスであることを特徴とする計算機システム。
【請求項４】
請求項１記載の計算機システムにおいて、前記第１のプロセスで実行されるプログラムと、前記複数の第２のプロセスの各々で実行されるプログラムと、前記第１のプロセスと前記第２のプロセスとの間で受け渡すデータの識別子とが、ジョブ制御文で指定されることを特徴とする計算機システム。
【請求項５】
請求項１記載の計算機システムにおいて、前記第１のプロセスで実行されるプログラムと、前記複数の第２のプロセスで実行されるプログラムと、前記第１のプロセスと前記第２のプロセスとの間で受け渡されるデータの識別子と、前記データが出力される外部記憶装置の識別子とが、ジョブ制御文で指定されることを特徴とする計算機システム。
【請求項６】
あるプロセスによる処理結果であるデータを他のプロセスが引き継いで処理することにより一連の処理が行われる計算機システムにおけるデータ引継ぎ方法において、
処理結果であるデータを出力する第１のプロセス及び該出力プロセスが出力したデータを引き継いで処理を行なう複数の第２のプロセスのいずれからもアクセス可能なバッファを設け、
前記第１のプロセスから発行された出力命令に応じて、当該出力命令により指定されるデータを、前記バッファをラップアラウンドに用いて順次書き込み、
前記第２のプロセスの各々から発行された入力命令に応じて、前記バッファに書き込まれたデータを読み出し、前記第１のプロセスからの出力順に前記入力命令を発行した第２のプロセスに読み込ませ、
前記第１のプロセスがデータを書き込もうとする前記バッファの領域に、前記第２のプロセスのいずれかが読み込みを行なっていないデータが保持されている場合に、前記第１のプロセスを待ち状態にし、
前記複数の第２のプロセスがデータを読み込もうとする前記バッファの領域に、前記第１のプロセスにより書き込まれたデータが存在しない場合に、前記第２のプロセスを待ち状態にし、
前記第１のプロセスが待ち状態か否か判定し、前記第１のプロセスが待ち状態にあると判断したときに、前記第２のプロセスによるデータの読み込み状況を調べ、前記読み込み状況が予め定められた状態となったときに前記第１のプロセスの待ち状態を解除し、
前記第２のプロセスの各々について待ち状態か否か判定し、待ち状態にある第２のプロセス存在すると判断したときに、前記第１のプロセスによるデータの書き込み状況を調べ、前記書き込み状況が予め定められた状態となったときに前記第２のプロセスの待ち状態を解除することを特徴とする計算機システムにおけるデータ転送方法。
【請求項７】
請求項６記載のデータ転送方法において、前記第一のプロセスが発行した出力命令に応じて、前記バッファに書き込まれたデータを、前記バッファに書き込まれた順にしたがって、外部記憶装置に出力することを特徴とするデータ転送方法。
【請求項８】
請求項６記載のデータ転送方法において、前記複数の第二のプロセスの中の少なくとも一つのプロセスは、前記バッファに書き込まれた順序に従って、前記バッファに書き込まれたデータを外部記憶装置に出力する処理を実行するプロセスであることを特徴とするデータ転送方法。
【請求項９】
請求項６記載の計算機システムにおいて、前記第１のプロセスで実行されるプログラムと、前記複数の第２のプロセスの各々で実行されるプログラムと、前記第１のプロセスと前記第２のプロセスとの間で受け渡すデータの識別子とが、ジョブ制御文で指定されることを特徴とするデータ転送方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、計算機システムにおける複数のプロセスからなる一連の処理の中で行われるプロセス間でのデータ引き継ぎ制御方法に係り、特に、１つのプロセスでの処理の実行結果が複数のプロセスにより引き継がれる場合に用いて好適なプロセス間でのデータ引き継ぎ制御方法に関する。
【０００２】
【従来の技術】
計算機システムにおけるバッチ処理等は、複数のジョブ、あるいはプロセスが、それぞれ他のジョブあるいはプロセスでの処理の結果として得られるデータを引き継ぎながら処理を進めることにより実現される。従来、このような処理において、プロセス間でのデータの引き継ぎは次のように行われていた。即ち、各プロセスは、実行した処理の結果として得られたデータを、一旦、磁気ディスク、磁気テープ等の外部記憶装置に出力する。他のプロセスでの処理の実行結果のデータを使用するプロセスは、実行結果を利用しようとする他のプロセスの処理が終了した後、外部記憶装置に出力された実行結果のデータを入力して処理を行なっていた。つまり、従来、プロセス間でのデータの受渡しは、外部記憶装置を介してファイル単位で行われ、またこのため、処理結果のデータを引き渡すプロセスと、処理結果のデータを引き継ぐプロセスとは、逐次的に実行されていた。
【０００３】
このような従来技術に対し、例えば、特開平２−１２０９２４号公報、あるいは、特開平３−４６０３３号公報には、データの引継ぎを行なう複数のプロセスを並行して実行することにより、トータルとしての処理時間を短縮することが可能なデータの引継ぎ方法が開示されている。即ち、これら公報により開示される技術では、プロセス間でデータを受け渡す際、特に、受け渡すデータを保存する必要がない場合に、プロセス間でのデータの引き継ぎを外部記憶を介さずに主記憶内に設けたバッファを介して行なう。また、データの引継ぎをファイル単位ではなく、ファイルを構成するデータの単位であるレコード単位で行ない、書き込みプロセスと読み込みプロセスが同時に同一のファイルへアクセスすることを許している。これによりデータを引き渡す側のプロセスが、すべてのデータをファイルに出力するまでデータを引き継ぐ側のプロセスの実行を待たせる必要がなくなり、データの引き継ぎを行なう複数のプロセスを並行に実行することが可能となる。
【０００４】
【発明が解決しようとする課題】
上述した２つの公報に開示された技術は、プロセス間でのデータの引継ぎを主記憶内に設けたバッファを介して行なっている。一般に、計算機システムの主記憶は、外部記憶装置と比べて高速にデータを転送することができる。従って、上述した技術によればデータの引き継ぎ処理を高速化することができる。しかし、１つの計算機システムで扱うことのできる主記憶の容量には限度がある。このため、プロセス間で受渡しが行われる中間データが大量に存在する場合には、このような大容量の中間データをすべて主記憶内に置くことは事実上不可能である。特開平３−４６０３３号公報には、この問題を解決するために、データの引継ぎに用いるバッファをラップアラウンドに使用することが開示されている。バッファをラップアラウンドに使用する場合、これら従来技術によれば、データを引き継ぐ側のプロセス（以下、入力プロセスという）がバッファから取り込む単位時間当たりのデータ量と、データを引き渡す側のプロセス（以下、出力プロセスという）がバッファに書き込む単位時間当たりのデータ量との間に差があると、処理の待合せが行われる。例えば、入力プロセスが単位時間に読み込むデータの量より出力プロセスが単位時間にバッファに書き込むデータの量の方が大きい場合、出力プロセスによるデータの出力処理が入力プロセスのデータの入力処理に追い着くと、出力プロセスによりデータを書き込むバッファがなくなるため、出力プロセスは待ち状態に設定される。そして、出力プロセスの待ち状態は、入力プロセスによるデータの入力処理が出力プロセスの出力処理に追い着くまで保たれ、入力プロセスによる入力処理が追い着いた時点で解除される。同一の出力プロセスに対して複数の入力プロセスが存在する場合には、それぞれのプロセスにより単位時間当たりに書き込まれるデータの量、及び読み出されるデータの量が区々であることにより、このような待合せの必要が頻発する可能性がある。前記従来技術では、このように入力プロセス、出力プロセスの待合せが多発した場合のことについて何等考慮されていない。このため、１つのプロセスから出力されたデータを複数のプロセスで利用するような場合に、プロセスの待合せが頻発することにより、プロセスの待ち状態の設定、解除の回数が増大してしまい、これにより、処理時間が増大して、プロセスの並行処理によるメリットを十分に活かすことができなくなるという問題がある。
【０００５】
本発明の目的は、上述したような従来技術における技術的課題を解決し、ある１つのプロセスが生成したデータを複数のプロセスが参照するようなプロセス間でのデータの引き継ぎ処理が行われる計算機システムにおいて、各プロセスにおけるデータ入出力の処理速度の相違に影響されることのないプロセス間でのデータの引継ぎ方法を提供することにある。
【０００６】
【課題を解決するための手段】
上述した課題を解決するために、本発明によれば、処理結果であるデータを出力する第１のプロセス及び第１のプロセスが出力したデータを引き継いで処理を行なう複数の第２のプロセスのいずれからもアクセス可能なバッファが設けられる。このバッファは、例えば、計算機システムの主記憶装置内に設けられる。このような計算機システムで実行される本発明のデータ引き継ぎ方法は、第１のプロセスから発行された出力命令に応じて、出力命令により指定されるデータをバッファへ順次書き込む第１のステップと、第２のプロセスの各々から発行された入力命令に応じて、バッファに書き込まれたデータを第１のプロセスでの出力順に従って、入力命令を発行した第２のプロセスに順次読み込ませる第２のステップと、第１のプロセスからの出力命令に応じて書き込まれたデータが第２のプロセスの全てに読み込まれたときに、このデータを保持していたバッファの領域を開放する第３のステップとを有する。
【０００７】
好ましくは、バッファは、第１及び第２のステップのためにラップアラウンドに使用される。
【０００８】
また、第２のステップにおいてデータを読み込もうとしたバッファの領域に書き込まれた新しいデータがない場合に、その領域に書き込まれるであろうデータに対する読み込み命令を発行した第２のプロセスを待ち状態に設定する。この待ち状態は、第１のステップの実行状況を監視し、第１のステップの実行状況に応じて解除される。
【０００９】
あるいはまた、第１のステップにおいてデータを書き込もうとしたバッファの領域が、第３のステップにより未だ開放されなていない状態にある場合に、第１のプロセスを待ち状態に設定する。この待ち状態は、第２のステップの実行状況を監視し、第２のステップの実行状況に応じて解除される。
【００１０】
さらに、本発明のデータ処理方法によれば、データの引き継ぎに用いられるバッファの大きさは、第１のプロセスが発行するデータの出力命令の頻度と、複数の第２のプロセスが発行するデータの入力命令の頻度とを観測し、第１のプロセスの出力命令の頻度に対する複数の第２のプロセスの各々が発行する入力命令の頻度が、所定のしきい値以上もしくは所定のしきい値以下である場合に、増分される。
【００１１】
また、第１のプロセスおよび複数の第２のプロセスの実行状況を監視し、いずれかのプロセスがデータ引き継ぎ処理中に異常終了した場合には、他のすべてのプロセスを異常終了させる。
【００１２】
さらにまた、複数の第２のプロセスには、前記第２のステップにより読み込んだデータをバッファが存在する記憶装置とは異なる記憶装置、例えば、ディスク装置等の外部記憶装置に書き込むバックアッププロセスを含む。ある好ましい態様においては、このバックアッププロセスは、第１のプロセスを起動させるためのコマンドにおける指定に従って生成される。
【００１３】
【作用】
第１のプロセスでの処理の結果として出力されるデータを第２のプロセスで引き継ぐ際、主記憶上に用意したバッファを利用することで、外部記憶装置を利用した場合と比較して、１レコードのあたりのデータ転送を高速に実行できる。このとき、出力プロセス及び入力プロセスによるデータの入出力の状況に応じて各プロセスの実行状態、即ち、待合せの設定、解除を行う。これにより、入力プロセスからの入力要求回数が、出力プロセスからの出力要求回数を越えないことを保証することができる。また、バッファをラップアラウンドに使用した場合であっても、いずれかの入力プロセスにより読み込みの行われていないデータを保持するバッファの領域、即ち、バッファブロックが存在する場合、そのブロックに対して新しいデータの書き込みが行われないことを保証することができる。この結果として、データの受け渡しをファイル単位ではなくレコード単位で行ない、出力プロセスと複数の入力プロセスとを並行して実行することが可能となる。
【００１４】
また、バッファをラップアラウンドに利用することから生じるプロセスの待ち合わせ処理において、待ち状態のプロセスがある場合は、待合せを生じる原因となったプロセスの実行状況を監視し、そのプロセスの実行状況に応じてその待ち状態が解除される。つまり、各プロセスの待ち状態は、その待ち状態を設定する原因となったプロセスによるデータの入出力の処理が、所定のブロック数以上進行するまで保たれた後解除される。これにより、待ち状態を解除されたプロセスが実行を再開した後、再び待ち状態が設定される状態となるまでに、この所定ブロック数以上の処理を実行できることが保証され、待ち状態解除後直ちに待ち状態に設定されるようなことを防ぐことができる。この結果、個々の入力プロセスのデータ入力の頻度に差があっても、これにより待ち合わせ回数が急増することを防ぎ、プロセス間での待合せ処理に要する処理時間を削減できる。さらに、出力プロセスと複数の入力プロセスの並行した処理を効率よく実現することができ、データ引き継ぎ処理を高速に実行することが可能となる。
【００１５】
【実施例】
以下、本発明の実施例を図を用いて詳細に説明する。
【００１６】
本実施例では、本発明をバッチジョブに適用した場合について説明する。従って、プロセス上ではジョブ制御文で指定されたプログラムを実行させることになる。以下では、中間データを出力する側のジョブで指定したプログラムを出力プロセスと呼び、その中間データを入力する側のジョブで指定したプログラムを実行させるプロセスを入力プロセスと呼ぶことにする。
【００１７】
図１は、本発明の一実施例における計算機システムの原理を説明するためのブロック図である。図１において、１は計算機システムを示す。計算機システム１は、演算操作を行う中央演算装置（ＣＰＵ）２と主記憶装置３を含んで構成される。４は磁気ディスク装置等の外部記憶装置である。５はジョブ制御文であり、ジョブが実行するプログラムやアクセスするファイルを定義したものである。６はジョブ受付部であり、ジョブ制御文５によって投入されるジョブを受け付ける部分である。７はジョブ制御文解析部であり、ジョブ受付部６が受け付けたジョブ制御文５の構文解析等を行う。８はジョブ起動部であり、ジョブ制御文解析部７により解析されたジョブの起動を行う。９は出力プロセスであり、１０は入力プロセス群である。１１はデータ引き継ぎ制御部であり、オープン処理制御部１１１、クローズ処理制御部１１２、ライト処理制御部１１３、リード処理制御部１１４、バッファ管理部１１５、バックアップ制御部１１６からなる。１２は出力プロセスと入力プロセスとの間のデータ引き継ぎに必要とするデータ引き継ぎ情報記録領域である。１３はデータ引き継ぎに利用するバッファである。また、１４はコピープロセスであり、バックアップ処理を実行する際に利用される。ジョブ受付部６、ジョブ制御文解析部７、ジョブ起動部８、出力プロセス９、入力プロセス１０、データ引き継ぎ制御部１１、及びコピープロセス１４は、主記憶装置３に格納されたプログラムを示しており、実際には、中央演算装置２がこれらのプログラムに従った処理を実行することにより、これらの機能が実現される。
【００１８】
図２は、図１におけるジョブ制御文５の一例を示す構成図であり、中間データを出力するプログラムを実行させるためのジョブ制御文５０１と、その中間データを入力するプログラムを実行させるためのジョブ制御文５０２、５０３を示している。
【００１９】
ジョブ制御文では、まず、ジョブを宣言するためのＪＯＢ文が記述される。ＪＯＢ文では、そのジョブのジョブ名称を指定する。例えば、ジョブ制御文５０１では、“ＪＯＢ１”がジョブ名称である。次に、各ジョブの中でのプログラムの実行単位であるジョブステップを宣言する。ジョブステップを宣言するのは、ＥＸＥＣ文であり、ＰＧＭオペランドで実行させるプログラムを指定する。ＥＸＥＣ文でも、ＪＯＢ文同様にジョブステップ名称を指定する。例えば、ジョブ制御文５０１のＥＸＥＣ文は、ジョブステップ名称が“ＳＴＥＰ１”であり、実行するプログラムが“ＰＧＭ１”であることを指定している。さらに、ＦＤ文によりジョブステップ内でアクセスするファイルが指定される。ＦＤ文では、アクセスするファイルの名称をＦＩＬＥオペランドで指定し、そのファイルが存在するデバイスタイプをＤＥＶＩＣＥオペランドで指定する。ＦＤ文にもＦＤ名称が付けられている。プログラムはこのＦＤ名称を指定して、ファイルへのアクセスを行う。例えば、ジョブ制御文５０１では、ＦＤ名称“ＩＮ１”のＦＤ文で入力するファイルとして、“Ａ．ＤＡＴＡ”を指定しており、ＦＤ名称“ＯＵＴ１”のＦＤ文で実行結果として“Ｂ．ＤＡＴＡ”を出力することを指定している。
【００２０】
次に、後述する本実施例の方法によりデータの引き継ぎを行なう場合のＦＤ文の記述について、図２に示すジョブ制御文５０１、５０２、５０３を例に詳細に説明する。
【００２１】
図２は、ジョブ制御文５０１により定義されるジョブ“ＪＯＢ１”のプロセスが出力したファイルをジョブ制御文５０２及び５０３により定義されるジョブ“ＪＯＢ２”、“ＪＯＢ３”のプロセスが参照する場合のジョブ制御文を示すものである。ジョブ制御文５０１のＦＤ文“ＯＵＴ１”のＤＥＶＩＣＥオペランドの第１パラメータで指定している“ＰＩＰＥ”は、“ＪＯＢ１”の実行結果である“Ｂ．ＤＡＴＡ”が、本実施例により提案される後述の方法で他のジョブに引き継がれることを示している。同様に、ジョブ制御文５０２、５０３のＦＤ文“ＩＮ２”及び“ＩＮ３”では、ＤＥＶＩＣＥオペランドのパラメータに“ＰＩＰＥ”を指定して、後述する方法により、“Ｂ．ＤＡＴＡ”を参照することを示している。ＦＤ文で指定するファイル名としては、ファイルを出力する側と参照する側とで同一の名称を指定する。また、ジョブ制御文５０１のＦＤ文“ＯＵＴ１”のＤＥＶＩＣＥオペランドの第２パラメータは、出力したファイルを参照するジョブの数を指定しており、この場合、“ＪＯＢ１”の出力である“Ｂ．ＤＡＴＡ”が２つのジョブに引き継がれることを示している。本実施例では、以上のようにＦＤ文を記述することにより、中間データを出力するジョブとそのデータを参照するジョブとをジョブ制御文で関連づけることができる。
【００２２】
ジョブ間でのデータを受け渡しを行ないながら、受渡しが行われているデータを外部記憶装置へ出力して保存しておく場合には、データを出力する側のジョブ制御文の出力ファイルを指定するＦＤ文のＤＥＶＩＣＥオペランドの第３パラメタで、中間データの保存先のファイルを指定したＦＤ文を指定する。例えば、ジョブ制御文５０１において、ＦＤ文“ＯＵＴ１”を
／／ＯＵＴ１  ＦＤ  ＦＩＬＥ＝Ｂ．ＤＡＴＡ，ＤＥＶＩＣＥ＝（ＰＩＰＥ，２，ＢＫＵＰ）
と記述し、さらに、
／／ＢＫＵＰ  ＦＤ  ＦＩＬＥ＝ＢＡＣＫ．ＤＡＴＡ，ＤＥＶＩＣＥ＝ＤＡＳＤ
というＦＤ文を記述したとする。この場合、中間データは、主記憶装置３内のバッファ１３を介して“Ｂ．ＤＡＴＡ”というファイル名で他のジョブに参照されると共に、“ＢＡＣＫ．ＤＡＴＡ”というファイル名で、外部記憶装置４上に保存される。以下、本明細書では、このように、プロセス間で引き継がれるデータを外部記憶装置上に保存することをバックアップと呼び、このための処理をバックアップ処理と呼ぶ。
【００２３】
図３は、主記憶装置３内のデータ引き継ぎ記録領域１２の論理的な構成図である。データ引き継ぎ記録領域１２は、共通情報テーブル１２０１、出力プロセス情報テーブル１２０２、及び入力プロセス情報テーブル１２０３とを有する。共通情報テーブル１２０１、及び出力プロセス情報テーブル１２０２は、データ引き継ぎ記録領域１２内に１つだけ存在する。一方、入力プロセス情報テーブル１２０３は、データを受け取る入力プロセスに対応して設けられ、データを受け取る入力プロセスの数だけ存在する。
【００２４】
共通情報テーブル１２０１は、ファイル名エリア１２０４、バッファ先頭アドレスエリア１２０５、バッファブロックブロック数エリア１２０６、指定入力プロセス数エリア１２０７、実行入力プロセス数エリア１２０８、及びバックアップ指定フラグ１２０９を含んでいる。ファイル名エリア１２０４は、このデータ引き継ぎ記録領域１２によりデータの引き継ぎが行われるファイルのファイル名が登録される。バッファ先頭アドレスエリア１２０５、バッファブロック数エリア１２０６には、データの引き継ぎに利用するバッファ１３の先頭アドレス、及びブロック数がそれぞれ登録される。指定入力プロセス数エリア１２０７には、ファイル名エリア１２０４に登録したファイル名を持つファイルのデータを参照するプロセス（ジョブ）の数、即ちこのファイルをオープン可能な入力プロセスの数がジョブ制御文に従って登録される。このファイルの入力処理を実行中の入力プロセスの数は実行入力プロセス数１２０８によって示される。また、バックアップ指定フラグ１２０９は、引き継ぎを行なうファイルを外部記憶装置４に保存する場合にセットされる。
【００２５】
出力プロセス情報テーブル１２０２は、出力ブロック番号エリア１２１０、出力回数エリア１２１１、出力クローズフラグ１２１２、出力待ちフラグ１２１３を含んでいる。出力ブロック番号エリア１２１０には、次回の出力処理によりデータを書き込むバッファ１３のブロックの番号が設定される。出力回数エリア１２１１には、出力プロセス９により出力処理の行われた回数（出力したブロックの数）が記録される。また、出力クローズフラグ１２１２、出力待ちフラグ１２１３は、出力プロセス９によりファイルがクローズされたか否かを示すフラグ、出力プロセスの待合せの状態を示すフラグがそれぞれセットされる。
【００２６】
また、各入力プロセス情報テーブル１２０３は、入力プロセスＩＤエリア１２１４、入力ブロック番号エリア１２１５、入力回数エリア１２１６、入力クローズフラグ１２１７、入力待ちフラグ１２１８を含んで構成される。入力プロセスＩＤエリア１２１４には、その入力プロセス情報テーブル１２０３に対応する入力プロセスを識別するための識別子（ＩＤ）が登録される。ここで用いる識別子としては、例えば、ジョブ制御文５で定義されたジョブ名、あるいは、ジョブに対して通番により与えられたジョブ番号等を用いることができる。入力ブロック番号エリア１２１５には、次回の出力処理によりデータを読み込むバッファ１３のブロックの番号が設定される。入力回数エリア１２１６には、対応する入力プロセス１０により入力処理の行われた回数（読み込んだブロックの数）が記録される。また、入力クローズフラグ１２１７、入力待ちフラグ１２１８は、対応する入力プロセス１０によりファイルがクローズされたか否かを示すフラグ、及び対応する入力プロセスの待合せの状態を示すフラグがそれぞれセットされる。
【００２７】
図４は、オープン処理制御部１１１の処理フローチャートである。データ引き継ぎ処理制御部１１は、各プロセスが、プロセス間データ引き継ぎファイルへのオープン命令を発行したとき、オープン処理制御部１１１に制御を移す。各プロセスは、オープン命令を発行する際、ジョブ制御文５のＦＤ文でユーザにより指定されたファイル名を同時に指定する。
【００２８】
オープン処理制御部１１１では、まず、ファイル名エリア１２０４にオープン命令により指定されたファイルと同一のファイル名が登録されたデータ引き継ぎ記録領域１２があるかどうか判定（ステップ４０１）する。同一のファイル名が登録されたデータ引き継ぎ記録領域１２がなければ、主記憶装置３内にデータの引き継ぎに利用するバッファ１３、及びデータ引き継ぎ記録領域１２のための領域を確保し、共通情報テーブル１２０１の初期設定を行う（ステップ４０２）。共通情報テーブル１２０１の初期設定では、ファイル名エリア１２０４にユーザがジョブ制御文で指定したデータ引き継ぎ用ファイルの名称を格納する。また、確保したバッファ１３の先頭アドレスをバッファ先頭アドレスエリア１２０５に、バッファ１３として確保した領域のブロック数をバッファブロック数エリア１２０６に格納する。指定入力プロセス数エリア１２０７には、ジョブ制御文５中のＦＤ文のＤＥＶＩＣＥオペランドの第２パラメータで指定した入力プロセス数を格納し、実行入力プロセス数１２０８には“０”を格納する。バックアップ指定フラグは、ジョブ制御文５にバックアップ処理の実行の指定、即ち、中間データの出力を指定するＦＤ文のＤＥＶＩＣＥオペランドの第３パラメータの指定があればオンとし、指定がなければオフとする。
【００２９】
次に、オープン命令が出力プロセス９から発行されたものであるか判定する（ステップ４０３）。出力プロセス９により発行されたオープン命令である場合には、データ引き継ぎ記録領域１２内に出力プロセス情報テーブル１２０２が存在するか否か判定する（ステップ４０４）。データ引き継ぎ記録領域１２内に出力プロセス情報テーブル１２０２が存在する場合には、既に他のプロセスにより同一のファイル名を持つファイルがオープンされていることになる。このため、オープン命令を発行した出力プロセス９を異常終了する（ステップ４１０）。ステップ４０４において、データ引き継ぎ記録領域１２内に出力プロセス情報テーブル１２０２が存在しないと判定されると、データ引き継ぎ記録領域１２内に出力プロセス情報テーブル１２０２を確保して初期設定を行う（ステップ４０５）。出力プロセス情報テーブル１２０２の初期設定では、出力ブロック番号エリア１２１０に“１”、出力回数エリア１２１１に“０”を格納する。また、出力クローズフラグ１２１２および出力待ちフラグ１２１３はオフとする。更に、出力プロセス９の実行を記述したジョブ制御文５で指示された入力プロセス数を、指定入力プロセス数１２０７に格納する。
【００３０】
出力プロセス情報テーブル１２０２の初期設定が終わると、次に、共通情報テーブル１２０１の指定入力プロセス数エリア１２０７に設定されている値と実行入力プロセス数エリア１２０８に設定されている値とを比較する（ステップ４０６）。実行入力プロセス数エリア１２０８の値が指定入力プロセス数エリア１２０７の値を越えている場合には、指定値以上の入力プロセスがオープン命令を発行済みであることになる。従って、この場合には、出力プロセス及びすべての入力プロセスを異常終了させる（ステップ４１０）。実行入力プロセス数エリア１２０８の値が指定入力プロセス数エリア１２０８の値以下であれば、オープン処理制御部１１１は正常に処理を終了する。
【００３１】
一方、ステップ４０３で、オープン命令が出力プロセス９からのものでないと判断したときは、このオープン命令は入力プロセス１０からのものとみなす。そして、データ引き継ぎ記録領域１２内に出力プロセス情報テーブル１２０２が存在するか否か判定する（ステップ４０７）。出力プロセス情報テーブル１２０２が存在していれば、指定入力プロセス数エリア１２０７にオープン可能な入力プロセスの数が設定されている。そこで、既にこのファイルをオープンしている入力プロセス１０の数（以下、実行入力プロセス数）を実行入力プロセス数エリア１２０８を参照して調べ、それを指定入力プロセス数エリア１２０７に設定されている値（以下、指定入力プロセス数）と比較する（ステップ４０８）。本実施例では、指定入力プロセス数を超える入力プロセスからのファイルのアクセスは禁止される。このため、ステップ４０８での比較の結果、ファイルをオープンしている入力プロセスの数が、既に指定入力プロセス数と等しくなっている場合には、この入力プロセス１０を異常終了させる（ステップ４１０）。なお、入力プロセスの数が指定入力プロセス数を超える場合の妥当性については、出力プロセスからのオープン命令の処理（ステップ４０６）で行なっているので、ここでは、特に行なわない。
【００３２】
ステップ４０８での比較の結果、ファイルをオープンしている入力プロセスの数が指定入力プロセス数以下であれば、この入力プロセス１０のために、データ引き継ぎ情報記録領域１２内に入力プロセス情報テーブル１２０３を新たに確保し、初期設定を行う（ステップ４０９）。入力プロセス情報テーブル１２０３の初期設定では、入力プロセスＩＤエリア１２１４に、オープン命令を発行した入力プロセス１０のＩＤを、入力ブロック番号エリア１２１５に“１”を、そして入力回数エリア１２１６に“０”を格納する。また、入力クローズフラグ１２１７および入力待ちフラグ１２１８はオフとする。なお、ステップ４０７で、出力プロセス情報テーブル１２０２が存在していなければ、出力プロセス９が未オープンであり、指定入力プロセス数エリア１２０７には、未だ値が設定されていない。従って、このときは、無条件でステップ４０９を実行する。
【００３３】
入力プロセス情報テーブル１２０２の初期設定を終えると、共通情報テーブル１２０１の実行入力プロセス数エリア１２０８の値に１加算し（ステップ４１１）、処理を正常終了する（ステップ４１２）。
【００３４】
図５は、クローズ処理制御部１１２による処理のフローチャートである。データ引き継ぎ処理制御部１１は、各プロセスがプロセス間データ引き継ぎファイルへのクローズ命令を発行したとき、クローズ処理制御部１１２に制御を移す。
【００３５】
クローズ処理制御部１１２は、まず、発行されたクローズ命令が出力プロセス９からのものか否か判定する（ステップ５０１）。出力プロセス９からのクローズ命令であれば、出力プロセス情報テーブル１２０２の出力クローズフラグ１２１２をオンにする（ステップ５０２）。次に、データ引き継ぎ情報記録領域１２内のすべての入力プロセス情報テーブル１２０３について、フラグ１２１７がオンであるかどうか判定する（ステップ５０３）。すべての入力クローズフラグ１２１７がオンであれば、データ引き継ぎ情報記録領域１２およびバッファ１３を解放して（ステップ５０４）、処理を終了する（ステップ５０７）。
【００３６】
ステップ５０１の判定の結果、発行されたクローズ命令が出力プロセス９からのものでない場合は、このクローズ命令を入力プロセス１０からのものとみなす。この場合には、入力プロセスＩＤエリア１２０１４に、クローズ命令を発行した入力プロセス１０のＩＤと一致する入力プロセスＩＤを持つ入力プロセス情報テーブル１２０３を探し、その入力クローズフラグ１２１７をオンにする（ステップ５０５）。次に、出力プロセス情報テーブル１２０２の出力クローズフラグ１２１２がオンとなっているか判定し（ステップ５０６）、このフラグがオンであればステップ５０３以降の処理を実行する。出力クローズフラグがオンにセットされていなければ、そのまま処理を終了する。
【００３７】
次に、出力プロセス９によるデータの出力、及び入力プロセス１０によるデータの読み込みについて説明する。
【００３８】
本実施例では、限られた容量の記憶領域しか利用できない場合でも大容量のデータのデータ引き継ぎを可能とするため、バッファ領域１３をラップアラウンドに使用してデータの引継ぎを行なう。すなわち、出力プロセス９によるデータの出力の際には、データをバッファ１３の最終ブロックまで格納した場合、次のデータはバッファ１３の先頭ブロックに戻って格納する。データを格納しようとするブロックにまだすべての入力プロセス１０によって読み込まれていない古いデータが存在するときには、そのブロックに新しいデータを上書きすることはできない。この場合には、出力プロセス９を待ち状態にする。同様に、各入力プロセス１０は、バッファ１３の最終ブロックのデータを読み込むと、次はバッファ１３の先頭ブロックに戻ってデータの読み込みを続ける。また、入力プロセス１０がデータを読み込もうとしたブロックにまだ新しいデータが格納されていないときは、その入力プロセス１０を待ち状態にする。
【００３９】
原理的には、データを書き込み、あるいは読み込み可能なブロックが１つでも生じた時点で、出力プロセス９、あるいは入力プロセス１０の待ち状態を解除することも可能である。しかし、この場合には、待ち状態を解除されたプロセスが、その直後に再び待ち状態となってしまう恐れがあり、これに伴い処理時間が長時間化する危険がある。このため、本実施例では、各プロセスの待ち状態が解除された後は、少なくとも一定の間隔は処理を続行できるよう各プロセスの待ち状態を制御する。なお、プロセス間で引き継ぐデータ量があらかじめ用意したブロック数よりも少ない場合は、データ引き継ぎ用バッファ１３をラップアラウンドに使用することなく処理が終了することはいうまでもない。
【００４０】
図６は、出力プロセス９からファイルへの書き込み要求を受け取った際のライト処理制御部１１３の処理のフローチャートである。
【００４１】
ライト処理制御部１１３は、まず、データ引き継ぎを実行している入力プロセス１０のうち、異常終了したプロセスが存在するかどうか判定する（ステップ６０１）。異常終了している入力プロセス１０が存在すれば、出力プロセス９を異常終了させる（ステップ６０２）。異常終了している入力プロセス１０がなければ、次にデータを書き込もうとするブロックの入力プロセス読み込み数を求める。入力プロセス読み込み数は、入力ブロック番号エリア１２１５の値が出力ブロック番号エリア１２１０の値と等しい入力プロセス数の合計を、実行入力プロセス数エリア１２０８の値から減算することによって求めることができる。入力プロセス読み込み数は、データを書き込もうとするブロックに前に書き込まれたデータを読み込んだ入力プロセス１０の数を示す。
【００４２】
次に、この入力プロセス読み込み数が実行入力プロセス数と等しいか否か判定する（ステップ６０３）。入力プロセス読み込み数が実行入力プロセス数と等しい場合は、このブロックへの新たなデータの書き込みを許す。逆に、入力プロセス読み込み数と実行入力プロセス数とが等しくない場合には、出力プロセス９を待ち状態とする（ステップ６０４）。出力プロセス９の待ち状態の解除は、後述するリード処理制御部１１４の処理で実行される。
【００４３】
ステップ６０３の判定の結果、入力プロセス読み込み数と実行入力プロセス数とが等しい場合、あるいは、ステップ６０４において出力プロセス９の待ち状態が解除された後、出力ブロック番号エリア１２１０にセットされたブロック番号で示されるバッファ１３のブロックにデータを転送し、データ引き継ぎ情報記録領域１２内の情報を更新する（ステップ６０５）。データ引き継ぎ情報記録領域１２の更新では、出力ブロック番号エリア１２１０、出力回数エリア１２１１の値をそれぞれ１つカウントアップする。ただし、出力ブロック番号エリア１２１０の値がバッファブロック数エリア１２０６の値を越えた場合は、出力ブロック番号エリア１２１０には“１”をセットする。
【００４４】
ステップ６０５でデータを転送した後、待ち状態の解除が可能な入力プロセス１０の待ち状態を解除する。すなわち、入力プロセス情報テーブル１２０３を参照し（ステップ６０６）、入力プロセス待ちフラグ１２１８がオンか否か判定する（ステップ６０７）。入力プロセス待ちフラグ１２１８がオンの場合には、さらに、この入力プロセス１０の未入力データの数がバッファ一周分存在するか否か判定する（ステップ６０８）。未入力データがバッファ一周分存在するか否かの判定は、出力ブロック番号エリア１２１０の値と、入力ブロック番号エリア１２１５の値が等しいかどうかを調べることにより達成できる。未入力データの数がバッファ一周分存在すれば、その入力プロセス１０の入力プロセス待ちフラグ１２１８をオフとし、待ち状態を解除する（ステップ６０９）。ステップ６０９において１つの入力プロセスの待ち状態を解除した後、あるいは、ステップ６０７、６０８での判定の結果が否定的であった場合は、すべての入力プロセスについてステップ６０６〜６０９の処理を行なったか調べ（ステップ６１０）、すべての入力プロセスについてステップ６０６〜６０９の処理を実行していれば処理を正常終了する（ステップ６１１）。
【００４５】
図７は、入力プロセス１０からファイルの読み込み要求を受け取った際のリード制御部１１４の処理のフローチャートである。
【００４６】
リード制御部１１４は、まず、出力プロセス９が異常終了していないか判定する（ステップ７０１）。出力プロセス９が異常終了していれば、ファイルの読み込み要求を発行した入力プロセス１０も異常終了させる（ステップ７０２）。出力プロセス９が異常終了していなければ、この入力プロセス１０が未だ入力していないデータがバッファ１３に存在するか否か判定する（ステップ７０３）。ステップ７０３では、ファイル読み込み要求を発行した入力プロセス１０に対応する入力プロセス情報テーブル１２０３の入力ブロック番号エリア１２１５の値が、出力プロセス情報テーブル１２０２の出力ブロック番号エリア１２１０の値と等しくなっているかどうかを調べることにより判定を行なう。
【００４７】
ステップ７０３で未入力データがないと判定された場合は、この入力プロセス１０を待ち状態にする（ステップ７０４）。ここで待ち状態とされた入力プロセス１０の待ち状態解除は、前述したようにライト処理制御部１１３の処理により実行される。
【００４８】
ステップ７０３で未入力データありと判定された場合、若しくはステップ７０４で設定された待ち状態が解除された後、入力プロセス情報テーブル１２０３の入力ブロック番号エリア１２１５にセットされた値により示されるバッファ１３内のブロックよりデータを転送する。そして、データ引き継ぎ情報記録領域１２内の情報を更新する。具体的には、入力ブロック番号エリア１２１５、入力回数エリア１２１６の値をそれぞれ１つカウントアップして更新する。ただし、更新の結果、入力ブロック番号エリア１２１５の値がバッファブロック数エリア１２０６にセットされている値を越えた場合には、入力ブロック番号エリア１２１５に“１”をセットする。（ステップ７０５）。
【００４９】
データ転送後、出力プロセス情報テーブル１２０２の出力待ちフラグ１２１３を調べ、それがオンか否か判定する（ステップ７０６）。出力待ちフラグがオンであればそのまま処理を正常終了する。出力待ちフラグがオフの場合は、バッファ１３の各ブロックにある古いデータが、全ての入力プロセスから読み込まれているか否か判定する（ステップ７０７）。具体的には、すべての入力プロセス情報テーブル１２０３の入力ブロック番号エリア１２１５を参照し、そこに設定されているすべて値が、出力プロセス情報テーブル１２０２の出力ブロック番号エリアに設定されている値と等しくなっているかどうか調べる。そして、各入力ブロック番号エリア１２１５の値が出力ブロック番号エリア１２１０の値と等しければ、古いデータは全ての入力プロセスに読み込まれていると判断する。ステップ７０７で、古いデータは全ての入力プロセスに読み込まれていると判断されれば、出力待ちフラグ１２１３をオフにセットして処理を終了する（ステップ７０８）。ステップ７０７において、入力プロセスにより読み込まれていないデータがあると判断された場合には、そのまま処理を終了する。
【００５０】
図６及び図７に説明したライト制御部、リード制御部の処理による、各プロセスの待ち状態の設定、解除に要する処理時間の全体の処理時間に占める割合いをより低く抑えるには、バッファのブロック数をいくつに設定するかが問題となる。このバッファブロック数の設定に当たっては、例えば、特開平３−４６０３３号公報に開示されるように、実行開始時にあらかじめ定められた大きさのバッファを確保しておき、処理の実行中に出力プロセス、入力プロセスそれぞれの入出力処理頻度をモニタし、その結果に応じて最適なバッファのブロック数を決定して、バッファを拡張する方法を採用することができる。なお、特開平３−４６０３３号公報には、入力プロセスが複数存在する場合、どのようにバッファブロック数を決定すればよいかについては示されていない。そこで、本実施例において、特開平３−４６０３３号公報に開示された方法によりバッファのブロック数を決定する際は、各入力プロセスごと独立に最適なバッファブロック数を求め、このうち最大のものを新しいバッファのブロック数として採用する。
【００５１】
次に、出力プロセスと入力プロセスとの間で引き継がれるデータを外部記憶装置に保存する場合、即ち、ジョブ制御文５にバックアップ処理の実行の指定がある場合の処理について説明する。
【００５２】
バックアップ処理の制御は、バックアップ制御部１１６により実現される。ジョブ制御文５の中でバックアップ処理が指定されている場合は、出力プロセス９によるファイルのオープン命令発行時に、共通情報テーブル１２０１のバックアップ指定フラグ１２０９がオンにセットされる。データ引き継ぎ制御部１１は、オープン制御部１１１の処理終了後、バックアップ指定フラグ１２０９がオンに設定されていると、バックアップ制御部１１６の実行を開始する。図８に、バックアップ制御部１１６の処理のフローチャートを示す。
【００５３】
バックアップ制御部１１６は、まず、共通情報テーブル１２０１の指定入力プロセス数エリア１２０７の値を１つカウントアップする（ステップ１１０１）。続いて、バックアップ処理を実行するコピープロセス１４が使用するファイル名を指定する（ステップ１１０２）。具体的には、コピープロセス１４へのデータ入力のためのファイル名として、プロセス間で引き継がれるファイルのファイル名（共通情報テーブル１２０１のファイル名エリア１２０４に設定されているファイル名）を指定する。また、コピープロセス１４から外部記憶装置４へのデータ出力のためのファイル名として、あらかじめバックアップ処理専用に定められたファイル名、もしくはユーザがデータを保存するために用意したファイル名を指定する。バックアップ制御部１１６は、ファイル名を指定した後、コピープロセスを起動する（ステップ１１０３）。
【００５４】
このようにして起動されたコピープロセス１４は、以降、他の入力プロセス１０と同様にして出力プロセスが出力したデータを引き継ぎ、そのデータを外部記憶装置４に格納していく。つまり、コピープロセス１４は、起動された後、指定されたデータ入力のためのファイル名を用いてオープン命令を発行し、オープン処理制御部１１１の制御によりファイルをオープンする。そして、データの読み込み要求を発行し、リード処理制御部１１４の制御によりバッファ１３からデータを読み込み、そのデータを順次外部記憶装置４に格納する。全てのデータについてバックアップ処理を終えると、クローズ命令を発行してクローズ処理制御部１１２の制御によりファイルをクローズする。
【００５５】
コピープロセスは、一度起動が完了すると、後は特別な処理を伴うことなくバックアップ処理を実行できる。バックアップ処理の終了の確認は必ずしも必要ではないが、もし確認したい場合には、いずれかのプロセスのクローズ処理時に確認するようにすればよい。
【００５６】
以上説明した実施例によれば、出力プロセスにより出力されたデータを複数の入力プロセスで効率的に引き継ぐことができる。また、出力プロセスが出力したプロセス間で引き継がれるデータの外部記憶装置への保存のための処理を、入力プロセスと同様にして実行されるコピープロセスにより出力プロセス、及び入力プロセスと並行して実行することができる。
【００５７】
上述した実施例では、ライト処理制御部１１３、及びリード処理制御部１１４の処理により、待ち状態に設定された各プロセスの待ち状態の解除は、バッファ一周分の処理を実行できることが保証された時点で行われる。このような各プロセスの待ち状態の解除の方法に対し、例えば、出力プロセスが待ち状態となっている場合に、いずれかの入力プロセスが出力プロセスに追い着いた時点で出力プロセスの待ち状態を解除することも考えられる。しかし、このような制御では、データの読み込みがより遅い入力プロセスがあると、待ち状態を解除された出力プロセスは、たいして処理を進めないうちに再び待ち状態とならざるを得ない状態に陥ることがある。このような場合には、待ち状態の設定、解除の回数が増大し、全体の処理時間が長引いてしまう。上述した実施例では、すべてのプロセスは、待ち状態が解除された後、少なくとも、バッファ一周分のデータを処理する間は再び待ち状態になることなく処理を実行できる。この結果、待ち状態の設定及びその解除の回数を不要に増大させることがなく、全体の処理時間に占める待ち状態の設定、解除に要する処理時間の割合いをある程度抑えることができ、効率の良いデータ引き継ぎを行うことができる。
【００５８】
また、上述した実施例では、バックアップ処理を行うコピープロセスを、バックアップ制御部により起動しているが、ユーザがバックアッププロセスを定義して、ジョブ制御文を作成、投入し、コピープロセスを入力プロセスの一つとして実行することにより、バックアップ制御部を必要とせずに同様のバックアップ処理を実現することができる。ただし、この場合には、ユーザの手間が増えるだけではなく、イニシエータ等計算機の資源も余分に必要となる。
【００５９】
上述した実施例によれば、各プロセスの待合せ状態の設定、解除は、バッファ単位で各プロセスの入出力を待ち合わせながら行なわれる。このため、他の入力プロセスに比べて、単位時間当たりに読み込むデータの量が少ない入力プロセスが存在する場合には、他の全ての入力プロセスの処理の速度がこの入力プロセスの処理の速度に影響され極端に遅くなることがある。バッファの容量が比較的少ない場合は、このようなことはあまり問題とならない。しかし、バッファの容量がある程度以上（以下、このようなバッファを大容量バッファという）になると、他のプロセスの待ち状態が必要以上に長引くことになる。このため、こうした状態が多発すると、各プロセスを並行して実行することによる処理時間の短縮という効果を十分に発揮できなくなる恐れがある。そこで、以下では、このような問題を考慮した第２の実施例について説明する。
【００６０】
第２の実施例におけるシステム構成等は、基本的には先に説明した第１の実施例と同様であるので、以下では、第１の実施例と異なる部分についてのみ説明し、第１の実施例と重複する部分については説明を省略する。
【００６１】
本実施例は、ライト処理制御部１１３、リード処理制御部１１４の処理の中で、待ち状態が設定された出力プロセス、入力プロセスの待ち状態を解除する際の条件、即ち、図６のステップ６０８、及び図７のステップ７０７における処理が第１の実施例と異なっている。
【００６２】
本実施例では、図６のステップ６０８において、待ち状態の解除の判定を行なう入力プロセス１０により読まれていないデータを持つバッファ１３のブロックの数が、予め定めた待合せ基準ブロック数に達したかどうか判定する。未入力データを持つブロックの数は、出力ブロック番号エリア１２１０の値から判定を行なっている入力プロセスに対応する入力プロセス情報テーブル１２０３の入力ブロック番号エリア１２１５の値を引くことにより求めることができる。そして、未入力データを持つブロックの数が待合せ基準ブロック数に達している場合に、ステップ６０９において、その入力プロセス１０の待ち状態を解除する。ここで、待合せ基準ブロック数とは、一度待ち状態を解除されたプロセスが次に待ち状態となるまでに処理できることを保証するブロック数のことである。この待合せ基準ブロック数は、オペレーティングシステムが決定してもよいし、ユーザが任意の方法で定めたものを指定するようにしてもよい。また、待合せ基準ブロック数としては、例えば、第１の実施例で述べた出力プロセス、入力プロセスそれぞれの入出力処理頻度から求められる最適ブロック数を利用することができる。
【００６３】
同様にして、図７に示すステップ７０７では、全ての入力プロセスによりデータが読み込まれたブロックの数が待合せ基準ブロック数に達したか否かを判定する。ここでの判定は、具体的には、出力回数エリア１２１１の値から各入力プロセス状態テーブル１２０３の入力回数エリア１２１６の値の中で最も小さな値を引いた値と、バッファブロック数エリア１２０６の値から待合せ基準ブロック数を引いた値とを比較して行われる。この判定の結果、両者が等しくなっていればステップ７０８において、出力プロセスの待ち状態が解除される。
【００６４】
以上のようにして各プロセスの待合せの状態を制御することにより、各プロセスは、少なくとも待合せ基準ブロック数だけのデータを処理する間は、待ち状態となることなく処理を続行できる。また、他のプロセスに比べて、単位時間当たりのデータの読み込み回数（読み込み頻度）の少ない入力プロセスが存在したとしても、そのプロセスが、未入力のデータをすべて読み込むまで他のプロセスが待合せ状態に置かれずに待合せ状態が解除されるので、出力プロセス、及び単位時間当たりの入力処理回数の多い入力プロセスの処理を先行させて実行することができ、大容量のバッファをより効率よく利用することができる。
【００６５】
例として、バッファのブロック数が１，０００ブロックである場合を考えてみる。複数入力プロセスのデータの読み込み頻度に違いがあると、読み込み頻度の高い入力プロセスは約１０００ブロック分だけ、最も読み込み頻度の低い入力プロセスよりも実行を先行できる。しかし、第１の実施例のように待合せの設定、解除を制御すると、このようなプロセスは、読み込み頻度の低いプロセスが１０００ブロックのデータを読み込むまで待ち状態を解除されないことになる。これに対し、待合せ基準ブロック数を５０ブロックと定め、本実施例の方法を適用すると、読み込み頻度の高いプロセスは読み込み頻度の低いプロセスよりも約１０００ブロック分処理を先行でき、かつ、待ち状態となってもそのプロセスが５０ブロック分データの読み込み処理を行なった時点でその待ち状態が解除されることになり、長い間待ち状態に置かれることを防ぐことができる。
【００６６】
なお、本実施例では、待合せ基準ブロック数は、処理開始前に予め定め定めておき、その後その値を固定して使用するが、処理の実行中における出力プロセスによるデータ出力の頻度、入力プロセスによるデータ読み込みの頻度に応じて適宜変化させるようにすることもできる。
【００６７】
次に、本発明の第３の実施例について説明する。
【００６８】
以上説明した第２の実施例では、各プロセスの単位時間当たりのデータの読み込み頻度の差が大きい場合に、大容量バッファを有効に利用し、読み込み頻度の高いプロセスの実行を先行させることを可能としたものである。しかし、各プロセスのデータの読み込み頻度に大きな差がないときは、処理実行時間にほとんど差が生じない。従って、不用意に大容量のバッファを設けることは意味がないばかりではなく、記憶装置を無駄に使用してしまう可能性がある。また、各プロセスによるデータの読み込み頻度は、実際に処理を行なわなければ分からない場合も多く、このような場合には、プロセスの待ち状態の設定、解除にどのような方法を用いればよいかを予め決めておくことはできない。そこで、本実施例では、各プロセスの処理の状況により動的にバッファを拡張すると共に、拡張したバッファの大きさに応じてプロセスの待合せの設定、解除の制御方法を切り替えるようにする。なお、本実施例においては、ライト制御部１１３、リード制御部１１４、及びバッファ管理部１１５による処理が第１、第２の実施例と異なるのみであるので、以下、これらによる処理について詳細に説明し、他の部分については第１、及び第２の実施例についての説明を流用することができるので、ここでは説明を省略する。
【００６９】
図９は、本実施例において、ライト処理制御部１１３がファイルへの書き込み要求を受け取った際に実行する処理のフローチャートである。図９において、第１の実施例で図６により説明したライト処理制御部の処理と共通する部分については、図６と同一の参照番号が付されている。
【００７０】
本実施例では、ステップ６０７において入力待ちフラグ１２１８がオンである入力プロセス１０が存在したとき、バッファブロック数エリア１２０６に設定されている値が、待合せ基準ブロック数より小さいかどうか判定する（ステップ８０１）。ステップ８０１の条件を満足する場合は、第１の実施例におけるステップ６０８と同様に、出力ブロック番号エリア１２１０と入力ブロック番号エリア１２１５を参照して、入力プロセス１０の未入力データの数がバッファ一周分存在するか否か判定する（ステップ８０２）。ステップ８０１の条件が満足されていない場合には、第２の実施例と同様に、待ち状態の解除の判定を行なう入力プロセス１０により読まれていないデータを持つバッファ１３のブロックの数が、予め定めた待合せ基準ブロック数に達したかどうか判定する（ステップ８０３）。そして、ステップ８０２、またはステップ８０３の条件を満たす入力プロセスに対し、ステップ６０９でその待ち状態を解除する。その後、ライト処理制御部１１３は、必要に応じてバッファ１３を拡張するために、バッファ管理部１１５へ制御を渡す（ステップ８０４）。
【００７１】
図１０は、バッファ管理部１１５の処理の詳細は示すフローチャートである。
【００７２】
バッファ管理部１１５は、ライト処理制御部１１３からコールされると、出力プロセス９が次にデータを出力するバッファ１３のブロックが先頭ブロックかどうか、すなわち、出力ブロック番号エリア１２１０の値が“１”であるか判定する（ステップ１００１）。バッファ管理部１１５は、ステップ１００１での判定の結果、条件が満たされている場合のみ、以下の処理によりバッファ１３の拡張を行ない、条件が満たされていなければそのまま処理を終了する。従って、バッファ１３の拡張は、現バッファ１３の最終ブロックにデータを書き込んだ直後にのみ実行されることになる。バッファ１３を拡張するタイミングをこのように限定する理由は、以下の通りである。すなわち、入力プロセスが複数存在する場合は、各プロセスがそれぞれ異なるブロックからデータの読み込みを行なっていることになる。このため、任意のタイミングでバッファの拡張を行うと、出力プロセスにより既にバッファ上出力された連続したデータとデータの間に新しいデータ（あるいは、処理とは無関係のデータ）が挿入されてしまうなど、データの順序性が不正確となってしまう。このような問題を生じさせないよう本実施例では、出力プロセスによるデータの書き込みが行われるバッファが最終ブロックから先頭ブロックへとラップアラウンドするタイミングに合わせてバッファ１３の拡張を実施する。なお、この問題を解決する他の方法として、バッファ１３がすべて空き状態となったとき、即ち、すべての入力プロセスのデータ読み込み処理が出力処理のデータ出力処理に追い着き、バッファ１３上にいずれかの入力プロセスにより未入力となっているデータが存在しなくなったときに、バッファ１３を拡張する方法がある。ただし、この方法では、待合せの制御を待合せ基準ブロック数に基づいて実行した場合に、すべての入力プロセス１０が出力プロセス９に追い着き、バッファ１３がすべて空き状態となる場合があることは保証できず、バッファの拡張のタイミングを得られるかどうか分からないという問題がある。
【００７３】
ステップ１００１において、出力ブロック番号エリア１２１０の値が“１”であった場合は、続いて、バッファ１３を拡張するか否かを判定する（ステップ１２０２）。バッファ１３を拡張するか否かの判断に用いる基準としては、様々なものが考えられるが、本実施例では、バッファ１３のブロック数が待合せ基準ブロック数より小さい段階と、それ以上の段階とに分けて、それぞれ次に示す第一の基準、第二の基準を適用する。
【００７４】
バッファ１３のブロック数が待合せ基準ブロック数より小さい段階では、第一の基準として、待合せ実行頻度を用いる。例えば、データの読み込みが最も遅れている入力プロセス、データの読み込みが最も進んでいる入力プロセス、及び出力プロセスの入出力処理の頻度、待合せの発生回数をモニタする。そして、これらの情報を元にして待ち状態の発生頻度を求め、この値が予め定めたしきい値を超えた場合に、バッファの拡張を決定する。
【００７５】
また、バッファ１３のブロック数が待合せ基準ブロック数を超えた場合は、第二の基準として、ある入力プロセスの影響により、他の入力プロセスの処理が遅らされている程度を用いる。例えば、出力プロセス９が単位時間当たりのデータの読み込み頻度の少ない入力プロセス１０に追い着いてしまうといった状態が発生する回数を記録しておく。そして、この回数が予め決めておいたしきい値を越えた場合にバッファ１３の拡張を決定する。
【００７６】
ステップ１００２において、バッファ１３の拡張の必要がないと判断されたときは、バッファ管理部１１５はそのまま処理を終了する。一方、バッファ１３の拡張が必要であると判定された場合は、、次に、拡張するバッファの大きさを決定する（ステップ１００３）。このとき、１回あたりの拡張量としては、あらかじめオペレーティングシステムまたはユーザによって定められたバッファ上限値まで拡張してしまう方法、または、バッファのブロック数を所定の割合、あるいは所定の大きさづつ順次拡張していく方法などが考えられる。バッファ１３の拡張量が求められたら、続いて、計算された拡張量だけの拡張を行なうことができるかどうか、即ち、計算された拡張量に従ってバッファ１３を拡張した場合、バッファの大きさが上限値を越えないかどうか判定する（ステップ１００４）。拡張後のバッファ１３の大きさが上限値を越えてしまう場合は、その上限値を拡張後のバッファの大きさとすべく、拡張量を補正する（ステップ１００５）。その後、決定した拡張量に従ってバッファ１３を拡張する（ステップ１００６）。
【００７７】
最後に、データ引き継ぎ情報記録領域１２内の情報を更新する。具体的には、共通情報テーブル１２０１のバッファブロック数エリア１２０６に拡張後のブロック数を設定し、出力プロセス情報テーブル１２０２の出力ブロック番号エリア１２１０に［拡張前のバッファブロック数＋１］を格納する。これにより出力プロセスは、引き続き拡張した部分に対してデータの書き込みを続ける。
【００７８】
なお、拡張処理を実行している最中でも、入力プロセス側はそれを意識することなく通常の処理を続行していてよい。拡張処理実行中は出力プロセスの出力回数が変更されないので、入力プロセス群は出力プロセスに追い付いてもその直前で待ち状態となり、データの順序性は保証できる。
【００７９】
図１１は、本実施例において、リード制御部１１４が入力プロセス１０よりファイルへの読み込み要求を受け取った際に実行する処理のフローチャートである。図１１において、第１の実施例で図７により説明したライト処理制御部の処理と共通する部分については、図７と同一の参照番号が付されている。
【００８０】
本実施例では、リード処理制御部１１３は、ステップ７０６において出力プロセス９の待ち状態を検出すると、共通情報テーブル１２０１のバッファブロック数エリア１２０６を参照して現在のバッファ１３のブロック数が待ち合わせ基準ブロック数より小さいか判定する（ステップ９０１）。バッファ１３のブロック数が待合せ基準ブロック数より小さければ、第１の実施例における図７のステップ７０７と同様に、バッファ１３の各ブロックにある古いデータが、全ての入力プロセスから読み込まれているか否か判定する（ステップ９０２）。一方、バッファ１３のブロック数が待合せ基準ブロック数以上であれば、第２の実施例と同様にして、全ての入力プロセスによりデータが読み込まれたブロックの数が待合せ基準ブロック数に達したか否かを判定する（ステップ９０３）。ステップ９０２またはステップ９０３の条件が満たされる場合には、ステップ７０８において出力プロセス９の待ち状態を解除する。
【００８１】
以上説明したように、本実施例によれば、入力プロセスが複数存在する場合に、入力プロセス、出力プロセスの処理の特性に応じて適切な大きさのバッファを利用し、計算機資源を無駄に利用することなく処理を行なうことができる。また、バッファの大きさにあわせて各プロセスの待ち状態の設定、解除を行なうので、待ち状態の設定、解除に伴う処理のオーバヘッドの増加を抑え、各プロセスの並行処理を効率的に行なうことができる。
【００８２】
【発明の効果】
本発明によれば、ある１つのプロセスが生成したデータを複数のプロセスが参照するようなプロセス間でのデータの引き継ぎ処理が行われる計算機システムにおいて、各プロセスにおけるデータ入出力の頻度の相違に影響されることのなくプロセス間でのデータの引継ぎを行なうことが可能となり、システム全体としての処理をより高速化することができる。
【図面の簡単な説明】
【図１】一実施例における計算機システムのブロック図である。
【図２】ジョブ制御文の構成図である。
【図３】データ引き継ぎ領域の構成図である。
【図４】オープン処理制御部の処理フローチャートである。
【図５】クローズ処理制御部の処理フローチャートである。
【図６】第１の実施例におけるライト処理制御部の処理フローチャートである。
【図７】第１の実施例におけるリード処理制御部の処理フローチャートである。
【図８】バックアップ制御部の処理フローチャートである。
【図９】第３の実施例におけるライト処理制御部の処理フローチャートである。
【図１０】第３の実施例におけるリード処理制御部の処理フローチャートである。
【図１１】バッファ管理部の処理フローチャートである。
【符号の説明】
１…計算機システム、２…中央演算装置、３…主記憶装置、４…外部記憶装置、５…ジョブ制御文、６…ジョブ受付部、７…ジョブ制御文解析部、８…ジョブ起動部、９…出力プロセス、１０…入力プロセス、１１…データ引き継ぎ制御部、１２…データ引き継ぎ情報記録領域、１３…バッファ、１４…コピープロセス。
【図１】
0003598528.tif 000002
【図２】
0003598528.tif 000003
【図３】
0003598528.tif 000004
【図４】
0003598528.tif 000005
【図５】
0003598528.tif 000006
【図６】
0003598528.tif 000007
【図７】
0003598528.tif 000008
【図８】
0003598528.tif 000009
【図９】
0003598528.tif 000010
【図１０】
0003598528.tif 000011
【図１１】
0003598528.tif 000012