Transcript ppt
情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満 [email protected] 1 プロセス間通信 (IPC:Inter Process Communication) • プロセス間でデータのやり取りを行う機構 • マルチプロセス機能 – 1つの処理を複数のプロセスに分配 – データのやり取りと同期が必要 • 例) – X Window : XサーバとXクライアント – Webシステム:WebサーバーとPCブラウザ(クラ イアントプロセス) 2 プロセス間通信の機構 • パイプ: 1つのUNIXシステム内のプロセス • ソケット: インターネットの異なるUNIXシステ ム間でもOK – パイプやソケットにファイル記述子を介してアクセ ス – read(), write()システムコールでファイル同様の 入出力 • 共有メモリ 3 パイプとは? • • • • • • メモリ内に設けられるバッファリング領域 読み出し用の口と書き込み用の口 2つのプロセスをパイプで繋ぐ バッファリング領域 → 特別なファイル ファイル記述子を使ってアクセス ファイル記述子を共有できる親子関係,直系 の間柄のプロセス間通信 • 単方向パイプと双方向パイプ 4 パイプにおけるファイル記述子の共有 5 単方向パイプ 6 双方向パイプ 7 ファイル間チャネル(パイプ)の作成 #include <unistd.h> int pipe ( int fd[2] ); int fd[2] : ファイル記述子 ※正常終了すると値0を返し, エラーの場合には-1を返して外部変数errno にエラーを示す値をセット 引数fdで渡された2個の配列の各要素に(パイプの)ファイル記述子を格納して返す。 • fd[0] : 読み出しモードでオープンされたファイル記述子 • fd[1] : 書き込みモードでオープンされたファイル記述子 8 単方向パイプとファイル記述子 9 ファイル入出力 read() #include <unistd.h> ssize_t read( int fd, void *buf, size_t count ) int fd : ファイル記述子 void *buf : 入力バッファの先頭アドレス size_t count : 読み出しバイト数 ※正常終了すると実際に読み出されたバイト数を示す負でない 値を返し, エラーの場合には-1を返して外部変数errnoにエ ラーを示す値をセット 10 ファイル入出力 write() #include <unistd.h> ssize_t write( int fd, const void *buf, size_t count ) int fd : ファイル記述子 void *buf : 出力バッファの先頭アドレス size_t count : 書き込みバイト数 ※正常終了すると実際に書き込まれたバイト数を示す負でない 値を返し, エラーの場合には-1を返して外部変数errnoにエ ラーを示す値をセット 11 ファイルを閉じる close() #include <unistd.h> int close( int fd ) int fd : ファイル記述子 ※正常終了すると値0を返し, エラーの場合には-1を返して外 部変数errnoにエラーを示す値をセット 12 単方向パイプによるプロセス間通信 • 「simplex_pipe.c」 • 新たなプロセスを生成し,子プロセスから親プ ロセスにコマンド行から入力したメッセージを 送る 13 双方向パイプ 14 双方向パイプによるプロセス間通信 • 「duplex_pipe.c」 • 新たなプロセスを生成して,子プロセスと親プ ロセスとの間でコマンド行から入力したメッ セージ(文字列データ)を双方向にやりとり 15 パイプを用いたプロセス間通信 演習課題1 1. 「simplex_pipe.c」を変更。単方向パイプで int型の配列データを子プロセスから親プロ セスへ送り,親プロセスで受け取った後にそ の内容を表示するプログラムを作成せよ。 ※配列へのデータの与え方は,プログラム内 で与えても,ファイル読み出しで与えても, コマンドライン引数で与えてもよい。 16 パイプを用いたプロセス間通信 演習課題2 2.2つの未整列済みの整数列を用意。2つの 子プロセスを生成し,そのプロセスにそれら の配列をソートさせる(ソートの方法は何でも OK)。それぞれソートした整数配列を親プロ セスへ送り,親プロセスは受け取った2つの ソート済み整数配列をマージソートして,全体 的なソートを完成させるプログラムを作成せ よ。 17 参考資料 2ウェイ併合法(マージソート) • 主記憶上に入りきらないデータを整列する. 外部整列の一種 • 併合を用いる • ここでは,次の条件でのアルゴリズムを示す – キー集合は,ハードディスク上にn個のブロック に分割されて格納されている – 主記憶上には3ブロック分の大きさの作業領域 を確保できる 18 アルゴリズム 1. ディスクから3ブロックずつ取り出し,内部整 列を行いディスクに書き出す. n / 3 個のソート列が出来る. 2. 二つの部分ソート列を,一つに併合(マージ) することを繰り返す. 19 処理過程 20 併合(パス1)の流れ 21 併合操作 既に整列されている2つのデータ列:a, b 新しいデータ列:c データ列の先頭からの番号をそれぞれ i, j, pとする ①データ列a, bのどちらかの終末に来るまで以下を繰り返す ②aiとbjを比べ小さい方をcpにコピーし,小さい方のデータ列 の番号を1つ先に進める ③終末に達していないデータ列のデータを終末になるまでcに コピー 22 演習課題の提出 • 12/4(火)授業開始前まで • メール添付にて2つのソースファイル(課題、 2)を提出。 • メールタイトル: system8 学籍番号 苗字 (全て半角英数で) 23