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