ToDo:
プロトタイプ実装した際の並列制御の実装メモと問題点への考察をまとめておく
Frok[]した子プロセスで評価した値をShared[]経由で親プロセスが回収。 子プロセスとの同期には、SetPGID[]で割り当てたプロセスグループIDを 使ってブロッキングモードのWait4[]で待ち受ける。(子プロセス達の どれかが計算終了するまで親プロセスは休眠する) 子プロセスを回収後に新たな子プロセスをFrok[]する。
Shared[]の使いまわし可。
制御は比較的簡単に実装できるが、評価毎に Fork[]のコストが必要。
Fork[]した子プロセスとShared[]経由で評価すべき内容と結果をやりとりする。 Fork[]した時点で、評価関数と評価対象のリスト全体が複製されているので 評価の指示は、リスト上の位置情報で十分である。 プロセス間の相互の同期は、SYSV IPCや POSIX Semaphoreへの インターフェースが未実装なので、Pipe[](pipe(2))と SelectUnit(select(2))を使って同期を実装する。
子プロセスは親プロセスからパイプに合図が送られてくるのを selectで ブロッキングしながら待機し、合図が来たら Shared[]から評価要求を 受け取り、評価結果を Shared[]へ書き込み親プロセスへのパイプに 1byteの合図を書き込んで待機状態に戻る。
親プロセスは、旗下の子プロセス達のパイプから合図がくるのを selectで ブロッキングしながら待機し、合図が来たら Shared[]から評価結果を 受け取り、次の評価要求を Shared[]へ書き込んだ後、子プロセスへのパイプに 1byteの合図を書き込んで待機状態に戻る。
エラーハンドリングとしては、子プロセスが異常終了した場合に備えて、 ノンブロッキングモードのWait4[]で子プロセスを指定して生存を確認し、 死亡している場合は、パイプを再生成して Fork[]する。
Flush[]と Close[]の動作に要注意! パイプをFlush[]すると LFが送られることがあるので、 Flush[]の使用は避けること!
また、Close[]が、パイプを閉じるときに LFを送ることがある。 したがって、受信側のプロセスが死亡する前に送信側のパイプを Close[]しておかないと、Close[]実行時のLF送出に失敗して Broken pipeでアボートしてしまう。 (おそらく、Fortran I/Oライブラリ内で発生している)
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記