(57)【要約】【課題】並列Ｉ／Ｏを実行するジョブが、その並列Ｉ／Ｏ開始時点において、期待した並列度を得られるだけのＩ／Ｏノードを保有していない場合でも、一時的に必要数のＩ／Ｏノードを確保して、期待した並列度で並列Ｉ／Ｏを実施できるようにする。【解決手段】ジョブ開始時においては、期待した並列度で並列Ｉ／Ｏを実行できるだけの多数のＩ／Ｏノードを確保せず、少ない数のＩ／Ｏノードのみを確保しておく。そして、並列Ｉ／Ｏ開始時に、不足分のＩ／Ｏノードを並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部、Ｉ／Ｏノードグループ変更部により、他のジョブが保有する通常Ｉ／Ｏ用グループのＩ／Ｏノードから選択することにより、他の実行中のジョブから一時的に横取りする。また、Ｉ／Ｏノード管理テーブル、ジョブ管理テーブルにより、横取りしたＩ／Ｏノードの情報と横取りされたジョブのそれを同時に管理する。そのために、Ｉ／Ｏノードをグループ化する。【選択図】図３
2010271907.tif 000002
【特許請求の範囲】
【請求項１】
データを蓄積するファイルシステムと、
前記ファイルシステムにアクセスするＩ／Ｏノードと、
ジョブを実行し、Ｉ／Ｏ処理が発生した場合には、前記Ｉ／ＯノードにＩ／Ｏ要求を発行する計算ノードと、
ジョブのスケジューリングを行い、あるジョブに対して、当該ジョブの実行を停止させることなく、前記Ｉ／Ｏノードを動的に割り当てるジョブサーバーと
を具備し、
前記ジョブサーバーは、
ジョブ開始時においては、期待した並列度で並列Ｉ／Ｏを実行するために必要な数に満たない少数のＩ／Ｏノードを確保し、並列Ｉ／Ｏを実行する時に、不足分のＩ／Ｏノードを、他のジョブが保有するＩ／Ｏノードから一時的に横取りするＩ／Ｏノードスケジューラ
を具備する
Ｉ／Ｏノード制御方式。
【請求項２】
請求項１に記載のＩ／Ｏノード制御方式であって、
前記Ｉ／Ｏノードスケジューラは、横取りしたＩ／Ｏノードの情報、及びＩ／Ｏノードを横取りされたジョブの情報を同時に管理する
Ｉ／Ｏノード制御方式。
【請求項３】
請求項２に記載のＩ／Ｏノード制御方式であって、
前記Ｉ／Ｏノードスケジューラは、
Ｉ／Ｏノード番号、最大Ｉ／Ｏスレッド数、及びＩＰアドレスを関連付けて登録しているＩ／Ｏノード管理テーブルと、
ジョブ番号、計算ノード番号、及びＩ／Ｏノード番号を関連付けて登録しているジョブ管理テーブルと、
前記計算ノードから並列Ｉ／Ｏ用Ｉ／Ｏノード要求を受信し、前記Ｉ／Ｏノード管理テーブル、及び前記ジョブ管理テーブルを参照し、並列Ｉ／Ｏに使用できるＩ／Ｏノードを抽出する並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部と、
並列Ｉ／Ｏ用のＩ／Ｏノード割り当て時に、前記Ｉ／Ｏノード管理テーブルのグループの項目を通常Ｉ／Ｏ用グループから並列Ｉ／Ｏ用グループへ変更し、横取りジョブ番号と横取り計算ノード番号に、当該ジョブのジョブ番号と割り当てる計算ノードの番号を格納するＩ／Ｏノードグループ変更部と
を具備する
Ｉ／Ｏノード制御方式。
【請求項４】
請求項３に記載のＩ／Ｏノード制御方式であって、
前記並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部は、前記計算ノードから並列Ｉ／Ｏ終了通知を受信し、前記並列Ｉ／Ｏ終了通知に含まれるジョブ番号をキーにして、前記ジョブ管理テーブルを検索し、当該ジョブのエントリを特定し、前記特定されたエントリの中の計算ノード番号を抽出し、
前記Ｉ／Ｏノードグループ変更部は、並列Ｉ／Ｏ用Ｉ／Ｏノード解放時に、前記Ｉ／Ｏノード管理テーブル内の横取りジョブ番号、横取り計算ノード番号がジョブ番号、計算ノード番号と一致するエントリについて、グループの項目を並列Ｉ／Ｏ用グループから通常Ｉ／Ｏ用グループへ変更し、横取りジョブ番号、及び横取り計算ノード番号を消去する
Ｉ／Ｏノード制御方式。
【請求項５】
請求項１乃至４のいずれか一項に記載のＩ／Ｏノード制御方式であって、
前記Ｉ／Ｏノードは、
Ｉ／Ｏスレッドと送信スレッドを生成するＩ／Ｏデーモンと、
並列Ｉ／Ｏを実行する時に、並列Ｉ／Ｏを行うジョブ以外の他のジョブのＩ／Ｏデーモン及び当該Ｉ／Ｏデーモンの配下のスレッドを停止させるための処理を行い、並列Ｉ／Ｏを終了する時に、並列Ｉ／Ｏを行うジョブ以外の他のジョブのＩ／Ｏデーモン及び当該Ｉ／Ｏデーモンの配下のスレッドを再開させるための処理を行うＩ／Ｏデーモン停止／再開部と
を具備する
Ｉ／Ｏノード制御方式。
【請求項６】
請求項１乃至５のいずれか一項に記載のＩ／Ｏノード制御方式であって、
前記計算ノードは、
ジョブに属し、ユーザのアプリケーションプログラムを実行し、前記Ｉ／ＯノードへＩ／Ｏを要求するユーザプロセスと、
前記ユーザプロセスが同一ジョブ内の他の計算ノードのユーザプロセスと同期する必要がある場合、前記ユーザプロセスの動作を、前記同一ジョブ内の全てのユーザプロセスが同期ポイントに到達するまで待ち合わせる同期待ち部と、
前記ユーザプロセスの動作を、前記ジョブ管理デーモンが前記ジョブサーバー、及び前記各Ｉ／Ｏノードとの通信を終了するまで待ち合わせるＩ／Ｏノード待ち合わせ部と、
前記Ｉ／Ｏノードへ、当該ジョブのジョブ番号、及び計算ノード番号が含まれるＩ／Ｏノード変更要求を送信するＩ／Ｏノード割り当て変更部と
を具備する
Ｉ／Ｏノード制御方式。
【請求項７】
請求項１乃至６のいずれか一項に記載のＩ／Ｏノード制御方式で使用されるジョブサーバー。
【請求項８】
請求項１乃至６のいずれか一項に記載のＩ／Ｏノード制御方式で使用されるＩ／Ｏノード。
【請求項９】
請求項１乃至６のいずれか一項に記載のＩ／Ｏノード制御方式で使用される計算ノード。
【請求項１０】
Ｉ／Ｏノードから、データを蓄積するファイルシステムにアクセスすることと、
計算ノードで、ジョブを実行し、Ｉ／Ｏ処理が発生した場合には、前記Ｉ／ＯノードにＩ／Ｏ要求を発行することと、
ジョブサーバーで、ジョブのスケジューリングを行い、あるジョブに対して、当該ジョブの実行を停止させることなく、前記Ｉ／Ｏノードを動的に割り当てることと、
前記ジョブサーバーのＩ／Ｏノードスケジューラで、ジョブ開始時においては、期待した並列度で並列Ｉ／Ｏを実行するために必要な数に満たない少数のＩ／Ｏノードを確保することと、
前記Ｉ／Ｏノードスケジューラで、並列Ｉ／Ｏを実行する時に、不足分のＩ／Ｏノードを、他のジョブが保有するＩ／Ｏノードから一時的に横取りすることと
を含む
Ｉ／Ｏノード制御方法。
【請求項１１】
請求項１０に記載のＩ／Ｏノード制御方法であって、
前記Ｉ／Ｏノードスケジューラで、横取りしたＩ／Ｏノードの情報、及びＩ／Ｏノードを横取りされたジョブの情報を同時に管理すること
を更に含む
Ｉ／Ｏノード制御方法。
【請求項１２】
請求項１１に記載のＩ／Ｏノード制御方法であって、
前記Ｉ／Ｏノードスケジューラで、前記計算ノードから並列Ｉ／Ｏ用Ｉ／Ｏノード要求を受信することと、
Ｉ／Ｏノード番号、最大Ｉ／Ｏスレッド数、及びＩＰアドレスを関連付けて登録しているＩ／Ｏノード管理テーブルを参照することと、
ジョブ番号、計算ノード番号、及びＩ／Ｏノード番号を関連付けて登録しているジョブ管理テーブルを参照することと、
並列Ｉ／Ｏに使用できるＩ／Ｏノードを抽出することと、
並列Ｉ／Ｏ用のＩ／Ｏノード割り当て時に、前記Ｉ／Ｏノード管理テーブルのグループの項目を通常Ｉ／Ｏ用グループから並列Ｉ／Ｏ用グループへ変更することと、
横取りジョブ番号と横取り計算ノード番号に、当該ジョブのジョブ番号と割り当てる計算ノードの番号を格納することと
を更に含む
Ｉ／Ｏノード制御方法。
【請求項１３】
請求項１２に記載のＩ／Ｏノード制御方法であって、
前記Ｉ／Ｏノードスケジューラで、当該ジョブに既に割り当てられているＩ／Ｏノードが他のジョブに横取りされていないかを前記Ｉ／Ｏノード管理テーブルを参照してチェックすることと、
当該ジョブに既に割り当てられているＩ／Ｏノードが他のジョブに横取りされてしまっている場合、並列Ｉ／Ｏ用Ｉ／Ｏノードの確保を断念し、並列Ｉ／Ｏ用Ｉ／Ｏノードの確保を断念した旨を前記計算ノードに通知して処理を終了することと
を更に含む
Ｉ／Ｏノード制御方法。
【請求項１４】
請求項１３に記載のＩ／Ｏノード制御方法であって、
前記Ｉ／Ｏノードスケジューラで、当該ジョブに既に割り当てられているＩ／Ｏノードが他のジョブに横取りされていない場合、前記計算ノードが既に保有するＩ／Ｏノード数と並列Ｉ／Ｏに必要なＩ／Ｏノード数に基づき、当該ジョブに新たに割り当てが必要なＩ／Ｏノード数を算出することと、
必要な数のＩ／Ｏノードが確保できない場合、並列Ｉ／Ｏ用Ｉ／Ｏノードの確保を断念し、並列Ｉ／Ｏ用Ｉ／Ｏノードの確保を断念した旨を前記計算ノードに通知して処理を終了することと
必要な数のＩ／Ｏノードを確保できた場合、前記確保されたＩ／Ｏノードについて、Ｉ／Ｏノード管理テーブル内のグループの項目を通常Ｉ／Ｏ用グループから並列Ｉ／Ｏ用グループに変更することと、
横取りジョブ番号、及び横取り計算ノード番号へ、当該ジョブのジョブ番号、及び割り当てる計算ノード番号を設定することと、
前記計算ノードへ、前記設定されたＩ／Ｏノード番号を送信することと
を更に含む
Ｉ／Ｏノード制御方法。
【請求項１５】
請求項１４に記載のＩ／Ｏノード制御方法であって、
前記Ｉ／Ｏノードスケジューラで、前記計算ノードから並列Ｉ／Ｏ終了通知を受信することと、
前記並列Ｉ／Ｏ終了通知に含まれるジョブ番号をキーにして、前記ジョブ管理テーブルを検索し、当該ジョブのエントリを特定し、前記特定されたエントリの中の計算ノード番号を抽出することと、
並列Ｉ／Ｏ用Ｉ／Ｏノード解放時に、前記Ｉ／Ｏノード管理テーブル内の横取りジョブ番号、横取り計算ノード番号がジョブ番号、計算ノード番号と一致するエントリについて、グループの項目を並列Ｉ／Ｏ用グループから通常Ｉ／Ｏ用グループへ変更することと、
横取りジョブ番号、及び横取り計算ノード番号を消去することと、
前記Ｉ／Ｏノード情報テーブルにＩ／Ｏノード番号とジョブ番号を格納することと、
前記計算ノードへ、Ｉ／Ｏノードグループ変更終了通知としてＩ／Ｏノード番号を送信することと
を更に含む
Ｉ／Ｏノード制御方法。
【請求項１６】
請求項１０乃至１５のいずれか一項に記載のＩ／Ｏノード制御方法であって、
前記Ｉ／Ｏノードで、Ｉ／Ｏスレッドと送信スレッドを生成することと、
並列Ｉ／Ｏを実行する時に、並列Ｉ／Ｏを行うジョブ以外の他のジョブのＩ／Ｏデーモン及び当該Ｉ／Ｏデーモンの配下のスレッドを停止させるための処理を行うことと、
並列Ｉ／Ｏを終了する時に、並列Ｉ／Ｏを行うジョブ以外の他のジョブのＩ／Ｏデーモン及び当該Ｉ／Ｏデーモンの配下のスレッドを再開させるための処理を行うことと
を更に含む
Ｉ／Ｏノード制御方法。
【請求項１７】
請求項１０乃至１５のいずれか一項に記載のＩ／Ｏノード制御方法であって、
前記計算ノードで、ジョブに属するユーザプロセスにより、ユーザのアプリケーションプログラムを実行することと、
前記Ｉ／ＯノードへＩ／Ｏを要求することと、
前記ユーザプロセスが同一ジョブ内の他の計算ノードのユーザプロセスと同期する必要がある場合、前記ユーザプロセスの動作を、前記同一ジョブ内の全てのユーザプロセスが同期ポイントに到達するまで待ち合わせることと、
前記ユーザプロセスの動作を、前記ジョブ管理デーモンが前記ジョブサーバー、及び前記各Ｉ／Ｏノードとの通信を終了するまで待ち合わせることと、
前記Ｉ／Ｏノードへ、当該ジョブのジョブ番号、及び計算ノード番号が含まれるＩ／Ｏノード変更要求を送信することと
を更に含む
Ｉ／Ｏノード制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｉ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）ノード制御方式及び方法に関する。
【背景技術】
【０００２】
最近のＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）の高速化や、メモリの大容量化とメモリバンド幅の向上等より、Ｉ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）データ量もまた大規模化している。一方、特にＨＰＣ（Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｃｏｍｐｕｔｉｎｇ）の分野では、大規模ＳＡＮ（Ｓｔｏｒａｇｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）環境をベースとした高速ファイル共有システムや、複数のファイルサーバーを使用するクラスタファイルシステム等、大規模ファイルシステムが提供されており、これらの利用が一般化している。更に、ＭＰＩ−２（Ｍｅｓｓａｇｅ  Ｐａｓｓｉｎｇ  Ｉｎｔｅｒｆａｃｅ）では、並列Ｉ／Ｏのためのユーザインターフェースとして、ＭＰＩ−ＩＯが定義されており、利用者側から見た利便性も向上している。このため、ＨＰＣ分野におけるＩ／Ｏの重要度は今まで以上に向上していると考えられ、並列計算機上で動作する各ジョブが必要とするＩ／Ｏ資源（Ｉ／Ｏノード）の形態をジョブ管理の面からも無視できなくなっている。
【０００３】
しかし、従来のジョブスケジューラは、各ジョブから要求される資源として、主にＣＰＵ数や計算ノード数、及びメモリ容量を対象としており、Ｉ／Ｏ資源をジョブスケジューリングの対象とはしていなので、効率的なＩ／Ｏ資源の利用ができていない場合があった。また、ジョブスケジューラは、要求された資源を確保した後に実行を開始することを前提としている。これは、ジョブの実行時間全体の内、Ｉ／Ｏに要する時間はわずかであっても、実際にそれら資源がジョブ実行中の何時必要かがわからないため、必要なときのみ資源を割り当てるような動的な資源確保は困難であったためである。
【０００４】
また、並列計算機は、計算能力に主としてコストが掛けられることが多く、Ｉ／Ｏノードの数は計算ノードの数よりも少ないことが一般的である。しかし、並列Ｉ／Ｏを行うためには、それに見合った数のＩ／Ｏノードが必要である。このため、ＣＰＵやメモリ以上にＩ／Ｏノードは貴重な資源と捉える必要があり、より戦略的な資源の割り当てがなされるべきである。更に、ジョブ開始から終了までの時間の内Ｉ／Ｏを実行している時間は、僅かしかないと考えられる。特に、計算の終了時に各計算ノードがメモリ上に格納している計算結果のデータを一気にファイルシステムへ書き込む場合等、並列Ｉ／Ｏを必要とする場面は限られていると考えて良い。
【０００５】
このため、並列Ｉ／Ｏを行う場合、十分な並列度を確保するためには、計算ノード数に見合うＩ／Ｏノード数を当該ジョブに割り当てる必要があるが、そのために多数のＩ／Ｏノードをジョブ開始時に確保することは、無駄な資源確保となり、他のジョブがＩ／Ｏノードを確保できず、それらジョブの実行を阻害してしまうという問題がある。また、この問題を避けるために、各ジョブに均等にＩ／Ｏノードを割り振った場合は、並列Ｉ／Ｏを実行しても期待した並列度を確保出来ない場合がある。
【０００６】
図１に、この場合の一例を示す。
これは、時刻Ｔ１においてジョブ＃３が並列Ｉ／Ｏを開始するが、同時に実行されているジョブ＃１、＃２もＩ／Ｏノードを確保しているため、ジョブ＃３が並列Ｉ／Ｏを行うのに十分なＩ／Ｏノードを確保できず、Ｉ／Ｏ時間が多くかかってしまい、後から投入されたジョブ＃４の実行開始時期がその分だけ遅延されるという問題を示している。
【０００７】
一方、資源を動的に割り当てる機能を提供するものとしては、例えば、特開２００７−１１５２４６号公報（特許文献１参照）がある。特許文献１は、アプリケーションＡが資源を解放する前に、アプリケーションＢに資源を割り当てる場合の問題を解決するものである。これは、ソフトウェアへの資源の割り当てや解除にそのソフトウェアを関与させることによって可能になる。つまり、資源を確保しているアプリケーションＡが関与せずに、アプリケーションＢがそれら資源を動的に確保することはできない。このため、並列Ｉ／Ｏのように一時的に多量のＩ／Ｏ資源を要するような場合には不向きである。
【０００８】
また、他の手法として、ジョブ起動時の基本的なＩ／Ｏノードの割り当てにおいて、ジョブが要求したＩ／Ｏ資源が不足している場合、割り当てることができるＩ／Ｏ資源をのみ割り当て、そのジョブの実行を開始するものを考えている（現在出願中：特願２００８−０９５６５３）。これによれば、他のジョブが終了し、Ｉ／Ｏ資源が空いた時点で、Ｉ／Ｏ資源が不足した状態で動作しているジョブに対して、本来の要求量まで動的にＩ／Ｏ資源を増加させることができると考えられる。しかし、例えば、ＨＰＣの分野では、ジョブは常にＩ／Ｏ資源を使用している訳ではなく、Ｉ／Ｏを行うのは、ジョブの実行時間全体の一部のみと考えられる。特に、並列Ｉ／Ｏを行うジョブは、並列Ｉ／Ｏ中のみ多数のＩ／Ｏ資源が必要であり、それ以外の処理では、わずかなＩ／Ｏ資源のみを保有していれば良い。このようなＩ／Ｏ資源の要求量が動的に増減するような使用方法を実施するためには、Ｉ／Ｏ資源の要求量自体をジョブ実行中に動的に変化させる機能がなければならない。従って、複数のＩ／Ｏノードを使用して、複数の計算ノードから並列Ｉ／Ｏを並列ファイルシステムへ発行する場合において、並列Ｉ／Ｏに必要な並列度を確保でき、且つ無駄なＩ／Ｏ資源を確保しないような、動的Ｉ／Ｏ資源の確保機能を提供することが課題となる。
【０００９】
また、従来のＩ／Ｏノードの制御方法の一例が、電気通信回線を通じて、ｈｔｔｐ：／／ｓｃ０６．ｓｕｐｅｒｃｏｍｐｕｔｉｎｇ．ｏｒｇ／ｓｃｈｅｄｕｌｅ／ｐｄｆ／ｐａｐ１７８．ｐｄｆ（非特許文献１参照）に、利用可能になっている。非特許文献１は、『Ｊｏｓｅ  Ｍｏｒｅｉｒａ  ｅｔ  ａｌ．，  “Ｄｅｓｉｇｎｉｎｇ  ａ  Ｈｉｇｈｌｙ−Ｓｃａｌａｂｌｅ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ：  Ｔｈｅ  Ｂｌｕｅ  Ｇｅｎｅ／Ｌ  Ｓｔｏｒｙ”，  Ｉｎ  ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ＩＥＥＥ／ＡＣＭ  Ｓｕｐｅｒｃｏｍｐｕｔｉｎｇ  ＳＣ’０６，  Ｔａｍｐａ，  Ｎｏｖｅｍｂｅｒ  ２００６．』を電子化したものである。非特許文献１では、計算ノード上で要求されたＩ／Ｏ処理を、決められたＩ／Ｏノードへ送信し、Ｉ／Ｏノード上でファイルシステムに対してＩ／Ｏを発行することにより実現している。このような構成を有する従来のＩ／Ｏノードの処理方法は、次のように動作する。即ち、非特許文献１の３．３節に説明されているように、Ｉ／Ｏノードから対象とするファイルシステムを使用可能にしておく。そして、計算ノード上で呼び出されたＩ／Ｏを要求するシステムコールに基づくＩ／Ｏ要求をネットワークを経由して決められたＩ／Ｏノードへ送信し、Ｉ／Ｏノード上で「ＣＩＯＤ」と呼ばれるデーモン（ｄａｅｍｏｎ）を用いて、そのＩ／Ｏを該当するファイルシステムに対して実行する。Ｉ／Ｏノード上でのＩ／Ｏ処理が終了すると「ＣＩＯＤ」が要求元の計算ノードにＩ／Ｏ処理の結果を返送する。
【００１０】
しかし、この従来のＩ／Ｏノードの制御方法には、次のような問題点があった。
【００１１】
第１の問題点として、本システムで動作するジョブが必要とするＩ／Ｏ資源に依存せず、与えられるＩ／Ｏ資源は常に一定である。このため、効率的なＩ／Ｏ資源の割り当てができない。その理由は、非特許文献１の３．１節に記載の通り、１台のＩ／Ｏノードと複数の計算ノードを「ｐｓｅｔｓ」と呼ばれる集合と定義しているため、Ｉ／Ｏノードを計算ノードに動的に割り当てることができる構成ではないためである。
【００１２】
第２の問題点として、並列Ｉ／Ｏに必要な並列度が得られるだけのＩ／Ｏノード数が確保できるとは限らない。必要な並列度を得るためには、ハードウェア構成を変更しなければならない。その理由は、計算ノード数に対するＩ／Ｏノード数の比が固定されているためである。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開２００７−１１５２４６号公報
【非特許文献】
【００１４】
【非特許文献１】ｈｔｔｐ：／／ｓｃ０６．ｓｕｐｅｒｃｏｍｐｕｔｉｎｇ．ｏｒｇ／ｓｃｈｅｄｕｌｅ／ｐｄｆ／ｐａｐ１７８．ｐｄｆ
【発明の概要】
【発明が解決しようとする課題】
【００１５】
本発明の目的は、複数のＩ／Ｏノードを使用して、複数の計算ノードから並列Ｉ／Ｏを並列ファイルシステムへ発行する場合において、並列Ｉ／Ｏに必要な並列度を確保でき、且つ無駄なＩ／Ｏ資源を確保しない動的Ｉ／Ｏ資源の確保機能を有するＩ／Ｏノード制御方式及び方法を提供することである。
【課題を解決するための手段】
【００１６】
本発明のＩ／Ｏノード制御方式は、データを蓄積するファイルシステムと、ファイルシステムにアクセスするＩ／Ｏノードと、ジョブを実行し、Ｉ／Ｏ処理が発生した場合には、Ｉ／ＯノードにＩ／Ｏ要求を発行する計算ノードと、ジョブのスケジューリングを行い、あるジョブに対して、当該ジョブの実行を停止させることなく、Ｉ／Ｏノードを動的に割り当てるジョブサーバーとを具備する。ジョブサーバーは、ジョブ開始時においては、期待した並列度で並列Ｉ／Ｏを実行するために必要な数に満たない少数のＩ／Ｏノードを確保し、並列Ｉ／Ｏを実行する時に、不足分のＩ／Ｏノードを、他のジョブが保有するＩ／Ｏノードから一時的に横取りするＩ／Ｏノードスケジューラを具備する。
【００１７】
本発明のＩ／Ｏノード制御方法では、Ｉ／Ｏノードから、データを蓄積するファイルシステムにアクセスする。また、計算ノードで、ジョブを実行し、Ｉ／Ｏ処理が発生した場合には、Ｉ／ＯノードにＩ／Ｏ要求を発行する。また、ジョブサーバーで、ジョブのスケジューリングを行い、あるジョブに対して、当該ジョブの実行を停止させることなく、Ｉ／Ｏノードを動的に割り当てる。また、ジョブサーバーのＩ／Ｏノードスケジューラで、ジョブ開始時においては、期待した並列度で並列Ｉ／Ｏを実行するために必要な数に満たない少数のＩ／Ｏノードを確保する。また、Ｉ／Ｏノードスケジューラで、並列Ｉ／Ｏを実行する時に、不足分のＩ／Ｏノードを、他のジョブが保有するＩ／Ｏノードから一時的に横取りする。
【発明の効果】
【００１８】
あるジョブが並列Ｉ／Ｏを行う時のみ、他のジョブに割り当てられているＩ／Ｏノードを一時的に横取りすることで、ジョブ実行中であっても動的にＩ／Ｏノードをそのジョブが使用する計算ノードに割り当てることが可能となる。
【図面の簡単な説明】
【００１９】
【図１】並列Ｉ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）を行うのに十分なＩ／Ｏノードを確保できない場合を示す図である。
【図２】本発明のＩ／Ｏノード制御方式を備えた並列計算機システムの構成図である。
【図３】本発明のＩ／Ｏノード制御方式の構成例を示すブロック図である。
【図４】Ｉ／Ｏノード管理テーブルの例を示す図である。
【図５】ジョブ管理テーブルの例を示す図である。
【図６】そのジョブが保有するＩ／Ｏノードだけでは並列Ｉ／Ｏの実行には不足である時に、その不足分を他のジョブが保有しているＩ／Ｏノードから横取りする場合を示す図である。
【図７】並列Ｉ／Ｏ実行開始時の処理の例を示すシーケンス図である。
【図８】並列Ｉ／Ｏ用Ｉ／Ｏノード要求時のＩ／Ｏノードスケジューラの動作を示すフローチャートである。
【図９】並列Ｉ／Ｏ終了時の処理の例を示すシーケンス図である。
【図１０】並列Ｉ／Ｏ終了時のＩ／Ｏノードスケジューラの動作を示すフローチャートである。
【発明を実施するための形態】
【００２０】
以下に、本発明の実施形態について添付図面を参照して説明する。
図２に、本発明のＩ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）ノード制御方式を備えた並列計算機システムの構成図を示す。図２の並列計算機システムは、相互結合ネットワーク４と制御ネットワーク５に接続された複数の計算ノード３と、相互結合ネットワーク４と並列ファイルシステムを含む任意のファイルシステム６が構築されたＩ／Ｏシステムに接続された複数のＩ／Ｏノード２と、投入されるジョブの制御を行うジョブサーバー１を備えることを前提とし、特に並列Ｉ／Ｏ用のＩ／Ｏ資源の割り当てを行う。
【００２１】
つまり、図２の計算ノード３のうち任意の１つの計算ノードは、全てのＩ／Ｏノードと通信が可能である。その計算ノードは、どのＩ／Ｏノードを使用したとしても同じファイルシステムへアクセス可能であるので、任意の計算ノードとＩ／Ｏノードの組み合わせが可能である。このため、図２の並列計算機システムは、ジョブ実行中であっても動的にＩ／Ｏノードをそのジョブが使用する計算ノードに割り当てることが可能なシステム構成であることを前提としている。
【００２２】
即ち、本発明のＩ／Ｏノード制御方式は、Ｉ／Ｏノードを動的に割りてることによる、並列Ｉ／Ｏ実行時の資源割り当ての効率化を目的としており、ジョブサーバー１は、あるジョブが並列Ｉ／Ｏを行う時のみ、他のジョブに割り当てられているＩ／Ｏノードを一時的に横取りする。
【００２３】
なお、本発明の記述において、Ｉ／Ｏノードは、ネットワークファイルシステム等のサーバーとクライアントの関係があるファイルシステムのクライアントとなり得るコンピュータである。また、計算ノードは、Ｉ／Ｏ要求をＩ／Ｏノードへ転送し、実際のＩ／Ｏ処理をＩ／Ｏノードへ依頼するという仕組みを前提としている。
【００２４】
図３を参照して、本発明のＩ／Ｏノード制御方式の構成例について説明する。本発明のＩ／Ｏノード制御方式は、ジョブサーバー１と、Ｉ／Ｏノード２と、計算ノード３と、相互結合ネットワーク４と、制御ネットワーク５と、ファイルシステム６を含む。
【００２５】
ジョブサーバー１は、ジョブスケジューラ１０１を備える。ジョブスケジューラ１０１は、Ｉ／Ｏノードスケジューラ１０２と、既存コンポーネント１０３を備える。Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード登録部１０２−１と、Ｉ／Ｏノード管理テーブル１０２−２と、ジョブ管理テーブル１０２−３と、Ｉ／Ｏノード確保／解放部１０２−４と、Ｉ／Ｏノード設定ファイル１０２−５と、並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部１０２−６と、Ｉ／Ｏノード情報作成部１０２−７と、Ｉ／Ｏノード情報テーブル１０２−８と、Ｉ／Ｏノードグループ変更部１０２−９と、Ｉ／Ｏノード要求情報作成部１０２−１０を備える。
【００２６】
Ｉ／Ｏノード２は、通信デーモン２０１と、共通処理デーモン２０２と、送信スレッド（主送信スレッド）２０３と、Ｉ／Ｏデーモン２０４と、Ｉ／Ｏスレッド２０５と、送信スレッド（副送信スレッド）２０６を備える。通信デーモン２０１は、接続確立部２０１−１と、プロセス生成部２０１−２を備える。共通処理デーモン２０２は、受信部２０２−１と、スレッド生成部２０２−２と、ジョブテーブル操作部２０２−３と、通信バッファ２０２−４と、プロセス間通信部２０２−５と、プロセス生成部２０２−６と、ジョブ管理テーブル２０２−７と、Ｉ／Ｏデーモン終了部２０２−８と、Ｉ／Ｏデーモン停止／再開部２０２−９を備える。送信スレッド２０３は、送信部２０３−１と、通信バッファ２０３−２と、プロセス間通信部２０３−３を備える。Ｉ／Ｏデーモン２０４は、プロセス間通信部２０４−１と、スレッド生成部２０４−２と、Ｉ／Ｏスレッド管理テーブル２０４−３と、Ｉ／Ｏバッファ確保部２０４−４と、Ｉ／Ｏバッファ管理テーブル２０４−５と、Ｉ／Ｏバッファ待ち合わせ部２０４−６と、Ｉ／Ｏスレッド起動部２０４−７と、ファイル管理テーブル２０４−８を備える。Ｉ／Ｏスレッド２０５は、待ち合わせ部２０５−１と、Ｉ／Ｏ部２０５−２を備える。送信スレッド２０６は、プロセス間通信部２０６−１と、待ち合わせ部２０６−２を備える。
【００２７】
計算ノード３は、通信部３０１と、ジョブ管理デーモン３０２と、ユーザプロセス３０３と、Ｉ／Ｏリクエスト作成部３０４と、Ｉ／Ｏノード対応テーブル３０５と、マウント部３０６と、マウントポイント対応テーブル３０７と、並列Ｉ／Ｏ用Ｉ／Ｏノード要求部３０８と、同期待ち部３０９と、Ｉ／Ｏノード待ち合わせ部３１０と、Ｉ／Ｏノード割り当て変更部３１１と、並列Ｉ／Ｏ終了通知部３１２を備える。
【００２８】
これらは、それぞれ概略次のように動作する。
【００２９】
●ジョブサーバー１
ジョブサーバー１は、ユーザ投入したジョブの制御を行う。本発明の場合、ジョブスケジューラ１０１から呼び出されるＩ／Ｏノードスケジューラ１０２は、ジョブサーバー１上で実行される。また、ジョブサーバー１は、各計算ノード３と通信が可能である。
【００３０】
ジョブスケジューラ１０１は、Ｉ／Ｏノードスケジューラ１０２と、従来のジョブスケジューリングの機能である既存コンポーネント１０３を内包する。
【００３１】
Ｉ／Ｏノードスケジューラ１０２は、ジョブスケジューラ１０１から呼び出され、ジョブ毎のＩ／Ｏノードの割り当て、又は解放等に関連した処理を行う。
【００３２】
Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード登録部１０２−１は、Ｉ／Ｏノード設定ファイル１０２−５から「各Ｉ／Ｏノードの番号」、「最大Ｉ／Ｏスレッド数」、「ＩＰアドレス」を読み出し、Ｉ／Ｏノード管理テーブル１０２−２へ登録する。
【００３３】
Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード管理テーブル１０２−２は、Ｉ／Ｏノード登録部１０２−１により作成される。Ｉ／Ｏノード管理テーブル１０２−２の例を、図４に示す。図４に示すように、Ｉ／Ｏノード管理テーブル１０２−２は、「Ｉ／Ｏノード番号」と、「グループ」と、「横取りジョブ番号」と、「横取り計算ノード番号」と、「ＩＰアドレス」を含む。また、Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード管理テーブル１０２−２は、Ｉ／Ｏノード確保／解放部１０２−４、並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部１０２−６、Ｉ／Ｏノードグループ変更部１０２−９により、参照、更新される。
【００３４】
Ｉ／Ｏノードスケジューラ１０２内のジョブ管理テーブル１０２−３は、各ジョブが保有している計算ノードとそれに対応するＩ／Ｏノードとの対応のために使用する。ジョブ管理テーブル１０２−３の例を、図５に示す。図５に示すように、ジョブ管理テーブル１０２−３は、「ジョブ番号」と、「計算ノード番号」と、「Ｉ／Ｏノード番号」を含む。また、Ｉ／Ｏノードスケジューラ１０２内のジョブ管理テーブル１０２−３は、Ｉ／Ｏノード確保／解放部１０２−４、並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部１０２−６により、参照、更新される。
【００３５】
Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード確保／解放部１０２−４は、ジョブ起動時において、当該ジョブが要求するＩ／Ｏノード数分のＩ／Ｏノードの選択と確保を行う。また、Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード確保／解放部１０２−４は、ジョブ終了時において、当該ジョブが使用していたＩ／Ｏノードの解放を行う。また、Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード確保／解放部１０２−４は、上記の処理において、Ｉ／Ｏノード管理テーブル１０２−２、ジョブ管理テーブル１０２−３を検索、更新する。
【００３６】
Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード設定ファイル１０２−５は、「各Ｉ／Ｏノードの番号」、「最大Ｉ／Ｏスレッド数」、「ＩＰアドレス」を記録しておくファイルであり、ジョブサーバー１に直接接続されたディスク装置上に構築されたファイルシステムに保存されている。Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード設定ファイル１０２−５は、システム管理者がＩ／Ｏノードの設定を行う際に作成、変更される。また、Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード設定ファイル１０２−５は、ジョブサーバー１を起動する際に、Ｉ／Ｏノード登録部１０２−２により読み込まれる。
【００３７】
Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード確保／解放部１０２−６は、Ｉ／Ｏノード管理テーブル１０２−２へ反映されるＩ／Ｏノードスケジューラ１０２内の並列Ｉ／Ｏ用Ｉ／Ｏノードを確保したり解放したりする。また、Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード確保／解放部１０２−６は、計算ノード３から、並列Ｉ／Ｏ用Ｉ／Ｏノード要求を受信した際、Ｉ／Ｏノード管理テーブル１０２−２、ジョブ管理テーブル１０２−３を参照し、並列Ｉ／Ｏに使用できるＩ／Ｏノードを抽出する。また、Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード確保／解放部１０２−６は、並列Ｉ／Ｏ終了通知を受信した際、受信された「ジョブ番号」をキーにして、ジョブ管理テーブル１０２−３を検索し、当該ジョブのエントリを特定し、特定されたエントリの中の「計算ノード番号」を抽出する。なお、並列Ｉ／Ｏ終了通知には、終了したジョブの「ジョブ番号」（ＪＩＤ）が含まれる。
【００３８】
Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード情報作成部１０２−７は、Ｉ／Ｏノードの確保後、計算ノード毎にＩ／Ｏノード情報を作成する際に用いる。ここでは、Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード情報作成部１０２−７は、当該ジョブで使用する計算ノード数分のＩ／Ｏノード情報テーブルの領域をメモリ上に確保し、ジョブ管理テーブル１０２−３に登録した当該ジョブについて、計算ノード毎に対応する「Ｉ／Ｏノード番号」とその「ＩＰアドレス」を記録する。
【００３９】
Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード情報作成テーブル１０２−８は、上記のＩ／Ｏノード情報作成部１０２−７により作成され、計算ノード毎に対応するＩ／Ｏノードの情報を記録する。Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード情報作成テーブル１０２−８は、ジョブ起動時に一時的に作成される表である。
【００４０】
Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノードグループ変更部１０２−９は、並列Ｉ／Ｏ用のＩ／Ｏノード割り当て時において、図４に示すＩ／Ｏノード管理テーブル１０２−２の「グループ」の項目をＢグループ（「Ｂ」）からＡグループ（「Ａ」）へ変更する。更に、Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノードグループ変更部１０２−９は、「横取りジョブ番号」と「横取り計算ノード番号」に、当該ジョブの「ジョブ番号」と割り当てた「計算ノード番号」を格納する。また、Ｉ／Ｏノードグループ変更部１０２−９は、並列Ｉ／Ｏ用Ｉ／Ｏノード解放時において、Ｉ／Ｏノード管理テーブル１０２−２内の「横取りジョブ番号」、「横取り計算ノード番号」が「ジョブ番号」、「計算ノード番号」と一致する全てのエントリについて、Ａグループ（「Ａ」）からＢグループ（「Ｂ」）へ変更し、「横取りジョブ番号」と、「横取り計算ノード番号」を消去する。
【００４１】
Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード要求情報作成部１０２−１０は、Ｉ／Ｏノード要求情報をジョブスケジューラから、Ｉ／Ｏノードスケジューラを呼び出す際に渡される。この際、Ｉ／Ｏノードスケジューラ１０２内のＩ／Ｏノード要求情報作成部１０２−１０は、ジョブスケジューラから渡されたＩ／Ｏノード要求情報を参照し、Ｉ／Ｏノード数が「０」の場合、当該ジョブが必要とするＩ／Ｏ資源量（Ｉ／Ｏノード数）を推定し、Ｉ／Ｏノード数と各Ｉ／Ｏノードの占有率を決める。
【００４２】
既存コンポーネント１０３は、従来のジョブスケジューリングの機能を指す。従来のジョブスケジューリングの機能とは、例えば、計算ノードやＣＰＵ数の割り当て、メモリ、ＣＰＵの使用量等の資源管理機能、ジョブの優先度、実行中のジョブを任意の時点で停止させて当該ジョブの使用するメモリをファイルに記録するチェックポイント、又は同ファイルを基にチェックポイント時点から再実行するリスタート等のジョブ制御の機能と、各計算ノードとの通信機能のことである。
【００４３】
●Ｉ／Ｏノード２
Ｉ／Ｏノード２は、サーバー、クライアントの関係があるファイルシステムのクライアントとなり得るコンピュータである。本発明の場合、計算ノード３がＩ／Ｏ処理をＩ／Ｏノード２へ転送し、実際のＩ／Ｏ処理をＩ／Ｏノード２へ依頼するという仕組みを前提としている。また、本発明の場合、どのＩ／Ｏノード２からでも、同じファイルシステム６をアクセスできることを前提とする。即ち、複数のＩ／Ｏノード２の各々は、同じファイルシステム６をアクセスできるものとする。このため、各Ｉ／Ｏノード２は、同じパス名でファイルシステム６をマウントする必要がある。
【００４４】
通信デーモン２０１は、計算ノード３からの接続要求があると、接続を確立するためのデーモンであり、各Ｉ／Ｏノード２に１つ存在する。各Ｉ／Ｏノード２内の通信デーモン２０１は、接続要求があった計算ノード３との接続が確立すると、共通処理デーモン２０２を生成し、以後計算ノード３と通信は、共通処理デーモン２０２が行う。
【００４５】
通信デーモン２０１内の接続確立部２０１−１は、上記の通信デーモン２０１の接続確立のためのプリミティブ（ｐｒｉｍｉｔｉｖｅ）である。なお、プリミティブとは、ある大きな構造を表現するのに使われる最も基本的な構成要素を示す。
【００４６】
通信デーモン２０１内のプロセス生成部２０１−２は、共通処理デーモン２０２を生成するために使用する。通信デーモン２０１内のプロセス生成部２０１−２は、オペレーティングシステム（ＯＳ）が提供するプロセスを生成するためのシステムコールを利用する。
【００４７】
共通処理デーモン２０２は、計算ノード３からの接続要求毎に通信デーモン２０１によって生成される。また、共通処理デーモン２０２は、計算ノード３からのパケットの受信、及びＩ／Ｏデーモンへの送信を行う。
【００４８】
共通処理デーモン２０２内の受信部２０２−１は、計算ノード３と接続確立した際のソケットを使用し、当該計算ノード３から送信されるパケットの受信、待ち合わせを行うプリミティブである。
【００４９】
共通処理デーモン２０２内のスレッド生成部２０２−２は、送信スレッド２０３を生成する。また、共通処理デーモン２０２内のスレッド生成部２０２−２は、「ＰＯＳＩＸ（Ｐｏｒｔａｂｌｅ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ  Ｉｎｔｅｒｆａｃｅ  ｆｏｒ  ＵＮＩＸ（登録商標））」スレッド等、一般に利用可能なスレッドライブラリを利用する。
【００５０】
共通処理デーモン２０２内のジョブテーブル操作部２０２−３は、生成されたＩ／Ｏデーモン２０４の「プロセスＩＤ」（以下、ＰＩＤ）を対応する「ジョブ番号」（以下、ＪＩＤ）のエントリへ登録する。また、共通処理デーモン２０２内のジョブテーブル操作部２０２−３は、受信パケットを送信すべきＩ／Ｏデーモン２０４を特定するために、「ジョブ番号」（ＪＩＤ）をキーとして、ジョブ管理テーブル２０２−７を検索する。
【００５１】
共通処理デーモン２０２内の通信バッファ２０２−４は、計算ノード３から送信されるパケットを格納する。本発明の場合、Ｉ／Ｏデーモン２０４へ送信する際も、計算ノード３から受信する際と同じバッファを使用する。即ち、共通処理デーモン２０２内の通信バッファ２０２−４は、Ｉ／Ｏデーモン２０４へ送信するパケットを格納する。
【００５２】
共通処理デーモン２０２内のプロセス間通信部２０２−５は、共通処理デーモン２０２からＩ／Ｏデーモン２０４へＩ／Ｏ要求等を受け渡すために使用し、同じコンピュータ（Ｉ／Ｏノード）内でのプロセス間の通信のためのプリミティブである。
【００５３】
共通処理デーモン２０２内のプロセス生成部２０２−６は、ジョブ起動時において、共通処理デーモン２０２が、計算ノード３から初期化情報を受信した際、Ｉ／Ｏデーモンを生成するために使用するものである。共通処理デーモン２０２内のプロセス生成部２０２−６は、オペレーティングシステム（ＯＳ）が提供するプロセスを生成するためのシステムコールを利用する。
【００５４】
共通処理デーモン２０２内のジョブ管理テーブル２０２−７は、Ｉ／Ｏデーモン２０４とジョブの対応をとるため、当該ジョブのジョブＩＤとＩ／Ｏデーモン２０４の「プロセスＩＤ」、及び並列Ｉ／Ｏの目印を記録するための対応表である。
【００５５】
共通処理デーモン２０２内のＩ／Ｏデーモン終了部２０２−８は、ジョブ終了時に、共通処理デーモン２０２−１が計算ノード３からジョブの終了通知を受信した際に、当該ジョブに対応するＩ／Ｏデーモン２０４に終了シグナルを送信する。
【００５６】
共通処理デーモン２０２内のＩ／Ｏデーモン終了部２０２−９は、並列Ｉ／Ｏの実行開始時、及び終了時において、並列Ｉ／Ｏを行うジョブ以外の他のジョブのＩ／Ｏデーモンとその配下のスレッドを停止、再開させるための処理を行う。例えば、共通処理デーモン２０２内のＩ／Ｏデーモン終了部２０２−９は、並列Ｉ／Ｏを実行する時に、並列Ｉ／Ｏを行うジョブ以外の他のジョブのＩ／Ｏデーモンとその配下のスレッドを一時的に停止させるための処理を行う。また、共通処理デーモン２０２内のＩ／Ｏデーモン終了部２０２−９は、並列Ｉ／Ｏを終了する時に、並列Ｉ／Ｏを行うジョブ以外の他のジョブのＩ／Ｏデーモンとその配下のスレッドを再開させるための処理を行う。
【００５７】
送信スレッド２０３は、共通処理デーモン２０２が生成するスレッドであり、共通処理デーモン２０２とは独立に動作できるがメモリを共有できる。送信スレッド２０３は、Ｉ／Ｏ処理の実行結果等を当該計算ノード３へ返送するために使用する。
【００５８】
送信スレッド２０３内の送信部２０３−１は、計算ノード３と接続確立した際のソケットを使用し、当該計算ノードへパケットを送信するためのプリミティブである。
【００５９】
送信スレッド２０３内の通信バッファ２０３−２は、送信スレッド２０６からの受信、及び計算ノード３への送信の際に使用するバッファである。
【００６０】
送信スレッド２０３内のプロセス間通信部２０３−３は、送信スレッド２０６から送信されるデータを受信するために使用し、同じコンピュータ（Ｉ／Ｏノード）内でのプロセス間の通信のためのプリミティブである。
【００６１】
Ｉ／Ｏデーモン２０４は、Ｉ／Ｏスレッド２０５、Ｉ／Ｏバッファの管理、スレッドの生成等を行うデーモンであり、一般に複数のＩ／Ｏスレッド２０５と１つの送信スレッド２０６を生成する。Ｉ／Ｏデーモン２０４は、ジョブ毎に１つ存在する。
【００６２】
Ｉ／Ｏデーモン２０４内のプロセス間通信部２０４−１は、共通処理デーモン２０２が計算ノード３から受信したＩ／Ｏ要求等のパケットを受信するために使用し、同じコンピュータ（Ｉ／Ｏノード）内でのプロセス間の通信のためのプリミティブである。
【００６３】
Ｉ／Ｏデーモン２０４内のスレッド生成部２０４−２は、Ｉ／Ｏスレッド２０５と送信スレッド２０６を生成する。なお、Ｉ／Ｏデーモン２０４内のスレッド生成部２０４−２は、「ＰＯＳＩＸ」スレッド等、一般に利用可能なスレッドライブラリを利用する。
【００６４】
Ｉ／Ｏデーモン２０４内のＩ／Ｏスレッド管理テーブル２０４−３は、「ジョブ最大Ｉ／Ｏスレッド数」、「生成済みのＩ／Ｏスレッド数」、「現在Ｉ／Ｏ処理実行中のＩ／Ｏスレッド数」を管理する。また、Ｉ／Ｏデーモン２０４内のＩ／Ｏスレッド管理テーブル２０４−３は、当該Ｉ／Ｏスレッドが使用中であることを示すためにＩ／Ｏ実行中フラグを用いる。
【００６５】
Ｉ／Ｏデーモン２０４内のＩ／Ｏバッファ確保部２０４−４は、共通処理デーモン２０２から送信されるＩ／Ｏ要求等のパケットの受信バッファ、及びＩ／Ｏスレッド２０５がＩ／Ｏを発行するためのバッファを確保する。Ｉ／Ｏデーモン２０４内のＩ／Ｏバッファ確保部２０４−４は、Ｉ／Ｏ要求等のパケットを、共通処理デーモン２０２から受信し、Ｉ／Ｏ終了後、送信スレッド２０６が送信スレッド２０３へ送信するまでの間、同じバッファを使用するので、メモリ間のコピーをする必要がない。
【００６６】
Ｉ／Ｏデーモン２０４内のＩ／Ｏバッファ管理テーブル２０４−５は、図６に示すようなイメージでＩ／Ｏバッファを管理する。図６の詳細については後述する。また、Ｉ／Ｏデーモン２０４内のＩ／Ｏバッファ管理テーブル２０４−５は、Ｉ／Ｏバッファの現在の状態を示すために、受信待ちフラグ、Ｉ／Ｏ待ちフラグ、Ｉ／Ｏ実行中フラグ、返却待ちフラグを用いる。
【００６７】
Ｉ／Ｏデーモン２０４内のＩ／Ｏバッファ待ち合わせ部２０４−６は、Ｉ／Ｏバッファ確保部２０４−４によりＩ／Ｏバッファを確保しようとした際、既にＩ／Ｏバッファを確保できる上限値まで達しており確保できない場合がある。この場合、Ｉ／Ｏデーモン２０４内のＩ／Ｏバッファ待ち合わせ部２０４−６は、他の使用中のＩ／Ｏバッファが空くまで待ち合わせを行う。
【００６８】
Ｉ／Ｏデーモン２０４内のＩ／Ｏスレッド起動部２０４−７は、Ｉ／Ｏスレッド管理テーブル２０４−３を参照し、空きＩ／Ｏスレッドがあるかどうかを調べる。Ｉ／Ｏデーモン２０４内のＩ／Ｏスレッド起動部２０４−７は、空きスレッドがある場合、Ｉ／Ｏスレッド管理テーブル２０４−３から使用中ではない（Ｉ／Ｏで使用中を示すフラグが設定されていない）Ｉ／Ｏスレッドを１つ選び、選ばれたＩ／ＯスレッドにＩ／Ｏ処理中フラグを設定し、待ち合わせ部２０５−１でＩ／Ｏ要求を待ち合わせているＩ／Ｏスレッド２０５を再実行する処理を行う。
【００６９】
Ｉ／Ｏデーモン２０４内のファイル管理テーブル２０４−８は、計算ノード３で展開（「ｏｐｅｎ」）されたファイルと、Ｉ／Ｏノード２がマウントしているファイルシステム上のファイルとの対応を取るために使用する。また、Ｉ／Ｏデーモン２０４内のファイル管理テーブル２０４−８は、計算ノード３の「ＩＰアドレス」、Ｉ／Ｏを要求したプロセスの「プロセスＩＤ」（ＰＩＤ）、「ファイルディスクリプタ」（以下、ＦＤ）と、Ｉ／Ｏノード２上での「ファイルディスクリプタ」（ＦＤ）の対応を格納する。
【００７０】
Ｉ／Ｏスレッド２０５は、計算ノード３から要求されたＩ／Ｏ処理を実際に実行する。この際、Ｉ／Ｏスレッド２０５は、Ｉ／Ｏバッファ管理テーブル２０４−５から、Ｉ／Ｏ待ちフラグが設定されているＩ／Ｏバッファを１つ選択し、そのバッファ内容に応じてＩ／Ｏ対象を決める。Ｉ／Ｏスレッド２０５は、Ｉ／Ｏデーモン２０４が生成するスレッドであり、Ｉ／Ｏデーモン２０４とは独立に動作できるがメモリを共有できる。また、Ｉ／Ｏスレッド２０５は、「ジョブ最大Ｉ／Ｏスレッド数」まで、ジョブ毎に生成可能である。
【００７１】
Ｉ／Ｏスレッド２０５内の待ち合わせ部２０５−１は、計算ノード３からＩ／Ｏ要求が来るまで、待ち合わせを行う。また、Ｉ／Ｏスレッド２０５内の待ち合わせ部２０５−１は、Ｉ／Ｏ要求を受信すると、Ｉ／Ｏデーモン２０４がＩ／Ｏスレッド起動部２０４−７により再実行する。
【００７２】
Ｉ／Ｏスレッド２０５内のＩ／Ｏ部２０５−２は、計算ノード３からのＩ／Ｏ要求に基づき、「ｏｐｅｎ」／「ｒｅａｄ」／「ｗｒｉｔｅ」等々のシステムコールをＩ／Ｏノード２がマウントしているファイルシステムに対して実行し、実行が終了すると実行結果を加えた当該Ｉ／Ｏバッファに格納し、送信スレッド２０６を再実行する。
【００７３】
送信スレッド２０６は、Ｉ／Ｏ処理の終了したＩ／ＯバッファのＩ／Ｏ要求をＩ／Ｏバッファ管理テーブル２０４−５から１つ取り出し、プロセス間通信部２０６−１により、送信スレッド２０３へ送信する。
【００７４】
送信スレッド２０６内のプロセス間通信部２０６−１は、送信スレッド２０３へＩ／Ｏ処理が終了したＩ／Ｏバッファ内のデータを送信する。送信スレッド２０６内のプロセス間通信部２０６−１は、同じコンピュータ（Ｉ／Ｏノード）内でのプロセス間の通信のためのプリミティブである。
【００７５】
送信スレッド２０６内の待ち合わせ部２０６−２は、Ｉ／Ｏ処理が終了してからＩ／Ｏスレッド２０５により再実行されるまで、待ち合わせを行う。
【００７６】
●計算ノード３
計算ノード３は、一般に複数存在し、特定のジョブに属する複数のユーザプロセスにおいてユーザのアプリケーションプログラムを実行するコンピュータである。図２に示すように、計算ノード３は、ジョブサーバー１、任意のＩ／Ｏノード２、及び任意の（他の）計算ノード３と通信が可能である。
【００７７】
通信部３０１は、ジョブサーバー１、及びＩ／Ｏノード２と通信を行うための仕組み。
【００７８】
ジョブ管理デーモン３０２は、ジョブスケジューラ１０１からの通信を受け取り、各計算ノードにおけるジョブの起動等の制御を行う。
【００７９】
ユーザプロセス３０３は、一般に複数のユーザプロセスを含む。また、ユーザプロセス３０３は、ジョブサーバー１から起動される特定のジョブに属する。また、ユーザプロセス３０３は、ユーザのアプリケーションプログラムを実行し、必要に応じて、ライブラリ関数やシステムコールにより割り当てられたＩ／Ｏノード２へＩ／Ｏを要求する。
【００８０】
Ｉ／Ｏリクエスト作成部３０４は、ユーザプロセス３０３から、Ｉ／Ｏノード２がマウントしているファイルシステムへ「ｒｅａｄ」／「ｗｒｉｔｅ」やその他のファイル、ファイルシステムに対する操作を行う場合、その要求を対応するＩ／Ｏノード２へ送信するためのリクエストを作成する。また、Ｉ／Ｏリクエスト作成部３０４は、リトライする機能、及び他のＩ／Ｏノードが存在する場合、Ｉ／Ｏノードを切り替えてリトライする機能を持つ。
【００８１】
Ｉ／Ｏノード対応テーブル３０５は、計算ノード３に割り当てられたＩ／Ｏノード２の対応表である。また、Ｉ／Ｏノード対応テーブル３０５は、ジョブ毎に、対応するＩ／Ｏノードの「ＩＰアドレス」や、通信に用いるソケットを記録する。
【００８２】
マウント部３０６は、計算ノード３上のユーザプロセス３０３が、「ｏｐｅｎ」等ファイルやディレクトリのパス名を指定するシステムコールを呼び出したとき、Ｉ／Ｏノード２におけるパス名に変換する必要がある。そのため、マウント部３０６は、マウントコマンドで指定された計算ノード３のマウントポイントのパス名と、Ｉ／Ｏノード２でのマウントポイントのパス名の対応をマウントポイント対応テーブル３０７へ記録する。
【００８３】
マウントポイント対応テーブル３０７は、上記のマウントコマンドで指定された計算ノード３のマウントポイントのパス名と、Ｉ／Ｏノード２でのマウントポイントのパス名の対応を保持するためのテーブルである。
【００８４】
並列Ｉ／Ｏ用Ｉ／Ｏノード要求部３０８は、ジョブ管理デーモン３０２が、必要な「Ｉ／Ｏノード数」と当該ジョブの「ジョブ番号」をジョブサーバー１へ送信する際に使用する。
【００８５】
同期待ち部３０９は、計算ノード３内のユーザプロセス３０３が同一ジョブ内の他の計算ノードのユーザプロセスと同期する必要がある場合、ユーザプロセス３０３の動作を、同一ジョブ内の全てのユーザプロセスが同期ポイントに到達するまで待ち合わせるための処理を行う。すなわち、計算ノード３内のユーザプロセス３０３が同一ジョブ内の他の計算ノードのユーザプロセスと同期する必要がある場合、ユーザプロセス３０３は、同期待ち部３０９の機能により、同一ジョブ内の全てのユーザプロセスが同期ポイントに到達するまで待ち合わせる。
【００８６】
Ｉ／Ｏノード待ち合わせ部３１０は、計算ノード３の１つであるマスターノード上のユーザプロセス３０３の動作を、ジョブ管理デーモン３０２がジョブサーバー１、Ｉ／Ｏノード２との通信を終了するまで待ち合わせるための処理を行う。すなわち、計算ノード３がマスターノードである場合、ユーザプロセス３０３は、Ｉ／Ｏノード待ち合わせ部３１０の機能により、ジョブ管理デーモン３０２がジョブサーバー１、Ｉ／Ｏノード２との通信を終了するまで待ち合わせる。
【００８７】
Ｉ／Ｏノード割り当て変更部３１１は、通信部３０１を経由して当該Ｉ／Ｏノード２へＩ／Ｏノード変更要求を送信する際に用いる機能である。Ｉ／Ｏノード変更要求には、当該ジョブの「ジョブ番号」と、「計算ノード番号」が含まれる。
【００８８】
●相互結合ネットワーク４
相互結合ネットワーク４は、複数の計算ノード３を使用して並列処理を行うジョブにおいて、計算ノード３との間におけるデータやメッセージの交換、及び計算ノード３とＩ／Ｏノード２間におけるＩ／ＯデータとＩ／Ｏのための制御データの通信に用いる。また、相互結合ネットワーク４は、任意の計算ノード３との間、又は任意の計算ノード３とＩ／Ｏノード２間において、高速に通信が可能なネットワークとする。但し、相互結合ネットワーク４は、一般に利用可能な、「Ｅｔｈｅｒｎｅｔ（登録商標）」や「Ｉｎｆｉｎｉｂａｎｄ」等でも良い。
【００８９】
●制御ネットワーク５
制御ネットワーク５は、ジョブサーバー１と計算ノード３との間において、ジョブの起動、終了時において必要な通信を行う。また、制御ネットワーク５は、「Ｅｔｈｅｒｎｅｔ（登録商標）」等、一般に利用可能なネットワークを利用する。
【００９０】
●ファイルシステム６
ファイルシステム６は、Ｉ／Ｏノード２からアクセス可能である。ファイルシステム６の例として、「ＰＯＳＩＸ」等の一般的に知られたインターフェースを提供する任意の並列ファイルシステム、ネットワークファイルシステム、又はクラスタファイルシステム等が考えられる。また、ファイルシステム６は、システム管理者によって、Ｉ／Ｏノード２の起動時に各Ｉ／Ｏノード２から同じパス名をマウントポイントとしてマウントされていることを前提とする。なお、ファイルシステム６は、複数のファイルシステムをマウントする場合、ファイルシステム毎にマウントポイントのパス名を変更する必要があるが、各Ｉ／Ｏノード２からはファイルシステム毎に同じパス名でマウントする。
【００９１】
＜動作の説明＞
次に、本発明の実施形態の動作について詳細に説明する。
なお、ジョブサーバー１と計算ノード３、及び計算ノード３とＩ／Ｏノード２は、それぞれＴＣＰ／ＩＰ等の一般的な通信プロトコルを用いて通信できるものとする。また、それぞれのオペレーティングシステム（ＯＳ）は、「ＵＮＩＸ（登録商標）」や「Ｌｉｎｕｘ（登録商標）」等を前提とする。
【００９２】
◆基礎となるＩ／Ｏ資源の割り当て、及びＩ／Ｏ処理の動作
最初に、図３、図４、図５を参照して、並列Ｉ／Ｏが要求された場合の動作の説明に先立って、その基礎となるＩ／Ｏ資源の割り当て、及びＩ／Ｏ処理の動作を説明する。但し、Ｉ／Ｏノード登録時、ジョブ起動時、Ｉ／Ｏ実行時、ジョブ終了時について、処理が異なるので、これらを分けて記載する。
【００９３】
●Ｉ／Ｏノード登録時
ジョブサーバー１の起動時において、Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード管理テーブル１０２−２、ジョブ管理テーブル１０２−３の領域をメモリ上に確保し、Ｉ／Ｏノード登録部１０２−１によりＩ／Ｏノード設定ファイル１０２−５から「各Ｉ／Ｏノードの番号」、「最大Ｉ／Ｏスレッド数」、「ＩＰアドレス」を読み出し、Ｉ／Ｏノード管理テーブルへ登録する。また、システム運用中において、システム管理者は、管理用のコマンドを用いて上記と同様に「Ｉ／Ｏノードの番号」、「最大Ｉ／Ｏスレッド数」、「ＩＰアドレス」を入力することで、Ｉ／Ｏノードを追加することができる。
【００９４】
●ファイルシステムのマウント時
ファイルシステム６へ直接アクセスするのはＩ／Ｏノード２であり、Ｉ／Ｏを要求するのは計算ノード３である。従って、Ｉ／Ｏノード２がマウントしたファイルシステム６と計算ノード３との対応関係を示す情報が必要となる。このとき、ＮＦＳ等のネットワークファイルシステムをマウントする場合と同様なインターフェースを用い、あたかもＩ／Ｏノード２がネットワークファイルシステムのサーバーであるかのように、各計算ノード３からシステム管理者がマウントコマンドを実行する。
【００９５】
上記において、ファイルシステムタイプがＩ／Ｏノードであることを示している場合は、マウント部３０６により、指定されたＩ／Ｏノード２上のマウントポイントのパス名とそれに対する計算ノード３のマウントポイントのパス名の対応関係を示す情報をマウントポイント対応テーブル３０７の空きエントリに登録する。なお、マウントポイント対応テーブル３０７の領域は、計算ノード３の起動時にメモリ上に確保される。即ち、計算ノード３は、起動時に、マウントポイント対応テーブル３０７の領域をメモリ上に確保する。但し、Ｉ／Ｏノード２からファイルシステム６を使用できるように、予めシステム管理者がマウントしていることを前提とする。
【００９６】
●ジョブ起動時
ジョブサーバー１内のジョブスケジューラ１０１は、Ｉ／Ｏノード要求情報を作成し、Ｉ／Ｏノードスケジューラ１０２を呼び出す。Ｉ／Ｏノード要求情報には、「Ｉ／Ｏノード数」と、「計算ノード数」と、各計算ノードの「ＩＰアドレス」と、「要求するメモリ容量」と、「実装メモリ容量」が含まれる。但し、ジョブスケジューラ１０１は、「Ｉ／Ｏノード数」に関して、並列Ｉ／Ｏに十分な「Ｉ／Ｏノード数」をジョブ起動時には確保せず、例えば要求された「計算ノード数」の１／Ｎ（Ｎ：正の整数）のＩ／Ｏノードのみを要求する。そして、Ｉ／Ｏノード要求情報は、ジョブスケジューラ１０１から、Ｉ／Ｏノードスケジューラ１０２を呼び出す際に渡されることとする。即ち、ジョブスケジューラ１０１は、Ｉ／Ｏノードスケジューラ１０２を呼び出す際に、Ｉ／Ｏノードスケジューラ１０２にＩ／Ｏノード要求情報を渡す。
【００９７】
次に、Ｉ／Ｏノード確保／解放部１０２−４は、図４に示すようなＩ／Ｏノード管理テーブル１０２−２を検索し、Ｂグループ（「Ｂ」）のＩ／Ｏノードを抽出する。そして、Ｉ／Ｏノード確保／解放部１０２−４は、ジョブ管理テーブル１０２−３を検索し、それらＩ／Ｏノードの中から当該ジョブへ割り当てるＩ／Ｏノードを決める。但し、Ｉ／Ｏノード確保／解放部１０２−４は、要求された台数分のＩ／Ｏノードが確保できない場合は、要求された台数分のＩ／Ｏノードが確保できない旨のエラーをジョブスケージュラ１０１に返す。Ｉ／Ｏノード確保／解放部１０２−４は、要求された台数分のＩ／Ｏノードが確保できた場合は、確保できたＩ／Ｏノードを通常Ｉ／Ｏ用Ｉ／Ｏノード（Ｂグループ（「Ｂ」））として、Ｉ／Ｏノード管理テーブル１０２−２へ登録し、ジョブ管理テーブル１０２−３に当該ジョブのエントリを新たに確保し、「ジョブ番号」と、「計算ノード番号」と、それに対応する「Ｉ／Ｏノード番号」を格納する。
【００９８】
次に、Ｉ／Ｏノード情報作成部１０２−７は、計算ノード毎にＩ／Ｏノード情報を作成する。まず、Ｉ／Ｏノード情報作成部１０２−７は、当該ジョブで使用する計算ノード数分のＩ／Ｏノード情報テーブル１０２−８の領域をメモリ上に確保し、ジョブ管理テーブル１０２−３に登録した当該ジョブについて、各計算ノード３毎に対応する「Ｉ／Ｏノード番号」とその「ＩＰアドレス」を記録する。そして、Ｉ／Ｏノード情報作成部１０２−７は、制御権をジョブスケジューラ１０１へ返却する。ジョブスケジューラ１０１は、Ｉ／Ｏノード情報作成部１０２−７からの制御権の返却後、Ｉ／Ｏノード情報テーブル１０２−８の領域を解放する。
【００９９】
この後、ジョブスケジューラ１０１は、上記Ｉ／Ｏノード情報を含むジョブ起動に関する情報を各計算ノード３に送信する。
【０１００】
計算ノード３内の通信部３０１は、ジョブスケジューラ１０１からジョブ起動のための必要な情報を含むパケットを受信する。
【０１０１】
計算ノード３内のジョブ管理デーモン３０２は、通信部３０１がジョブスケジューラ１０１からジョブ起動のための必要な情報を含むパケットを受信すると、ユーザプロセス３０３を起動する前に、ジョブ毎にＩ／Ｏノード対応テーブル３０５の領域をメモリ上に確保し、Ｉ／Ｏノード対応テーブル３０５へ同パケット内に含まれるＩ／Ｏノード情報を当該ジョブの「ジョブ番号」（ＪＩＤ）と共に格納する。
【０１０２】
次に、ジョブ管理デーモン３０２は、当該Ｉ／Ｏノードとの通信のための接続が確立されていない場合は、通信部３０１により接続要求を行う。そして、ジョブ管理デーモン３０２は、この結果として作成されたソケットをＩ／Ｏノード対応テーブル３０５へ記録する。ジョブ管理デーモン３０２は、Ｉ／Ｏノードとの接続が確立されると、通信部３０１へ、当該ジョブの「ユーザＩＤ」（以下、ＵＩＤ）、「グループＩＤ」（以下、ＧＩＤ）、「補足グループＩＤ」等の認証情報、「ジョブ番号」（ＪＩＤ）、当該ジョブに許される生成可能なＩ／Ｏスレッド数として「ジョブ最大Ｉ／Ｏスレッド数」、及び初期化情報であることを示す識別子を含む初期化情報を送信する。
【０１０３】
通信部３０１は、上記の初期化情報を、相互結合ネットワーク４を介して、共通処理デーモン２０２へ送信する。
【０１０４】
Ｉ／Ｏノード２内の通信デーモン２０１は、各Ｉ／Ｏノード２に１つ存在し、計算ノード３からの接続要求があると、計算ノード３との接続確立後、共通処理デーモン２０２を１つ生成する。
【０１０５】
生成された共通処理デーモン２０２は、スレッド生成部２０２−２により送信スレッド２０３を生成する。その後、共通処理デーモン２０２は、通信バッファ２０２−４、ジョブ管理テーブル２０２−７の領域をメモリ上に確保し、受信部２０２−１により当該計算ノード３からの受信待ち状態となる。
【０１０６】
また、送信スレッド２０３は、通信バッファ２０３−２の領域をメモリ上に確保し、プロセス間通信部２０３−３によりＩ／Ｏの終了通知に対する受信待ち状態となる。
【０１０７】
次に、共通処理デーモン２０２は、計算ノード３から初期化情報を受信すると、プロセス生成部２０２−６によりＩ／Ｏデーモン２０４を生成し、ジョブテーブル操作部２０２−３によりＩ／Ｏデーモン２０４の「プロセスＩＤ」（ＰＩＤ）を生成し、生成された「プロセスＩＤ」（ＰＩＤ）をジョブ管理テーブル２０２−７の対応する「ジョブ番号」（ＪＩＤ）のエントリへ登録し、プロセス間通信部２０２−５により、同初期化情報を、生成されたＩ／Ｏデーモン２０４へ送信する。
【０１０８】
次に、生成されたＩ／Ｏデーモン２０４は、Ｉ／Ｏスレッド管理テーブル２０４−３、Ｉ／Ｏバッファ管理テーブル２０４−５、ファイル管理テーブル２０４−８の領域をメモリ上に確保し、Ｉ／Ｏバッファ確保部２０４−４によりＩ／Ｏバッファを固定長のバッファとして１つ確保して受信待ちを示すフラグを設定し、Ｉ／Ｏ管理テーブル２０４−５へ登録する。
【０１０９】
次に、Ｉ／Ｏデーモン２０４は、スレッド生成部２０４−２により、送信スレッド２０６を１つ生成する。そして、Ｉ／Ｏデーモン２０４は、確保したバッファを受信領域として、プロセス間通信部２０４−１により共通処理デーモン２０２に対して受信待ち状態となる。
【０１１０】
生成された送信スレッド２０６は、待ち合わせ部２０６−２により待ち合わせ状態となる。
【０１１１】
次に、Ｉ／Ｏデーモン２０４は、共通処理デーモン２０２から、初期化情報を受信すると、同情報内にある認証情報を基に、実効の「ユーザＩＤ」、「グループＩＤ」、「補足グループＩＤ」等を計算ノード３上のユーザプロセス３０３と同じ値に設定する。そして、Ｉ／Ｏデーモン２０４は、当該ジョブに許される生成可能なＩ／Ｏスレッド数として「ジョブ最大Ｉ／Ｏスレッド数」をＩ／Ｏスレッド管理テーブル２０４−３に登録する。その後、Ｉ／Ｏデーモン２０４は、再度、プロセス間通信部２０４−１により、共通処理デーモン２０２からの受信待ち状態となる。
【０１１２】
なお、共通処理デーモン２０２は、所定の計算ノード３と１対１の関係にある。通信デーモン２０１は、他の計算ノード３からの接続要求があった場合、その計算ノード３と接続を確立し、新たに共通処理デーモン２０２を生成する。
【０１１３】
●ジョブ終了時
計算ノード３内のジョブ管理デーモン３０２は、ユーザプロセス３０３が全て終了したことを検知すると、Ｉ／Ｏノード対応テーブル３０５を参照し、対応するＩ／Ｏノード２へジョブ終了通知を示すパケットを送信する。
【０１１４】
即ち、計算ノード３内の通信部３０１は、ジョブ終了通知であることを示す「パケット識別子」と、「計算ノード番号」、当該ジョブの「ジョブ番号」（ＪＩＤ）を格納したパケットを、対応するＩ／Ｏノード２へ送信する。その後、計算ノード３内の通信部３０１は、ジョブサーバー１のジョブスケジューラ１０１へ当該ジョブの終了通知を送信する。
【０１１５】
Ｉ／Ｏノード２内の共通処理デーモン２０２は、ジョブテーブル操作部２０２−３により、受信パケット内の「ジョブ番号」（ＪＩＤ）をキーとして、ジョブ管理テーブル２０２−７を検索し、当該ジョブに対応するＩ／Ｏデーモン２０４を特定し、そのエントリを削除する。そして、共通処理デーモン２０２は、Ｉ／Ｏデーモン終了部２０２−８により、Ｉ／Ｏデーモン２０４へ終了シグナルを送信し、Ｉ／Ｏデーモン２０４とその配下の全てのＩ／Ｏスレッド２０５と送信スレッド２０６を終了させる。この際、共通処理デーモン２０２は、Ｉ／Ｏデーモン終了部２０２−８により、確保されていたＩ／Ｏバッファ等の領域も全て解放する。
【０１１６】
ジョブサーバー１は、ジョブの終了通知を受信すると、ジョブスケジューラ１０１からＩ／Ｏノードスケジューラ１０２を呼び出し、Ｉ／Ｏノードスケジューラ１０２により、確保したＩ／Ｏノードの解放処理を行う。この際、ジョブスケジューラ１０１からＩ／Ｏノードスケジューラ１０２に、終了した「ジョブ番号」（ＪＩＤ）も渡される。即ち、ジョブサーバー１は、ジョブの終了通知を受信すると、ジョブスケジューラ１０１により、Ｉ／Ｏノードスケジューラ１０２に、終了したジョブの「ジョブ番号」（ＪＩＤ）を渡す。そして、Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード確保／解放部１０２−４により、「ジョブ番号」をキーとして、ジョブ管理テーブル１０２−３を検索し、該当するエントリを特定する。
【０１１７】
次に、Ｉ／Ｏノードスケジューラ１０２は、使用していた「計算ノード番号」と「Ｉ／Ｏノード番号」を抽出した後、ジョブ管理テーブル１０２−３の当該エントリを削除する。次に、Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード管理テーブル１０２−２を検索し、当該ジョブが使用していたＩ／Ｏノードのエントリを特定する。そして、Ｉ／Ｏノードスケジューラ１０２は、当該エントリの「グループ」がＡグループ（「Ａ」）であり、「横取りジョブ番号」と「横取り計算ノード番号」が、当該ジョブの「ジョブ番号」と「計算ノード番号」のいずれかと一致する場合は、「グループ」をＢグループ（「Ｂ」）に戻し、「横取りジョブ番号」と「横取り計算ノード番号」をクリアする。その後、Ｉ／Ｏノードスケジューラ１０２は、ジョブスケジューラ１０１に制御を戻す。
【０１１８】
●Ｉ／Ｏ実行時
計算ノード３上において、ジョブ内のユーザプロセス３０３は、「ｏｐｅｎ」／「ｒｅａｄ」／「ｗｒｉｔｅ」／「ｃｌｏｓｅ」等のＩ／Ｏに関係するシステムコールを呼び出し、Ｉ／Ｏを発行する。
【０１１９】
ユーザプロセス３０３は、呼び出したシステムコールの種別が「ｒｅａｄ」／「ｗｒｉｔｅ」である場合、一度にＩ／Ｏノード２に転送できるサイズ（以下、転送サイズ）と、「ｒｅａｄ」／「ｗｒｉｔｅ」等のシステムコールの引数として与えられたユーザ要求Ｉ／Ｏサイズを比較し、ユーザ要求Ｉ／Ｏサイズの方が大きい場合は転送サイズ毎に分割したサイズをＩ／Ｏサイズとして逐次に、処理を行う。
【０１２０】
Ｉ／Ｏリクエスト作成部３０４は、計算ノード３上で保持する当該ファイルの属性情報を示す「パケット識別子」を格納する。この属性情報の例として、当該ファイルの「ファイルディスクリプタ」（ＦＤ）、又はファイルやディレクトリのパス名、カレントディレクトリのパス名、システムコールを呼び出したプロセスの「プロセスＩＤ」（ＰＩＤ）と計算ノード３の「ＩＰアドレス」、当該ユーザプロセス３０３が属するジョブの「ジョブ番号」（ＪＩＤ）、認証情報（「ユーザＩＤ」、「グループＩＤ」、「補足グループＩＤ」等）が考えられる。また、システムコールの種別が「ｒｅａｄ」／「ｗｒｉｔｅ」の場合は、この属性情報の例として、更に、Ｉ／Ｏサイズ、現在のファイルオフセット、及びシステムコールの種別（「ｏｐｅｎ」，「ｒｅａｄ」，「ｗｒｉｔｅ」等）が考えられる。次に、Ｉ／Ｏリクエスト作成部３０４は、システムコールの種別が「ｗｒｉｔｅ」の場合は、「ｗｒｉｔｅ」データが格納されているメモリのアドレスからＩ／Ｏサイズ分の長さを読み出し、上記パケットの最後に付加する。上記において、Ｉ／Ｏリクエスト作成部３０４は、ファイルやディレクトリのパス名、及びカレントディレクトリのパス名について、マウントポイント対応テーブル３０７を検索し、計算ノード３上におけるパス名に対応するＩ／Ｏノード２でのルートファイルシステムからのフルパス名に変換する必要がある。そして、Ｉ／Ｏリクエスト作成部３０４は、Ｉ／Ｏノード対応テーブルを参照し、当該ジョブに対応するＩ／Ｏノード２のソケットを特定し、そのソケットを指定して同パケットを送信する。
【０１２１】
Ｉ／Ｏノード２において、共通処理デーモン２０２は、受信部２０２−１により、上記パケットを受信する。そして、共通処理デーモン２０２は、受信されたパケットのデータが格納されている通信バッファ２０２−４内の「ジョブ番号」（ＪＩＤ）を参照し、その「ジョブ番号」（ＪＩＤ）をキーとして、ジョブテーブル操作部２０２−３によりジョブ管理テーブル２０２−７を検索し、該当するＩ／Ｏデーモン２０４を特定する。そして、当該Ｉ／Ｏデーモン２０４へ受信したパケットをプロセス間通信部２０２−５により送信する。
【０１２２】
この後、Ｉ／Ｏデーモン２０４が、プロセス間通信部２０４−１により共通処理デーモン２０２から送信されたパケットを受信すると、受信バッファの格納されているバッファに対応するＩ／Ｏバッファ管理テーブル２０４−５のエントリにＩ／Ｏ待ちフラグを設定して受信待ちのフラグをクリアし、Ｉ／Ｏスレッド起動部２０４−７により、同パケット内のジョブ毎に生成可能な「最大Ｉ／Ｏスレッド数」をＩ／Ｏスレッド管理テーブル２０４−３に登録し、同テーブル内の下記を参照する。
【０１２３】
ａ：ジョブ最大Ｉ／Ｏスレッド数
ｂ：生成済みのＩ／Ｏスレッド数
ｃ：現在Ｉ／Ｏ処理実行中のＩ／Ｏスレッド数
（ａ，ｂ，ｃは、それぞれ０以上の整数値）
【０１２４】
この際、以下の３通りの条件があり得る。
ｂ  ＞  ｃ                    ―（１）
ｂ  ＜＝  ｃ，ｂ  ＜  ａ      ―（２）
ｂ  ＞＝  ａ                  ―（３）
【０１２５】
（１）の場合、空きスレッドがあるので、Ｉ／Ｏスレッド管理テーブル２０４−３から使用中ではない（Ｉ／Ｏで使用中を示すフラグが設定されていない）Ｉ／Ｏスレッドを１つ選び、それにＩ／Ｏ処理中フラグを設定し、待ち合わせ部２０５−１でＩ／Ｏ要求を待ち合わせているＩ／Ｏスレッド２０５を再実行する。
【０１２６】
（２）の場合、空きスレッドは存在しないが、まだ生成可能なので、スレッド生成部２０４−２は、新たなスレッドを生成し、Ｉ／Ｏスレッド管理テーブル２０４−３へ登録し、Ｉ／Ｏ処理中フラグを設定する。生成されたスレッドは、一旦待ち合わせ部２０５−１で停止するので、同Ｉ／Ｏスレッド２０５を再実行する。
【０１２７】
（３）の場合、空きスレッドがなく、且つ「ジョブ最大Ｉ／Ｏスレッド数」に達しているので、これ以上Ｉ／Ｏスレッドを生成することができない状態である。この場合、処理中のＩ／Ｏスレッド２０５が空くまで、Ｉ／Ｏバッファ管理テーブル２０４−５に繋がれたままとなる。
【０１２８】
この後、Ｉ／Ｏデーモン２０４は、再度、共通処理デーモン２０２からの受信待ちのために、Ｉ／Ｏバッファ確保部２０４−４によりＩ／Ｏバッファ管理テーブル２０４−５を参照し、使用中ではない（フラグが設定されていない）Ｉ／Ｏバッファを検索する。Ｉ／Ｏデーモン２０４は、使用中ではない（フラグが設定されていない）Ｉ／Ｏバッファが見つからない場合は、Ｉ／Ｏバッファ確保部２０４−４により新たにＩ／Ｏバッファを１つ確保して受信待ちフラグを設定し、Ｉ／Ｏバッファ管理テーブル２０４−５へ登録する。Ｉ／Ｏデーモン２０４は、使用中ではない（フラグが設定されていない）Ｉ／Ｏバッファが見つかった場合、Ｉ／Ｏバッファ確保部２０４−４によりそのエントリに受信待ちフラグを設定する。そして、Ｉ／Ｏデーモン２０４は、そのＩ／Ｏバッファを受信領域として、プロセス間通信部２０４−１により受信待ち状態となる。但し、Ｉ／Ｏデーモン２０４は、Ｉ／Ｏバッファを確保しようとした際、Ｉ／Ｏバッファ数が最大値に達している場合、Ｉ／Ｏバッファ待ち合わせ部２０４−６により、使用中のバッファが解放されるまで待ち合わせる。
【０１２９】
次に、Ｉ／Ｏスレッド２０５は、Ｉ／Ｏデーモン２０４から再実行されると、Ｉ／Ｏ部２０５−２により、Ｉ／Ｏバッファ管理テーブル２０４−５を検索し、Ｉ／Ｏ待ちを示すフラグが設定されているＩ／Ｏバッファを１つ選択し、同フラグをクリアし、Ｉ／Ｏ実行中フラグを設定する。次に、Ｉ／Ｏスレッド２０５は、同Ｉ／Ｏバッファを参照し、システムコールの種別（「ｏｐｅｎ」，「ｒｅａｄ」，「ｗｒｉｔｅ」等）を確認する。
【０１３０】
Ｉ／Ｏスレッド２０５は、システムコールの種別が「ｒｅａｄ」／「ｗｒｉｔｅ」以外で、引数にファイル又はディレクトリのパス名が指定されるシステムコール（「ｏｐｅｎ」等）の場合は、ファイル又はディレクトリのパス名、及びその他の引数を指定し、実際にそのシステムコール（「ｏｐｅｎ」等）を呼び出す。ここでは、Ｉ／Ｏスレッド２０５は、「ｏｐｅｎ」システムコールを呼び出す。
【０１３１】
Ｉ／Ｏスレッド２０５は、システムコールの種別が「ｒｅａｄ」／「ｗｒｉｔｅ」の場合は、既に当該ファイルに対して「ｏｐｅｎ」が実行されているので、ファイル管理テーブル２０４−８をＩ／Ｏバッファ内に格納されている計算ノード３の「ＩＰアドレス」、Ｉ／Ｏを要求したプロセスの「プロセスＩＤ」（ＰＩＤ）と、「ファイルディスクリプタ」（ＦＤ）をキーにして検索し、対応するＩ／Ｏノード２上の「ファイルディスクリプタ」（ＦＤ）を得る。
【０１３２】
次に、Ｉ／Ｏスレッド２０５は、「ｌｓｅｅｋ」システムコールを用いて、対象ファイルのオフセットを指定された位置に移動する。そして、Ｉ／Ｏスレッド２０５は、「ファイルディスクリプタ」（ＦＤ）、当該Ｉ／ＯバッファのＩ／Ｏデータの格納位置のアドレス、及びＩ／Ｏサイズを指定し、実際に「ｒｅａｄ」／「ｗｒｉｔｅ」システムコールを呼び出す。
【０１３３】
また、Ｉ／Ｏスレッド２０５は、システムコールの種別が「ｏｐｅｎ」／「ｒｅａｄ」／「ｗｒｉｔｅ」以外で、引数に「ファイルディスクリプタ」（ＦＤ）が指定されている場合は、既に当該ファイルに対して「ｏｐｅｎ」が実行されているので、ファイル管理テーブル２０４−８を、Ｉ／Ｏバッファ内に格納されている計算ノード３の「ＩＰアドレス」と、計算ノード３上でＩ／Ｏを要求したプロセスの「プロセスＩＤ」（ＰＩＤ）と、「ファイルディスクリプタ」（ＦＤ）をキーにして検索し、対応するＩ／Ｏノード２上の「ファイルディスクリプタ」（ＦＤ）を得る。次に、Ｉ／Ｏスレッド２０５は、指定されたシステムコールの種別に基づいて必要な引数を指定し、そのシステムコールを実行する。実行されたシステムコールは、対象ファイルが存在しない等のエラーが起きていない場合、戻り値として「ファイルディスクリプタ」（ＦＤ）を返す。
【０１３４】
次に、Ｉ／Ｏスレッド２０５は、実行されたシステムコールから復帰すると、システムコールの種別が「ｏｐｅｎ」の場合は、システムコールから戻り値として返された「ファイルディスクリプタ」（ＦＤ）を受け取る。Ｉ／Ｏスレッド２０５は、この「ファイルディスクリプタ」（ＦＤ）を、計算ノード３の「ファイルディスクリプタ」（ＦＤ）と、「ＩＰアドレス」と、計算ノード３上でＩ／Ｏを要求したプロセスの「プロセスＩＤ」（ＰＩＤ）と共に、当該Ｉ／Ｏバッファの所定の位置に格納する。
【０１３５】
また、Ｉ／Ｏスレッド２０５は、システムコールの種別が「ｏｐｅｎ」以外の場合は、戻り値とエラーコードを当該Ｉ／Ｏバッファの所定の位置に格納する。その後、Ｉ／Ｏスレッド２０５は、Ｉ／Ｏ実行中フラグをクリアし、返却待ちフラグを設定する。そして、Ｉ／Ｏスレッド２０５は、送信スレッド２０６を再実行する。そして、Ｉ／Ｏスレッド２０５は、再度、Ｉ／Ｏバッファ管理テーブル２０４−５を検索し、Ｉ／Ｏ待ちフラグが設定されたＩ／Ｏバッファがあれば、そのフラグをクリアしＩ／Ｏ実行中を設定し、Ｉ／Ｏ処理を行う。Ｉ／Ｏスレッド２０５は、Ｉ／Ｏ待ちフラグが設定されたＩ／Ｏバッファがなければ、待ち合わせ部２０５−１により待ち状態となる。
【０１３６】
再実行された送信スレッド２０６は、Ｉ／Ｏバッファ管理テーブル２０４−５に返却待ちフラグが設定されたＩ／Ｏバッファがあるかどうか調べる。送信スレッド２０６は、Ｉ／Ｏバッファ管理テーブル２０４−５に返却待ちフラグが設定されたＩ／Ｏバッファがない場合は、再度、待ち合わせ部２０６−２により、待ち合わせ状態になる。送信スレッド２０６は、Ｉ／Ｏバッファ管理テーブル２０４−５に返却待ちフラグが設定されたＩ／Ｏバッファがある場合、設定されている返却待ちフラグをクリアし、プロセス間通信部２０６−１により送信スレッド２０３へ送信する。また、この際、送信スレッド２０６は、Ｉ／Ｏバッファ待ち合わせ部２０４−６によりＩ／Ｏデーモン２０４がＩ／Ｏバッファが空くのを待ち合わせている場合は、Ｉ／Ｏデーモン２０４を再実行する。
【０１３７】
次に、送信スレッド２０３は、プロセス間通信部２０３−３により送信スレッド２０６からのパケットを受信し、送信部２０３−１により通信バッファ２０３−２に格納されている送信スレッド２０６から受信したデータを、当該計算ノード３へシステムコール返信パケットとして送信する。
【０１３８】
計算ノード３は、上記のシステムコール返信パケットを通信部３０１により受信する。計算ノード３は、受信したパケット内のエラー番号を参照し、「０」以外の値が入っている場合は、何らかのエラーが発生したことを示すので、システムコールの種別によらず、そのエラー番号と戻り値をそのままユーザプロセス３０３へ返して処理を終了する。また、計算ノード３は、エラー番号が「０」であり、システムコールの種別が「ｒｅａｄ」／「ｗｒｉｔｅ」以外であり、返却されるデータがある場合は、それをユーザプロセス３０３から指定されたアドレスへコピーし、戻り値をそのままユーザプロセス３０３へ返して処理を終了する。また、計算ノード３は、システムコールの種別が「ｒｅａｄ」／「ｗｒｉｔｅ」である場合、ファイルのオフセットに、戻り値の値を加算し、その戻り値をそのままユーザプロセス３０３へ返して処理を終了する。
【０１３９】
◆並列Ｉ／Ｏが要求された場合の動作
次に、図３、図４、図５、図７、図９、及び図８、図１０のフローチャートを参照して、並列Ｉ／Ｏが要求された場合の動作を詳細に説明する。但し、並列Ｉ／Ｏ実行開始時と、並列Ｉ／Ｏ終了時とでは、処理が異なるので、これらを分けて記載する。
【０１４０】
●並列Ｉ／Ｏ実行開始時
図７に示すように、並列Ｉ／Ｏの実行開始時において、計算ノード３からジョブサーバー１及びＩ／Ｏノード２へそれぞれ処理を依頼する。
【０１４１】
（１）ステップＳ１１
計算ノード３は、並列Ｉ／Ｏ用Ｉ／Ｏノード要求部３０８により、並列Ｉ／Ｏ用Ｉ／Ｏノード要求をジョブサーバー１へ送信する。
【０１４２】
（２）ステップＳ１２
ジョブサーバー１は、並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部１０２−６により、並列Ｉ／Ｏ用Ｉ／Ｏノードの確保を行う。
【０１４３】
（３）ステップＳ１３
また、ジョブサーバー１は、Ｉ／Ｏノードグループ変更部１０２−９により、Ｉ／Ｏノードグループの変更を行う。
【０１４４】
（４）ステップＳ１４
計算ノード３は、Ｉ／Ｏノード割り当て変更部３１１により、Ｉ／Ｏノードの割り当てを変更する。
【０１４５】
（５）ステップＳ１５
Ｉ／Ｏノード２は、Ｉ／Ｏデーモン停止／再開部２０２−９により、Ｉ／Ｏデーモンの再開を行う。
【０１４６】
（６）ステップＳ１６
Ｉ／Ｏノード２は、プロセス生成部２０２−６により、プロセスを生成する。
【０１４７】
（７）ステップＳ１７
計算ノード３は、並列Ｉ／Ｏを開始する。
【０１４８】
以下に、上記の処理の詳細について説明する。
【０１４９】
計算ノード３では、並列処理においては、予めジョブ毎にマスターノードとなる計算ノードが１つ決められており、当該ジョブ内の他の計算ノードは、スレーブノードとする。また、並列Ｉ／Ｏを行うためのプリミティブとして、並列Ｉ／Ｏライブラリを呼び出すこととする。なお、上記の並列Ｉ／Ｏライブラリとは、ＭＰＩ−ＩＯ等の一般に利用可能な並列Ｉ／Ｏライブラリに図３の計算ノード３内に示す機能を加えたものを想定している。このための実装として、例えば、ＭＰＩ−ＩＯ等と同じライブラリ名（関数名）やインターフェースを用いたライブラリ関数を作り、その関数の中で、本発明の必要な処理と、ＭＰＩ−ＩＯ等の関数を呼び出すようにしても良い。この場合、アプリケーションプログラムのソースコードを変更する必要はない。
【０１５０】
マスターノードのユーザプロセス３０３は、並列Ｉ／Ｏライブラリを呼び出すと、まずＩ／Ｏサイズを調べる。マスターノードのユーザプロセス３０３は、Ｉ／Ｏサイズが閾値よりも小さい場合は、Ｉ／Ｏノードを確保するためのオーバーヘッドが無視できなくなるため、例え並列度が確保できない場合でも、既に当該ジョブに割り当てられているＩ／Ｏノードのみで並列Ｉ／Ｏを行う。この場合、以降の処理は行われない。また、マスターノードのユーザプロセス３０３は、Ｉ／Ｏサイズが閾値以上である場合、ジョブ管理デーモン３０２に通知する。
【０１５１】
マスターノードのジョブ管理デーモン３０２は、ユーザプロセス３０３からの通知に応じて、並列Ｉ／Ｏ用Ｉ／Ｏノード要求部３０８により、必要な「Ｉ／Ｏノード数」と当該ジョブの「ジョブ番号」をジョブサーバー１へ送信する。その後、ジョブ管理デーモン３０２は、Ｉ／Ｏノード待ち合わせ部３１０により、Ｉ／Ｏノードが確保できるまで待ち合わせる。また、ジョブ管理デーモン３０２は、ジョブサーバー１からＩ／Ｏノード情報を受信するまで、受信待ち状態となる。
【０１５２】
なお、ユーザプロセス３０３は、スレーブノードが並列Ｉ／Ｏライブラリを呼び出した場合は、マスターノードが必要なＩ／Ｏノードを取得するための上記処理が終了するまで、同期待ち部３０９によりマスターノードが同期ポイントに到達まで待ち合わせる。
【０１５３】
その後、ジョブ管理デーモン３０２は、ジョブスケジューラ１内のＩ／Ｏノードスケジューラ１０２より、Ｉ／Ｏノード情報を受信する。次に、ジョブ管理デーモン３０２は、受信したＩ／Ｏノード情報を参照し、Ｉ／Ｏノード対応テーブル３０５の内容と比較して、当該計算ノードに対応するＩ／Ｏノードの組み合わせが異なっているかどうかを調べる。ジョブ管理デーモン３０２は、当該計算ノードに対応するＩ／Ｏノードの組み合わせが異なっている場合は、並列Ｉ／Ｏ用に確保されたＩ／Ｏノードであるので、まずＩ／Ｏノード対応テーブル３０５の当該エントリにそれを示す目印を付け、Ｉ／Ｏノード割り当て変更部３１１により、通信部３０１を経由して当該Ｉ／Ｏノード２へＩ／Ｏノード変更要求を送信する。このＩ／Ｏノード変更要求には、当該ジョブの「ジョブ番号」と、「計算ノード番号」が含まれる。その後、ジョブ管理デーモン３０２は、受信待ち状態となる。
【０１５４】
この後、ジョブ管理デーモン３０２は、各Ｉ／Ｏノード２からＩ／Ｏノード変更要求の終了通知を通信部３０１を経由して受信する。ジョブ管理デーモン３０２は、変更を要する全てのＩ／Ｏノード２からＩ／Ｏノード変更要求の終了通知を受信した後、Ｉ／Ｏノード待ち合わせ部３１０により、待ち状態のユーザプロセス３０３を起動する。次に、ユーザプロセス３０３は、同期待ち部３０９によりスレーブノード内のユーザプロセス３０３が全て同期ポイントに到達するまで同期待ち状態となる。
【０１５５】
当該ジョブ内の全計算ノード３（マスターノードと全スレーブノード）は、上記の同期ポイントに到達した時点で、並列Ｉ／Ｏに必要な並列度に見合うＩ／Ｏノード２が確保できたことになる。この場合、当該ジョブ内の同期ポイントで同期待ちをしていた全計算ノード３内のユーザプロセス３０３は、Ｉ／Ｏリクエスト作成部３０４により、実際のＩ／Ｏ処理を始める。このＩ／Ｏ処理自体は、上述の一般のＩ／Ｏ処理の説明の通りである。
【０１５６】
ジョブサーバー１は、計算ノード３（マスターノード）から、並列Ｉ／Ｏ用Ｉ／Ｏノード要求（「Ｉ／Ｏノード数」と当該ジョブの「ジョブ番号」）を受信すると、この並列Ｉ／Ｏ用Ｉ／Ｏノード要求をＩ／Ｏノードスケジューラ１０２に渡す。
【０１５７】
Ｉ／Ｏノードスケジューラ１０２は、並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部１０２−６により、まず、ジョブ管理テーブル１０２−３を参照し、既に当該ジョブに割り当てられている「Ｉ／Ｏノード番号」と「計算ノード番号」を抽出する。そして、Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード管理テーブル１０２−２を参照し、抽出された「Ｉ／Ｏノード番号」のＩ／Ｏノードのグループを確認する。Ｉ／Ｏノードスケジューラ１０２は、抽出された「Ｉ／Ｏノード番号」のＩ／ＯノードのグループがＡグループ（「Ａ」）である場合は、当該ジョブのＩ／Ｏノードは既に他のジョブに横取りされていることを示しているので、メモリ上に確保したＩ／Ｏノード情報テーブル１０２−８に「Ｉ／Ｏノード番号」を格納し、当該ジョブのマスターノードへ送信する。
【０１５８】
次に、Ｉ／Ｏノードスケジューラ１０２は、新たに割り当てが必要な「Ｉ／Ｏノード数」を算出し、Ｉ／Ｏノードグループ変更部１０２−９により、Ｉ／Ｏノード管理テーブル１０２−２内のＢグループ（「Ｂ」）のＩ／Ｏノードの内、当該ジョブが使用していないＩ／Ｏノードを抽出する。Ｉ／Ｏノードスケジューラ１０２は、他にＡグループ（「Ａ」）のＩ／Ｏノードがあり、必要数のＢグループ（「Ｂ」）のＩ／Ｏノードが存在しない場合は、メモリ上に確保したＩ／Ｏノード情報テーブル１０２−８に「Ｉ／Ｏノード番号」を格納し、当該ジョブのマスターノードへ送信する。Ｉ／Ｏノードスケジューラ１０２は、抽出されたＢグループ（「Ｂ」）のＩ／Ｏノードが必要数以上ある場合、これら抽出されたＩ／Ｏノードから実際にＡグループ（「Ａ」）へグループを変更する（横取りする）Ｉ／Ｏノードを選択する必要がある。この際、Ｉ／Ｏノードスケジューラ１０２は、なるべく各々のジョブに割り当てられているＩ／Ｏノード全てを奪わないように選択する。その理由は、１台でもＩ／Ｏノードが残されていれば、そのジョブは遅いながらもＩ／Ｏが可能になるためである。
【０１５９】
次に、Ｉ／Ｏノードスケジューラ１０２は、選択されたＩ／Ｏノードと元々当該ジョブに割り当てられていたＩ／Ｏノードについて、Ｉ／Ｏノードグループ変更部１０２−９により、Ｉ／Ｏノード管理テーブル１０２−２の「グループ」の項目をＢグループ（「Ｂ」）からＡグループ（「Ａ」）へ変更する。更に、Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード管理テーブル１０２−２の「横取りジョブ番号」と「横取り計算ノード番号」に、当該ジョブの「ジョブ番号」と割り当てた「計算ノード番号」を格納する。但し、Ｉ／Ｏノードスケジューラ１０２は、ジョブ管理テーブル１０２−３については、並列Ｉ／Ｏ終了後に元のジョブに戻す際に必要になるので、変更せず元の情報を残しておく。つまり、Ｉ／Ｏノードスケジューラ１０２は、ジョブ管理テーブル１０２−３に記載されているジョブ毎のＩ／Ｏノードの割り当てよりも、Ｉ／Ｏノード管理テーブル１０２−２の「グループ」毎のＩ／Ｏノードの割り当てを優先する。例えば、Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード管理テーブル１０２−２の「グループ」がＡグループ（「Ａ」）であれば、Ａグループ（「Ａ」）のＩ／Ｏノードの割り当てを優先する。
【０１６０】
この後、Ｉ／Ｏノードスケジューラ１０２は、メモリ上に確保したＩ／Ｏノード情報テーブル１０２−８に「Ｉ／Ｏノード番号」を格納し、当該ジョブの全計算ノードへ送信する。
【０１６１】
図８は、並列Ｉ／Ｏ用Ｉ／Ｏノード要求時のＩ／Ｏノードスケジューラ１０２のフローチャートである。
【０１６２】
（１）ステップＳ１０１
ジョブサーバー１は、マスターノードである計算ノード３から並列Ｉ／Ｏ用Ｉ／Ｏノード要求を受信すると、ジョブスケジューラ１０１によりＩ／Ｏノードスケジューラ１０２を呼び出す。
【０１６３】
（２）ステップＳ１０２
Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノード管理テーブル１０２−２を参照し、当該ジョブに既に割り当てられているＩ／Ｏノードが他のジョブに横取りされていないかをチェック（確認）する。
【０１６４】
（３）ステップＳ１０３
Ｉ／Ｏノードスケジューラ１０２は、当該ジョブに既に割り当てられているＩ／Ｏノードが他のジョブに横取りされてしまっている場合、並列Ｉ／Ｏ用Ｉ／Ｏノードの確保を断念し、Ｉ／Ｏノード情報として確保失敗を設定する。
【０１６５】
（４）ステップＳ１０４
そして、Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノードスケジューラから復帰し、Ｉ／Ｏノード情報をマスターノード（計算ノード３）に通知して処理を終える。
【０１６６】
（５）ステップＳ１０５
また、Ｉ／Ｏノードスケジューラ１０２は、当該ジョブに既に割り当てられているＩ／Ｏノードが他のジョブに横取りされていない場合、当該計算ノード３が既に保有するＩ／Ｏノードと並列Ｉ／Ｏに必要なＩ／Ｏノードの数から、当該ジョブに新たに割り当てが必要な「Ｉ／Ｏノード数」を算出する。
【０１６７】
（６）ステップＳ１０６
Ｉ／Ｏノードスケジューラ１０２は、「Ｉ／Ｏノード数」を算出した結果に基づいて、必要な数のＩ／Ｏノードが確保できないことがないかをチェック（確認）する。Ｉ／Ｏノードスケジューラ１０２は、必要な数のＩ／Ｏノードが確保できないことが判明した場合、上記と同様に、並列Ｉ／Ｏ用Ｉ／Ｏノードの確保を断念し、Ｉ／Ｏノード情報として確保失敗を設定して、Ｉ／Ｏノードスケジューラから復帰し、Ｉ／Ｏノード情報をマスターノードに通知して処理を終える。
【０１６８】
（７）ステップＳ１０７
次に、Ｉ／Ｏノードスケジューラ１０２は、必要な数のＩ／Ｏノードを確保できた場合、Ｉ／Ｏノードグループ変更部１０２−９により、選択されたＩ／Ｏノードについて、Ｉ／Ｏノード管理テーブル１０２−２内の「グループ」をＡグループ（「Ａ」）からＢグループ（「Ｂ」）に変更する。このとき、Ｉ／Ｏノードスケジューラ１０２は、「横取りジョブ番号」と、「横取り計算ノード番号」へ、当該ジョブの「ジョブ番号」と、割り当てる「計算ノード番号」を設定する。
【０１６９】
（８）ステップＳ１０８
最後に、Ｉ／Ｏノードスケジューラ１０２は、ジョブスケジューラ１０１に復帰後、各計算ノード３へＩ／Ｏノード情報（「Ｉ／Ｏノード番号」）を送信する。
【０１７０】
なお、Ｉ／Ｏノード２内の共通処理デーモン２０２は、通信デーモン２０１−１を経由してＩ／Ｏノード変更要求を受けると、まずジョブ管理テーブル２０２−７に登録されているＩ／Ｏデーモンのうち、受信された「ジョブ番号」のジョブ以外の全てに対して、Ｉ／Ｏデーモン停止／再開部２０２−９により、それらジョブに対応するＩ／Ｏデーモン２０４とその配下のＩ／Ｏスレッド２０５、送信スレッド２０６へ停止指示（「ＵＮＩＸ（登録商標）」等で使用される「ＳＴＯＰ」シグナルの送信）を行う。これにより、Ｉ／Ｏノード２は、当該Ｉ／Ｏノード２を割り当てられていた他のジョブの計算ノードからＩ／Ｏ要求を受信しても処理しなくなる。ここで、Ｉ／Ｏノード２内の共通処理デーモン２０２は、上記処理中に当該ジョブの「ジョブ番号」が既にジョブ管理テーブル２０２−７に登録されていた場合は、Ｉ／Ｏノード変更要求の終了通知をマスターノードである計算ノード３へ送信する。
【０１７１】
次に、Ｉ／Ｏノード２内の共通処理デーモン２０２は、ジョブ管理テーブル２０２−７に登録されていなかった場合は、プロセス生成部２０２−６により、新たにＩ／Ｏデーモン２０４を生成する。このとき、Ｉ／Ｏノード２内の共通処理デーモン２０２は、そのＩ／Ｏデーモン２０４の「プロセスＩＤ」と「ジョブ番号」を並列Ｉ／Ｏの目印を付けて登録する。そして、生成された同Ｉ／Ｏデーモン２０４は、スレッド生成部２０４−２によりＩ／Ｏスレッド、送信スレッドを生成し、Ｉ／Ｏスレッド管理テーブル２０４−３、Ｉ／Ｏバッファ管理テーブル２０４−５をメモリ上に確保し、生成されたＩ／Ｏスレッド２０５をＩ／Ｏスレッド管理テーブル２０４−３に登録する。その後、Ｉ／Ｏノード２内の共通処理デーモン２０２は、Ｉ／Ｏノード変更要求の終了通知を計算ノード３の内のマスターノードに送信する。
【０１７２】
元々、このＩ／Ｏノードを割り当てられていたジョブは、そのジョブが使用していたＩ／Ｏデーモンとその配下のＩ／Ｏスレッドが停止状態になっているので、他に利用可能なＩ／Ｏノードがなければ、計算ノードからＩ／Ｏを発行しても受付られず、リトライを繰り返すことになる。そして、このＩ／Ｏノードを横取りしたジョブの並列Ｉ／Ｏが終了した時点で、Ｉ／Ｏデーモン、Ｉ／Ｏスレッドの停止状態が解かれるので、リトライが成功し、再びＩ／Ｏが可能になる。このため、Ｉ／Ｏノードを横取りされるジョブに対しては、特別な処理は必要なく、且つＩ／Ｏデーモンは停止状態になるだけでなので、並列Ｉ／Ｏ終了時に、再度、Ｉ／Ｏデーモンを生成する必要はなく、即座にＩ／Ｏ処理を再開することができる。なお、計算ノード３は、Ｉ／Ｏリクエスト作成部３０４において、リトライする機能、及び他のＩ／Ｏノードが存在する場合、Ｉ／Ｏノードを切り替えてリトライする機能を持つ。
【０１７３】
●並列Ｉ／Ｏ終了時
図９に示すように、並列Ｉ／Ｏの終了時において、計算ノード３からジョブサーバー１、Ｉ／Ｏノード２へそれぞれ処理を依頼する。
【０１７４】
（１）ステップＳ２１
計算ノード３は、並列Ｉ／Ｏ終了通知部３１２により、並列Ｉ／Ｏ終了通知をジョブサーバー１へ送信する。
【０１７５】
（２）ステップＳ２２
ジョブサーバー１は、並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部１０２−６により、並列Ｉ／Ｏ用Ｉ／Ｏノードの解放を行う。
【０１７６】
（３）ステップＳ２３
また、ジョブサーバー１は、Ｉ／Ｏノードグループ変更部１０２−９により、Ｉ／Ｏノードグループの変更を行う。
【０１７７】
（４）ステップＳ２４
計算ノード３は、Ｉ／Ｏノード割り当て変更部３１１により、Ｉ／Ｏノードの割り当てを変更する。
【０１７８】
（５）ステップＳ２５
Ｉ／Ｏノード２は、Ｉ／Ｏデーモン停止／再開部２０２−９により、Ｉ／Ｏデーモンの停止を行う。
【０１７９】
（６）ステップＳ２６
Ｉ／Ｏノード２は、Ｉ／Ｏデーモン終了部２０２−８により、Ｉ／Ｏデーモンを終了する。
【０１８０】
（７）ステップＳ２７
計算ノード３は、並列Ｉ／Ｏを終了する。
【０１８１】
以下に、上記の処理の詳細について説明する。
計算ノード３では、並列Ｉ／Ｏが終了すると、スレーブノード内のユーザプロセス３０３は、同期待ち部３０９により、マスターノードが同期ポイントに到達するまで待ち合わせる。この後、マスターノードのユーザプロセス３０３は、ジョブ管理デーモン３０２に、並列Ｉ／Ｏが終わった旨を通知し、Ｉ／Ｏノード待ち合わせ部３１０により、並列Ｉ／Ｏの終了処理が終了するまで待ち状態となる。ジョブ管理デーモン３０２は、並列Ｉ／Ｏを行っていたジョブの「ジョブ番号」を含む並列Ｉ／Ｏ終了通知を並列Ｉ／Ｏ終了通知部３１２によりジョブサーバー１に送信し、受信待ち状態となる。
【０１８２】
その後、当該ジョブ内の各計算ノード３は、ジョブサーバー１からＩ／Ｏノードグループ変更終了通知を受信する。この際、ジョブ管理デーモン３０２は、Ｉ／Ｏノード対応テーブル３０５を検索し、並列Ｉ／Ｏ用に確保したことを示す目印のついたＩ／Ｏノード２を抽出する。ジョブ管理デーモン３０２は、そのＩ／Ｏノード２に、Ｉ／Ｏ割り当て変更部３１１を用いて、当該ジョブの「ジョブ番号」を含むＩ／Ｏノード復帰要求を通信部３０１を経由して送信する。
【０１８３】
この後、マスターノードのジョブ管理デーモン３０２は、各Ｉ／Ｏノード２からＩ／Ｏノード復帰要求の終了通知を通信部３０１を経由して受信する。マスターノードのジョブ管理デーモン３０２は、復帰を要する全てのＩ／Ｏノード２からＩ／Ｏノード復帰要求の終了通知を受信した後、Ｉ／Ｏノード待ち合わせ部３１０により、待ち状態のユーザプロセス３０３を起動する。このユーザプロセス３０３は、同期待ち部３０９によりスレーブノード内のユーザプロセス３０３が全て同期ポイントに到達するまで同期待ち状態となる。
【０１８４】
各計算ノード３内のユーザプロセス３０３は、当該ジョブ内の全計算ノード３（マスターノードと全スレーブノード）が上記同期ポイントに到達した時点で、並列Ｉ／Ｏのための全ての処理が終了したことになるので、並列Ｉ／Ｏライブラリからユーザプログラムへ復帰する。
【０１８５】
図１０は、並列Ｉ／Ｏ終了時のＩ／Ｏノードスケジューラ１０２のフローチャートである。
【０１８６】
（１）ステップＳ２０１
ジョブサーバー１は、マスターノードである計算ノード３から並列Ｉ／Ｏ終了通知を受信すると、ジョブスケジューラ１０１によりＩ／Ｏノードスケジューラ１０２を呼び出す。即ち、ジョブサーバー１は、並列Ｉ／Ｏ終了通知を受信すると、ジョブスケジューラ１０１によりＩ／Ｏノードスケジューラ１０２を起動する。
【０１８７】
（２）ステップＳ２０２
Ｉ／Ｏノードスケジューラ１０２は、並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部１０２−６により、受信された「ジョブ番号」をキーにして、ジョブ管理テーブル１０２−３を検索し、当該ジョブのエントリを特定し、特定されたエントリの中の「計算ノード番号」を抽出する。
【０１８８】
（３）ステップＳ２０３
次に、Ｉ／Ｏノードスケジューラ１０２は、Ｉ／Ｏノードグループ変更部１０２−９により、Ｉ／Ｏノード管理テーブル１０２−２内の「横取りジョブ番号」、「横取り計算ノード番号」が「ジョブ番号」、「計算ノード番号」と一致する全てのエントリについて、Ａグループ（「Ａ」）からＢグループ（「Ｂ」）へ変更し、「横取りジョブ番号」と、「横取り計算ノード番号」を消去する。
【０１８９】
（４）ステップＳ２０４
その後、Ｉ／Ｏノードスケジューラ１０２は、メモリ上に確保したＩ／Ｏノード情報テーブル１０２−８に「Ｉ／Ｏノード番号」と「ジョブ番号」を格納し、ジョブスケジューラ１０１に制御を返す。
【０１９０】
（５）ステップＳ２０５
ジョブサーバー１は、制御がＩ／Ｏノードスケジューラ１０２からジョブスケジューラ１０１に復帰した後、ジョブスケジューラ１０１により、各計算ノード３へＩ／Ｏノード情報（「Ｉ／Ｏノード番号」）を送信する。即ち、ジョブスケジューラ１０１は、Ｉ／Ｏノード情報テーブル１０２−８に格納された「Ｉ／Ｏノード番号」をＩ／Ｏノードグループ変更終了通知として、当該ジョブの全計算ノード３へ送信する。
【０１９１】
Ｉ／Ｏノード２内の共通処理デーモン２０２は、通信デーモン２０１−１を経由してＩ／Ｏノード復帰要求を受けると、まずジョブ管理テーブル２０２−７に登録されているＩ／Ｏデーモンのうち、受信された「ジョブ番号」のジョブ以外の全てに対して、Ｉ／Ｏデーモン停止／再開部２０２−９により、それらジョブに対応するＩ／Ｏデーモン２０４とその配下のＩ／Ｏスレッド２０５、送信スレッド２０６へ継続指示（例えば「ＵＮＩＸ（登録商標）」等で使用される継続シグナル「ＳＩＧＣＯＮＴ」の送信）を行う。これにより、停止させられていた他のジョブのＩ／Ｏデーモンとその配下のＩ／Ｏスレッド、送信スレッドが再び動作可能となる。なお、Ｉ／Ｏノードを横取りされたジョブが、並列Ｉ／Ｏの実行中に終了した場合は、そのジョブに対応するＩ／Ｏデーモンは既に終了しており、またジョブ管理テーブル２０２−７のエントリも既に削除されているため、何もする必要はない。
【０１９２】
次に、共通処理デーモン２０２は、ジョブ管理テーブル２０２−７に登録されているＩ／Ｏデーモン２０４の内、並列Ｉ／Ｏ用の目印が付いているＩ／Ｏデーモンについて、Ｉ／Ｏデーモン終了部２０２−８により、同Ｉ／Ｏデーモンとその配下のＩ／Ｏスレッドと送信スレッドを終了させる。その後、共通処理デーモン２０２は、終了通知をマスターノードである計算ノード３へ送信する。なお、共通処理デーモン２０２は、各テーブルやバッファへの参照／追加／更新の際は、排他制御を行い一貫性を保っている。
【０１９３】
以上のように、本発明では、図２に示すような、相互結合ネットワーク４と制御ネットワーク５に接続された複数の計算ノード３、相互結合ネットワーク４と並列ファイルシステムを含む任意のファイルシステム６が構築されたＩ／Ｏシステムに接続された複数のＩ／Ｏノード２、投入されるジョブの制御を行うジョブサーバー１等からなる並列計算機システムを前提とし、特に並列Ｉ／Ｏ用のＩ／Ｏ資源の割り当てを行うためのＩ／Ｏノードの制御方法に関する。
【０１９４】
つまり、図２の任意の１つの計算ノードは、全てのＩ／Ｏノードと通信が可能であり、その計算ノードは、どのＩ／Ｏノードを使用したとしても同じファイルシステムへアクセス可能であるので、任意の計算ノードとＩ／Ｏノードの組み合わせが可能である。このため、ジョブ実行中であっても動的にＩ／Ｏノードをそのジョブが使用する計算ノードに割り当てることが可能なシステム構成であることを前提としたＩ／Ｏノードの制御方法である。
【０１９５】
即ち、Ｉ／Ｏノードを動的に割りてることによる、並列Ｉ／Ｏ実行時の資源割り当ての効率化を目的とした発明であり、あるジョブが並列Ｉ／Ｏを行う時のみ、他のジョブに割り当てられているＩ／Ｏノードを一時的に横取りすることに特徴がある。
【０１９６】
本発明では、ジョブ開始時においては、期待した並列度で並列Ｉ／Ｏを実行できるだけの多数のＩ／Ｏノードを確保せず、少ない数のＩ／Ｏノードのみを確保しておく。そして、並列Ｉ／Ｏ開始時に不足するＩ／Ｏノードを並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部１０２−６、Ｉ／Ｏノードグループ変更部１０２−９により、他のジョブが保有するＢグループ（「Ｂ」）のＩ／Ｏノードから選択することにより、他の実行中のジョブから一時的に横取りする。
【０１９７】
また、本発明では、Ｉ／Ｏノード管理テーブル１０２−２、ジョブ管理テーブル１０２−３により、横取りしたＩ／Ｏノードの情報と横取りされたジョブのそれを同時に管理する。本発明では、並列Ｉ／Ｏが期待された並列度で実行できた場合、その分当該ジョブが早く終了することになるため、Ｉ／Ｏ資源だけではなく、ＣＰＵ、メモリ資源についても早く解放される。このため、実行待ちの他のジョブを早く実行開始させることも可能となる。
【０１９８】
一方、並列Ｉ／Ｏには、多数のＩ／Ｏノードが必要になるが、必要な「Ｉ／Ｏノード数」が確保できない場合、他のジョブがＩ／Ｏノードを解放するまで待ち合わせていると、その待ち時間の分だけＣＰＵ、メモリ等他の資源を確保している時間も長くなる。つまり、並列Ｉ／Ｏ実行時は、他のＩ／Ｏよりも緊急度が高いと考えて良い。このため、並列Ｉ／Ｏ実行時のみ他のジョブが保有するＩ／Ｏノードを横取りして、期待された並列度で並列Ｉ／Ｏを行えるようにする。Ｉ／Ｏ資源であるＩ／Ｏノードは、並列Ｉ／Ｏ用Ｉ／Ｏノード（Ａグループ（「Ａ」））、一般Ｉ／Ｏ用Ｉ／Ｏノード（Ｂグループ（「Ｂ」））の２つのグループに分けて、ジョブサーバー内のＩ／Ｏノードスケジューラが管理する。そして、Ａグループ（「Ａ」）のＩ／Ｏノードは、それを割り当てられたジョブの並列Ｉ／Ｏ以外のＩ／Ｏでは使用できないＩ／Ｏノードの集合とする。但し、これらグループは固定的に割り当てるのではなく、必要に応じて変更する。
【０１９９】
ジョブ開始時において、ジョブサーバー内のＩ／Ｏノードスケジューラは、並列Ｉ／Ｏに十分なＩ／Ｏノード数を確保せず、例えば要求された計算ノード数の１／Ｎ（Ｎ：正の整数）のＩ／Ｏノードのみを確保し、それらを通常Ｉ／Ｏ用Ｉ／Ｏノード（Ｂグループ（「Ｂ」））とし、それに合わせてＩ／Ｏノード管理テーブル、ジョブ管理テーブルへその情報を設定する。そして、そのジョブから並列Ｉ／Ｏが要求されると、そのジョブが保有するＩ／Ｏノードだけでは並列Ｉ／Ｏの実行には不足である場合、その不足分を他のジョブが保有しているＢグループ（「Ｂ」）のＩ／Ｏノードから選択し、Ｉ／Ｏノード管理テーブル、ジョブ管理テーブルを更新することにより、それらＩ／ＯノードをＡグループ（「Ａ」）に変更する。これにより、並列Ｉ／Ｏを実行しようとするジョブ以外からは使用不可となる。その後、並列Ｉ／Ｏが終了した時点で、Ｉ／Ｏノード管理テーブル、ジョブ管理テーブルを更新することで、使用したＩ／ＯノードをＡグループ（「Ａ」）からＢグループ（「Ｂ」）へ戻す。これにより、元々それらＩ／Ｏノードを保有していたジョブからも、再度、Ｉ／Ｏを発行できるようになる。
【０２００】
図６に、この場合の一例を示す。
これは、時刻Ｔ１において、ジョブ＃３が、同時に実行されているジョブ＃１、＃２の持つＩ／Ｏノードを一時的に横取りすることによって、ジョブ＃３が並列Ｉ／Ｏを行うのに十分なＩ／Ｏノードを確保でき、時刻Ｔ２に並列Ｉ／Ｏを終了できる状況を示している。ここでは、ジョブ＃１〜＃３が、同量のＩ／Ｏノードを保有している状態で、ジョブ＃３が並列Ｉ／Ｏを要求した時、ジョブ＃１、＃２の保有するＩ／ＯノードをＡグループ（「Ａ」）へ変更する。これにより、一時的にそれらＩ／Ｏノードをジョブ＃１、＃２から使用不可とし、ジョブ＃３が全てのＩ／Ｏノードを使用できるようにする。そして、ジョブ＃３の並列Ｉ／Ｏが終了した時点でＡグループ（「Ａ」）のＩ／ＯノードをＢグループ（「Ｂ」）に戻し、ジョブ＃１、＃２から、再度、使用可能な状態することを現している。
【０２０１】
また、並列Ｉ／Ｏを効率よく実行できたために、ジョブ＃３は、図１よりも早く終了でき、その分後続のジョブ＃４の実行開始時期を早めることもできる。更に、ジョブ＃１、＃２は、ジョブ＃３が並列Ｉ／Ｏを実行している間Ｉ／Ｏを行っていなければ、例えＩ／Ｏノードを横取りされたとしても、ジョブの実行が遅延することはない。これにより、複数のジョブを同時に実行させる場合、無駄にＩ／Ｏ資源を確保することなく、且つ並列Ｉ／Ｏを期待した並列度で実行できるようなＩ／Ｏ資源のスケジューリングが可能となる。
【０２０２】
本発明により、並列Ｉ／Ｏを実行するジョブが、その並列Ｉ／Ｏ開始時点において、期待した並列度を得られるだけのＩ／Ｏノードを保有していない場合でも、一時的に必要数のＩ／Ｏノードを確保して、期待した並列度で並列Ｉ／Ｏを実施できる。このことは、ジョブ実行中において、Ｉ／Ｏ資源の要求量を動的に変化させることでもある。その理由は、並列Ｉ／Ｏ開始時点において、不足分のＩ／Ｏノードを他のジョブが保有するＩ／Ｏノードから一時的に横取りし（Ｉ／Ｏ資源要求量の動的変化）、不足分を補うためである。
【０２０３】
また、本発明により、Ｉ／Ｏ資源を効率よく利用できる。その理由は、ジョブ開始時は、少ないＩ／Ｏノード数のみを確保してジョブの実行を開始し、並列Ｉ／Ｏを実行するときのみ、期待した並列度を得られるだけのＩ／Ｏノードを一時的に他のジョブから横取りして、並列Ｉ／Ｏが終了すれば、元のジョブにそれらＩ／Ｏノードを返すためである。このため、ジョブ投入時に並列Ｉ／Ｏに必要な全てのＩ／Ｏノードの確保を要求する必要はない。
【０２０４】
また、本発明により、後から投入された他のジョブの実行開始が遅延されることがなく、計算ノード（ＣＰＵ，  メモリ）等、Ｉ／Ｏ以外の資源も効率よく利用できる。その理由は、並列Ｉ／Ｏを実行する時のみ、それに必要な数のＩ／Ｏノードを確保するためである。つまり、本発明では、ジョブの実行開始から終了までの内、並列Ｉ／Ｏを行うための所要時間はわずかであると考えられる。それにもかかわらず、並列Ｉ／Ｏに必要なだけのＩ／Ｏノードを、ジョブ開始時に確保してしまうと、他のジョブが投入されても、必要な計算ノード数等の他の資源が確保できるにも関わらず、Ｉ／Ｏノードを確保できないために、実行を開始できないという不都合が生じる。
【０２０５】
また、本発明では、Ｉ／Ｏノードを横取りされたジョブであっても、必ずしも横取りされた時間だけそのジョブの実行時間が遅延されるとは限らない。ジョブは、必ずしも常にＩ／Ｏを行っている訳ではなく、特にＨＰＣ分野の場合、ジョブの実行時間の内Ｉ／Ｏを行っている時間はわずかであると考えられる。このため、横取りされている間にＩ／Ｏを要求しなければ、横取りされたジョブの実行時間に影響を与えない。
【０２０６】
また、本発明により、計算ノードは、Ｉ／Ｏチャネル等Ｉ／Ｏ関係のハードウェアに多くのコストを掛けることなく、並列Ｉ／Ｏを実現することができる。このため、ＣＰＵやメモリといった計算に直接関係のある資源にその分コストが掛けられる。その理由は、並列Ｉ／Ｏを行う時だけ多くのＩ／Ｏノードを要求すれば良いので、複数のジョブが実行されている場合でも限られたＩ／Ｏ資源を効率よく共用できるためである。
【０２０７】
本発明によれば、ＨＰＣ（Ｈｉｇｈ  Ｐｅｒｆｏｒｍａｎｃｅ  Ｃｏｍｐｕｔｉｎｇ）のような大規模なデータを高速に処理しなければならない分野において、必要な資源の異なる複数のジョブを並列計算機システム上で共用する場合等、Ｉ／Ｏ資源を含む計算資源を分割して使用するような環境で利用できる。
【０２０８】
以上、本発明の実施形態を詳述してきたが、実際には、上記の実施形態に限られるものではなく、本発明の要旨を逸脱しない範囲の変更があっても本発明に含まれる。
【符号の説明】
【０２０９】
１…  ジョブサーバー
１０１…  ジョブスケジューラ
１０２…  Ｉ／Ｏノードスケジューラ
１０２−１…  Ｉ／Ｏノード登録部
１０２−２…  Ｉ／Ｏノード管理テーブル
１０２−３…  ジョブ管理テーブル
１０２−４…  Ｉ／Ｏノード確保／解放部
１０２−５…  Ｉ／Ｏノード設定ファイル
１０２−６…  並列Ｉ／Ｏ用Ｉ／Ｏノード確保／解放部
１０２−７…  Ｉ／Ｏノード情報作成部
１０２−８…  Ｉ／Ｏノード情報テーブル
１０２−９…  Ｉ／Ｏノードグループ変更部
１０２−１０…  Ｉ／Ｏノード要求情報作成部
１０３…  既存コンポーネント
２…  Ｉ／Ｏノード
２０１…  通信デーモン
２０１−１…  接続確立部
２０１−２…  プロセス生成部
２０２…  共通処理デーモン
２０２−１…  受信部
２０２−２…  スレッド生成部
２０２−３…  ジョブテーブル操作部
２０２−４…  通信バッファ
２０２−５…  プロセス間通信部
２０２−６…  プロセス生成部
２０２−７…  ジョブ管理テーブル
２０２−８…  Ｉ／Ｏデーモン終了部
２０２−９…  Ｉ／Ｏデーモン停止／再開部
２０３…  送信スレッド（主送信スレッド）
２０３−１…  送信部
２０３−２…  通信バッファ
２０３−３…  プロセス間通信部
２０４…  Ｉ／Ｏデーモン
２０４−１…  プロセス間通信部
２０４−２…  スレッド生成部
２０４−３…  Ｉ／Ｏスレッド管理テーブル
２０４−４…  Ｉ／Ｏバッファ確保部
２０４−５…  Ｉ／Ｏバッファ管理テーブル
２０４−６…  Ｉ／Ｏバッファ待ち合わせ部
２０４−７…  Ｉ／Ｏスレッド起動部
２０４−８…  ファイル管理テーブル
２０５…  Ｉ／Ｏスレッド
２０５−１…  待ち合わせ部
２０５−２…  Ｉ／Ｏ部
２０６…  送信スレッド（副送信スレッド）
２０６−１…  プロセス間通信部
２０６−２…  待ち合わせ部
３…  計算ノード
３０１…  通信部
３０２…  ジョブ管理デーモン
３０３…  ユーザプロセス
３０４…  Ｉ／Ｏリクエスト作成部
３０５…  Ｉ／Ｏノード対応テーブル
３０６…  マウント部
３０７…  マウントポイント対応テーブル
３０８…  並列Ｉ／Ｏ用Ｉ／Ｏノード要求部
３０９…  同期待ち部
３１０…  Ｉ／Ｏノード待ち合わせ部
３１１…  Ｉ／Ｏノード割り当て変更部
３１２…  並列Ｉ／Ｏ終了通知部
４…  相互結合ネットワーク
５…  制御ネットワーク
６…  ファイルシステム
【図１】
2010271907.tif 000003
【図２】
2010271907.tif 000004
【図３】
2010271907.tif 000005
【図４】
2010271907.tif 000006
【図５】
2010271907.tif 000007
【図６】
2010271907.tif 000008
【図７】
2010271907.tif 000009
【図８】
2010271907.tif 000010
【図９】
2010271907.tif 000011
【図１０】
2010271907.tif 000012