ネットワーク・プログラミング 非同期I/Oとスレッド同期制御.

Slides:



Advertisements
Similar presentations
システムプログラミング 第11回 シグナル 情報工学科 篠埜 功. 今回の内容 前回の補足( exit システムコールについ て) プロセス間通信 – シグナルの送信 --- 今回の内容 – パイプによる通信 – ソケットによる通信.
Advertisements

ネットワーク・プログラミ ング カーネルの役割とプロセス生成. 1.1 OS の役割 仮想マシン OS はハードウェアの多様性 をカプセル化し、利用者を 複雑な処理から開放する。 プロセス管理 時間多重化により各プロセ スに CPU を割当てる。 メモリ管理 メモリ空間の多重化により、 各プロセスにメモリを割当.
プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
ARTLinuxの特徴 ARTLinux: ハードリアルタイム処理機能を拡張したLinuxカーネル 固定優先度に基づくスケジューリング機能
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
ファイルシステムの構造 外部記憶装置のパーティション(区画) ファイルシステムとパーティション(区画) ファイルシステムのmount
第4回 iPhoneアプリ開発勉強会 Objective-C 基礎講座 -クラス- 鷲見政明.
スレッドの同期と、スレッドの使用例 スレッドの同期 Lockオブジェクト: lockオブジェクトの生成
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
16.3 関数と構造体 構造体ポインタ 地底探査ゲーム
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
第8回ネットワークプログラミング 中村 修.
第8回 プログラミングⅡ 第8回
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
アルゴリズムとデータ構造 補足資料6-3 「サンプルプログラムcat3.c」
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
シグナル通信 普通の割込みとソフトウェア割込み ソフトウェア割込みとシグナル キーボードからのシグナル 例外 (exception)
第7回 条件による繰り返し.
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
P2P方式によるオンラインゲームの研究、開発
プログラミング論 ファイル入出力
UDPエコーサーバ UDP-echoサーバのプログラムモデル(Cプログラム) サーバで利用するソケット関数(Cプログラム)
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
マルチスレッド処理 マルチプロセス処理について
ソケットプログラム(TCP,UDP) EasyChat開発2
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
第7回 条件による繰り返し.
プログラミング論 ファイル入出力
オペレーティングシステムJ/K (システムプログラミング)
演習1の解答例の解説 2006年11月8日 海谷 治彦.
Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I.
オペレーティングシステムJ/K 2004年11月18日
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
ネットワーク・プログラミング ソケットオプションとスレッド.
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
岡村耕二 TCP通信プログラム 課題と回答例 岡村耕二 情報ネットワーク.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
オペレーティングシステムJ/K (システムプログラミング)
ネットワーク・プログラミング デバイスドライバと環境変数.
ネットワーク・プログラミング Cプログラミングの基礎.
システムプログラミング 第10回 プロセス間通信3 簡易Web server(準備) Chat プログラム 担当:青木義満、篠埜 功
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
ネットワーク・プログラミング TCPサーバ.
ネットワーク・プログラミング メッセージの作成とセマフォ.
ネットワーク・プログラミング ソケットプログラミングと共有メモリ.
プログラミング 4 文字列.
ネットワーク・プログラミング 1対多のプロセス間通信.
ネットワーク・プログラミング パイプライン通信とシグナル.
岡村耕二 UDP通信プログラム 課題と回答例 岡村耕二 情報ネットワーク.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネットワーク・プログラミング マルチタスク.
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
ネットワーク・プログラミング プロセスとファイルシステム管理.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング演習I 補講用課題
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
岡村耕二 TCP通信プログラム 岡村耕二 情報ネットワーク.
Presentation transcript:

ネットワーク・プログラミング 非同期I/Oとスレッド同期制御

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

1.1 サーバーの非同期I/O 非同期I/O シグナルSIGIOの設定 UDPEchoServeの動作 シグナル処理関数がエコー処理をする UDPEchoServer 非同期I/O シグナルSIGIOを使って、パケット受信をプロセスに通知する。 プロセスはシグナルを受信するまで別の処理が出来る。 シグナルSIGIOの設定 sigaction()を使って、シグナルハンドラを指定する。 fcntl()を使って、ソケットのフラグをFASYNC (非同期I/O)に設定する。 UDPEchoServeの動作 SIGIOのシグナルハンドラを設定し、エコー要求があるまで他の処理を行う。 エコー要求が到着するとSIGIOがプロセスに送信され、ハンドラが実行される。 ハンドラは、recvfrom()とsendto()を実行して受信したデータグラムをエコーバックする。 SIGIO handler UDPEchoClient カーネル main signal関数の高機能版 sigaction() Echo SIGIO recvfrom() sendto() Echo Hello SIGIO recvfrom() sendto() Hello

1.2 クライアントのタイムアウト処理 タイムアウト タイムアウトの実装 UDPEchoClientの動作 hello hello 1.2 クライアントのタイムアウト処理 タイムアウト パケットの受信がないことを知る方法。 今からT秒後までに受信がなければ、シグナル(SIGALRM)がカーネルからプロセスに送られる。イベントがあれば、シグナルによる通知はリセットされる。 タイムアウトの実装 ブロックする関数(例えば、recvfrom)を実行する前にalarm()を実行する。 unsigned int alarm(unsigned int secs) UDPEchoClientの動作 2秒間応答がないとSIGALRMシグナルが送信されハンドラが起動される。 ハンドラは再送回数を1増やす。 エコーメッセージを再送する。 再送回数が最大値に到達した場合、プログラムを終了する。そうでなければ再送する。 UDPEchoClient UDPEchoServer alarm() sendto() hello hello alarm() sendto() hello 2秒 メッセージ紛失 SIGALRMハンドラ タイムアウト tries++ alarm() sendto() hello メッセージ紛失 タイムアウト SIGALRMハンドラ tries++

1.3 UDPEchoClient Timeout.c #define TIMEOUT_SECS 2 /* タイムアウト秒数*/  … int tries=0; /* 再送回数初期化 */ void CatchAlarm(int ignored); /* SIGALRMハンドラ */ int main(int argc, char *argv[]) { struct sigaction myAction; /* ハンドラ設定に使用する */ /* UDPソケット作成 */ … /* alarm シグナルのハンドラの設定 */ myAction.sa_handler = CatchAlarm; /* ハンドラ実行中は他のシグナルをブロックする */ if (sigfillset(&myAction.sa_mask) < 0) DieWithError("sigfillset() failed"); myAction.sa_flags = 0; if (sigaction(SIGALRM, &myAction, 0) < 0) DieWithError("sigaction() failed for SIGALRM"); /* 文字をサーバへ送信 */   … /* 応答待ち */ fromSize = sizeof(fromAddr); alarm(TIMEOUT_SECS); /* タイムアウト設定 */ while ((respStringLen = recvfrom(sock, echoBuffer, ECHOMAX, 0, (struct sockaddr *) &fromAddr, &fromSize)) < 0) if (errno == EINTR) /* アラーム終了 */ { if (tries < MAXTRIES) /* 最大再送回数か? */ printf("timed out, %d more tries...\n", MAXTRIES-tries); if (sendto(sock, echoString, echoStringLen, 0,          (struct sockaddr *)&echoServAddr,           sizeof(echoServAddr)) != echoStringLen) DieWithError("sendto() failed"); alarm(TIMEOUT_SECS); } else DieWithError("No Response"); DieWithError("recvfrom() failed"); /* 正常な受信処理 */ alarm(0); … void CatchAlarm(int ignored) /* SIGALRMハンドラ */ tries += 1; タイムアウトが発生 errno.hで定義 された外部変数 タイマーの再セット シグナルSIGALRMのハンドラCatchAlarmを設定 再送回数オーバー タイムアウト 以外で受信失敗 エコー文字の送信 タイマーをリセット タイマーセット 再送回数を1増加

セマフォ値が0ならば、セマフォ値が増えるのを待って1減らす 2.スレッド 2.1  セマフォを使った同期制御 スレッド用のセマフォ 使い方はプロセス間通信のセマフォと同じ スレッドの数だけセマフォが必要。 同期の取り方 スレッド1はセマフォ1に1を足し、セマフォ2から1を引く。 スレッド2はセマフォ2に1を足し、セマフォ1から1を引く。 sem_init セマフォの初期化 インクルードファイル   #include <semaphore.h> 書式  int sem_init(sem_t *sem, int pshared, unsigned int value); 戻値 成功時 0 失敗時 -1 sem セマフォ識別子   pshared   0: 現在のプロセス内のスレッド間だけで使用         0以外: 複数プロセス間で使う Value セマフォ値 スレッド1の状態 0: 実行 1: 待ち 1 セマフォ1 セマフォ2 スレッド1 +1 -1 待ち スレッド2 引けない ここから同時に動く sem_post セマフォ値を1増やす インクルードファイル   #include <semaphore.h> 書式  int sem_post(sem_t *sem); 戻値 成功時 0 失敗時 -1   sem_wait セマフォ値を1減らす インクルードファイル   #include <semaphore.h> 書式  int sem_wait(sem_t *sem); 戻値 つねに0を返す スレッド2の状態 0: 実行 1: 待ち セマフォ値が0ならば、セマフォ値が増えるのを待って1減らす

2.2 同期を取りながら文字を出力するプログラム 2.2 同期を取りながら文字を出力するプログラム Mainプログラム スレッドで実行する関数 Helloworld.c  その1 helloworld.c その2 char word[]={"Hello World!\n"}; sem_t sem1,sem2; int main() { pthread_t thread1,thread2; void *print1(void *args); void *print2(void *args); sem_init(&sem1,0,0); sem_init(&sem2,0,0); pthread_create(&thread1, NULL, print1, NULL); pthread_create(&thread2, NULL, print2, NULL); pthread_join(thread1,NULL); pthread_join(thread2,NULL); return EXIT_SUCCESS; } void *print1(void *args) { int i; for (i=0; i<strlen(word); i++) { sem_post(&sem1); // sem1 increment sem_wait(&sem2); // sem2 decrement printf("%c",word[i]); fflush(stdout); sleep(1); } return NULL; void *print2(void *args) { sem_post(&sem2); // sem2 increment sem_wait(&sem1); // sem1 decrement 同期ポイント 直ぐに出力 初期化 特別な設定をしなくてもword[]をアクセス出来る!! 同期ポイント oida@rpc261 soft2]$ gcc helloworld.c -o helloworld -lpthread [oida@rpc261 soft2]$ ./helloworld HHeelllloo WWoorrlldd!!

W(7番目の文字)で同期を取るthread1 宿題13 次のインクルードファイルが必要 #include <pthread.h> #include <semaphore.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> (helloworld.cを参考にして)「Hello World!」の「W」で( 「W」以降ではない)同期をとって印字するプログラムhw13.cを作成せよ。但し、二つのスレッドは1秒毎と7秒毎に1文字印字する。 表紙に氏名と学籍番号を書く 本文にプログラムを書く プログラムの実行結果を書く 実施した内容を説明する文章を書く レポートの締切は次の週の水曜日18:00 W(7番目の文字)で同期を取るthread1 void *print1(void *args) { int i; for (i=0; i<strlen(word); i++) { if (i==6) { sem_post(&sem1); // sem1 increment sem_wait(&sem2); // sem2 decrement } printf("%c",word[i]); fflush(stdout); sleep(1); return NULL; thread2では、sleep(7);にする [oida@rpc261 soft2]$ gcc hw13.c -o hw13 -lpthread [oida@rpc261 soft2]$ ./hw13 HHello ello WWorld! orld! [oida@rpc261 soft2]$