お試し並列処理〜システム一時ファイルでプロセスの進行制御

参考にしたのは、こちらの記事
javaの1プロセスの中に複数のスレッドを立てたりして制御するには、こんな処理ももちろんあるわけだけれども、今は、複数のノードでの制御なので、Javaの外に制御用存在を置く

  • 想定実行条件
    • (1)今、kxN回のパーミュテーション処理をkプロセスに振り分ける状況を想定する
    • (2)第1プロセスにオリジナル検定セットを実行させ、その終了後に引き続きN回のパーミュテーション検定セットの実行をさせ、残りのk-1プロセスにはN回のパーミュテーション検定セットの実行をさせる。
    • (3)kプロセスはパーミュテーション試行において、オリジナル検定セットの結果を用いるので、オリジナル実行を行わないプロセスは、オリジナル検定セットの結果が出るまで、処理の開始を保留する
    • (4)第1プロセスは、オリジナル検定セットの結果をファイルに書き出し、k-1プロセスはこのオリジナル検定セット結果ファイルを読み取ることで、パーミュテーション試行結果をオリジナルのそれと比較することを可能にする
    • (5)各ノードはパーミュテーション検定セットが終了するたびに、処理の全体の進行と集計を管理するファイル(管理ファイル)を書き換えることによって、全プロセスの処理を統合した結果がファイルにてアップデートされる
    • (6)また、各プロセスは、管理ファイルを読み取ることで、自プロセスの継続・終了の判断を下す
    • (7)管理ファイルは、複数のプロセスが読み書きすることから、この読み書きは常に1プロセスのみに許可されることとする
  • 実装上の要件
    • (1)複数のプロセスは独立したコマンドにて発行する。ただし、そのプロセスは、総プロセス数と、各プロセスのプロセスIDを引数としてとる(通常の並列処理と同様)
    • (2)複数のプロセスは、シェルスクリプトにより、実行ノードが明示的に指定される。また、個々のプロセスは、実行の継続・終了の判断を、全プロセスの結果の集計結果ファイルを参照することによって、自律的に行えるように、個々のプロセスコードを工夫する
    • (3)k-1プロセスは、第1プロセスがオリジナル検定セットの結果が出るまで、開始が保留される。オリジナル検定セットは全体プロセス管理ファイルに決められた書式で書き出される決まりとし、その管理ファイルを参照し、書式に合致するまで空ループを回す
    • (4)パーミュテーション処理は、個々のプロセスで最大回数を指定し、繰り返し実行する。個々のパーミュテーション処理が終わったら、管理ファイルを読み込み、当該処理の終了以前の全プロセス集計結果を読み取り、当該処理の結果を加え、その更新結果を管理ファイルに書き込む
    • (5)複数プロセスの個々のパーミュテーション結果後に行われる、管理ファイルの読み取りと更新は、競合することは、管理ファイルの更新に失敗するという問題と、更新内容に齟齬が生じるという2点から、1度に1プロセスにのみ許可される仕組みが必要である。この仕組みを、システムファイルの作成・消去によって実現する。システム一時ファイルが存在しているときは、あるプロセスが管理ファイルの読み取り・更新をしているときであることとし、このシステム一時ファイルが存在しているときには、処理の進行が保留される。また、システム一時ファイルが存在していないとき、各プロセスは管理ファイルの読み取り・更新を行ってよいことになるので、システム一時ファイルの非存在を確認したら、まず、システム一時ファイルを作成し、そののち、管理ファイルの読み取りと更新を行い、その終了後に、システム一時ファイルの消去を行う。これにて、各プロセスは当該パーミュテーション試行の実行と記録が終了したことになり、次の試行に移行する
    • (6)終了。管理ファイルを読み込み、終了条件に合致していたら、自プロセスを終了する。すべてのプロセスは、順次、終了条件の合致を知ることとなり、最終的に、全プロセスが終了する