ネットワーク・プログラミング メッセージの作成とセマフォ.

Slides:



Advertisements
Similar presentations
ネットワーク・プログラミ ング カーネルの役割とプロセス生成. 1.1 OS の役割 仮想マシン OS はハードウェアの多様性 をカプセル化し、利用者を 複雑な処理から開放する。 プロセス管理 時間多重化により各プロセ スに CPU を割当てる。 メモリ管理 メモリ空間の多重化により、 各プロセスにメモリを割当.
Advertisements

プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
ファイルシステムの構造 外部記憶装置のパーティション(区画) ファイルシステムとパーティション(区画) ファイルシステムのmount
データ構造とアルゴリズム 第10回 mallocとfree
基礎プログラミングおよび演習 第9回
16.3 関数と構造体 構造体ポインタ 地底探査ゲーム
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
第13回 プログラミングⅡ 第13回
第8回 プログラミングⅡ 第8回
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
Ibaraki Univ. Dept of Electrical & Electronic Eng.
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
シグナル通信 普通の割込みとソフトウェア割込み ソフトウェア割込みとシグナル キーボードからのシグナル 例外 (exception)
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
第10回 プログラミングⅡ 第10回
TCP/UDP プロセス間の通信のためのプロトコル TCP:信頼性高、処理時間大 UDP:信頼性低、処理時間小 ftp SMTP HTTP
UDPエコーサーバ UDP-echoサーバのプログラムモデル(Cプログラム) サーバで利用するソケット関数(Cプログラム)
プログラミング応用 printfと変数.
マルチスレッド処理 マルチプロセス処理について
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング 4 記憶の割り付け.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
プログラミング演習I 2003年5月7日(第4回) 木村巌.
プログラミング入門2 第11回 情報工学科 篠埜 功.
前回の練習問題.
第7回 プログラミングⅡ 第7回
デジタル画像とC言語.
TCP/IPとプロセス間通信 2007年1月12日 海谷 治彦.
プログラミング基礎B 文字列の扱い.
ネットワーク・プログラミング ソケットオプションとスレッド.
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
プログラミング演習I 2004年5月19日(第5回) 理学部数学科・木村巌.
疑似乱数, モンテカルロ法によるシミュレーション
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岡村耕二 TCP通信プログラム 課題と回答例 岡村耕二 情報ネットワーク.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
ネットワーク・プログラミング デバイスドライバと環境変数.
ネットワーク・プログラミング Cプログラミングの基礎.
オペレーティングシステムJ/K (並行プロセスと並行プログラミング)
情報処理Ⅱ 2006年11月24日(金).
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
ネットワーク・プログラミング Linuxシステムとソフトウェア開発.
ネットワーク・プログラミング 非同期I/Oとスレッド同期制御.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
ネットワーク・プログラミング TCPサーバ.
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
モジュール分割.
ネットワーク・プログラミング ソケットプログラミングと共有メモリ.
プログラミング 4 文字列.
ネットワーク・プログラミング 1対多のプロセス間通信.
ネットワーク・プログラミング パイプライン通信とシグナル.
岡村耕二 UDP通信プログラム 課題と回答例 岡村耕二 情報ネットワーク.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
情報処理Ⅱ 第2回 2004年10月12日(火).
ネットワーク・プログラミング マルチタスク.
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
ネットワーク・プログラミング プロセスとファイルシステム管理.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング入門2 第5回 配列 変数宣言、初期化について
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
Presentation transcript:

ネットワーク・プログラミング メッセージの作成とセマフォ

全体の位置づけ オペレーションシステム(Linux) ソケットプログラミング プロセス カーネルとシステムコール プロセス間通信 スレッド クライアントーサーバ 非同期I/Oとマルチタスク

1.メッセージの作成 1.1 ASCIIで送信 ASCIIコードで数字を符号化 int型を文字型に変換する。 msgBufferサイズ=depositesの最大サイズ+withdrawalsの最大サイズ+区切りの数(2)+終了を表すNULL(1) #define BUFSIZE 132 char msgBuf[BUFSIZE]; sprintf(msgBuffer, “%d  %d “, deposites, withdrawals); send(s, msgBuffer, strlen(msgBuffer), 0); %dと%dの間はスペース(区切り) メッセージだけ送信する (msgBufferのメッセージ以外の領域は送信しない) BUFSIZEと指定 するとゴミが入る deposites スペース withdrawals msgBuffer 49 55 57 57 56 55 50 48 32 52 55 48 51 52 54 49 53 32 ‘1’ ‘7’ ‘9’ ‘9’ ‘8’ ‘7’ ‘2’ ‘0’ ‘ ’ ‘4’ ‘7’ ‘0’ ‘3’ ‘4’ ‘6’ ‘1’ ‘5’ ‘ ’

1.2 バイナリで送信 構造体を使う場合 個別に送信する場合 数字をバイナリ(int型)で送信する利点 1.2 バイナリで送信 構造体を使う場合 msgStruct.dep = deposites; msgStruct.wd = withdrawals; send (s, &msgStruct, sizeof (msgStruct), 0); 個別に送信する場合 send (s, &deposites, sizeof (deposites), 0); send (s, &withdrawals, sizeof (withdrawals), 0); 但し、UDPでは2つのパケットになる。 数字をバイナリ(int型)で送信する利点 (一般に)送信データ量が減る。 符号/復号化の手間を省くことが出来る。 数字をバイナリ(int型)で送信する欠点 int型の表現範囲は狭い。 (符号付き整数を2の補数で表す32ビットマシンでは、最大値2,147,483,647) 送信側と受信側で整数フォーマットが一致しない可能性がある。 プロトコルで符号化方法(2の補数、符号と絶対値、符号無し)を統一する必要がある。 構造体 struct{ int dep; int wd; } msgStruct;

プロセッサ固有のバイト順とネットワークバイト順が同じならば何もしない 1.3 バイト順 int deposites = 17998720; int withdrawals = 47034615; マシンアーキテクチャ ビッグエンディアン ワード(int型は4バイトが1ワード)の「最上位バイト」が最下位アドレス 68000ファミリ(Motorola社)、sparc(SUN社) リトルエンディアン ワードがビッグエンディアンと逆の順序 x86系(Intel社)、Alpha(DEC社) バイエンディアン 二つのモードを切り替え可能 MIPS、PowerPC(Apple社) データはアドレスの昇順に送信する。 ネットワークバイト順はビッグエンディアン htonl(): 4バイト値をプロセッサ固有からネットワークバイト順に変換。 htons():2バイト値の場合 ntohl(): 4バイト値をネットワークバイト順からプロセッサ固有に変換。 ntohs():2バイト値の場合 ネットワークへの送信順番 アドレス小 アドレス大 ビッグエンディアンのバイト列: 1 18 163 128 2 205 176 247 最上位バイト deposites withdrawals リトルエンディアンのバイト列: 128 163 18 1 247 176 205 2 deposites withdrawals 最上位バイト プロセッサ固有のバイト順とネットワークバイト順が同じならば何もしない msgStruct.dep = htonl(deposites); msgStruct.wd = htonl(withdrawals); send (s, &msgStruct, sizeof (msgStruct),0);

2. セマフォによる排他制御 プロセス A プロセス B 1 カーネル semget(); semget(); semop(); 2. セマフォによる排他制御 プロセスAとBは、 同じ鍵を持っている プロセス A プロセス B プロセスA semget(); semop(); プロセスB semget(); semop(); プロセス間通信 パイプライン シグナル 共有メモリ メッセージ通信 カーネル セマフォ セマフォ 1 ソケット カーネル 0: 使用中 1: 未使用

2.1 セマフォの操作 排他制御 セマフォ操作 排他制御の実施 2.1 セマフォの操作 排他制御 コンピュータ資源(ファイル、メモリ、ディスプレイ等)を複数プロセスが同時に利用することを防ぐこと。 セマフォ操作 アンロック: セマフォ値に+1たす。 ロック: セマフォ値に-1たす。 排他制御の実施 セマフォ値=1(未使用)の時  プロセスはセマフォ値を0にし、資源を使用する。 セマフォ値=0(使用中)の時  プロセスはセマフォ値が1になった時点でセマフォ値を0にし、資源を使用する。 使い終わったら+1たす (アンロック) 使う時 -1たす(ロック) プロセスA プロセスA A使用中 -1 +1 セマフォ 1 セマフォ セマフォ セマフォ 1 セマフォ 初期値=1 待ち解除 1(空き)になるまで待つ B使用中 プロセスB -1 ロック

semget セマフォを生成し、識別子を得る 2.2 システムコール semget(): セマフォの生成 key, semflg: 他のIPCと同じ。 nsems: 作成するセマフォ数。 semop(): セマフォの操作 semid: セマフォ識別子 struct sembuf { unsigned short int sem_num short int sem_op; short int sem_flg; } nsops: 操作するセマフォ数 semctl(): セマフォの制御 semnum: セマフォ番号 cmdの種類 IPC_STAT:セマフォ状態を得る IPC_SET:semid_ds構造体の値をセット IPC_RMID:セマフォを削除 GETVAL:セマフォ値を得る SETVAL: セマフォ値をセット semget セマフォを生成し、識別子を得る インクルードファイル #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> 書式 int semget(key_t key, int nsems, int semflg); 戻値 成功時 セマフォ識別子、 失敗時 -1 セマフォの番号 semop セマフォを操作 セマフォ値にたす値。+1又は、-1 インクルードファイル #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> 書式 int semop(int semid, struct sembuf *sops, unsigned int nsops); 戻値 成功時 0、 失敗時 -1 semctl セマフォを制御 インクルードファイル #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> 書式 int semctl(int semid, int semnum, int cmd, …); 戻値 成功時 cmdによって決まる 失敗時 -1 cmdに依存

2.3 セマフォを使ったプログラム writer(画面に数字を書く) cleaner(画面の数字を消す) セマフォをロックする。 2.3 セマフォを使ったプログラム writer(画面に数字を書く) セマフォ識別子を獲得する。 以下を繰返す: セマフォをロックする。 画面に数字(0~4)を書く。 セマフォをアンロックする。 cleaner(画面の数字を消す) カーソルを後退し(ランダムな数だけ)数字を消す。 [oida@rpc261 soft2]$ ./seminit [oida@rpc261 soft2]$ ipcs -s ------ セマフォ配列 -------- キー semid 所有者 権限 nsems 状態 0x61018090 163842 oida 666 1 [oida@rpc261 soft2]$ ./writer & ./cleaner [1] 1572 0010100123012001201010120120120101201 [oida@rpc261 soft2]$ fg ./writer [oida@rpc261 soft2]$ ipcrm sem 163842 リソースを削除しました [oida@rpc261 soft2]$ Ctrl-C seminit.c int main() { int semid; key_t semkey; semkey=ftok(“seminit", 'a'); semid=semget(semkey, 1, IPC_CREAT|0666); semctl(semid, 0, SETVAL, 1); return EXIT_SUCCESS; }

2.4 画面に数字を書くプログラム writer.c cleaner.c セマフォ識別子を得る ロック操作 ロック操作 2.4 画面に数字を書くプログラム writer.c cleaner.c int main() { int semid; key_t semkey; struct sembuf buf[1]; semkey=ftok("seminit", 'a'); semid=semget(semkey, 1, IPC_CREAT|0666); buf[0].sem_num=0; buf[0].sem_flg=0; while (1) { int i; buf[0].sem_op = -1; semop(semid,buf,1); for (i=0; i<5; i++) { printf("%d",i); fflush(stdout); sleep(1); } buf[0].sem_op = 1; return EXIT_FAILURE; int main() { int semid; key_t semkey; struct sembuf buf[1]; srand(time(NULL)); semkey=ftok("seminit", 'a'); semid=semget(semkey, 1, IPC_CREAT|0666); buf[0].sem_num=0; buf[0].sem_flg=0; while (1) { int i, loop; buf[0].sem_op = -1; semop(semid,buf,1); loop=rand()%5+1; for (i=0; i<loop; i++) { printf("\b \b"); fflush(stdout); sleep(1); } buf[0].sem_op = 1; return EXIT_FAILURE; 乱数のシードを作る (実行する毎に結果が変わる) セマフォ識別子を得る ロック操作 ロック操作 乱数を5で割った余+1 資源 (ディスプレイ) を独占的に使う 後退し、空白を書き、後退する アンロック操作 アンロック操作

宿題10 初めにseminitを実行後にhw10とwriterを実行する。 hw10.c:(seminit.cを参考にして)セマフォの値を表示するプログラムを作成せよ。 writerが実行中にセマフォの値が変化する様子を確認せよ。 表紙に氏名と学籍番号を書く 本文にプログラムを書く プログラムの実行結果を書く 実施した内容を説明する文章を書く レポートの締切は次の週の水曜日18:00 端末を二つ( hw10用とwriter用)立ち上げると操作しやすい。 hw10 セマフォ値 writer semctl() 1 1 printf() ロック semctl() アンロック printf() 1

宿題10のヒント 1 1 1 hw10 writer ヒント: 1秒毎にセマフォの値を取出す ヒント:  1秒毎にセマフォの値を取出す 端末を二つ( hw10用とwriter用)立ち上げると操作しやすい。 #include <stdio.h> #include <stdlib.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/types.h> int main() { int semid; key_t semkey; int semval; while (1) { semval = semctl(semid, 0, GETVAL); printf("semval=%d\n",semval); sleep(1); } return EXIT_SUCCESS; hw10 セマフォ値 writer semctl() 1 1 printf() ロック semctl() (1)鍵を作成する(writer.cと同様)。 (2)semgetシステムコールを実行し、リターン値をsemidに入れる(writer.cと同様)。 アンロック printf() 1