1 / 47

ネットワークプログラミング 第 9 回「 応用ネットワークプログラミング」 #9 Applied Network Programming (last lecture!)

20 10 年秋学期 Rodney Van Meter. ネットワークプログラミング 第 9 回「 応用ネットワークプログラミング」 #9 Applied Network Programming (last lecture!). 今期の授業スケジュール(予定). 第1回 9/28 : Introduction / イントロダクション 第2回 10/5 : C Basics ~ Functions, Variables, Data Types ・ Makefiles

casey
Download Presentation

ネットワークプログラミング 第 9 回「 応用ネットワークプログラミング」 #9 Applied Network Programming (last lecture!)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 2010年秋学期 Rodney Van Meter ネットワークプログラミング第9回「応用ネットワークプログラミング」#9 Applied Network Programming (last lecture!)

  2. 今期の授業スケジュール(予定) 第1回 9/28: Introduction / イントロダクション 第2回 10/5:C Basics~Functions, Variables, Data Types・Makefiles 第3回 10/12:C Basics~Command Line Arguments・ Structures ・ Pointers 第4回 10/19:C Basics~Pointers & Arrays ・ Lists 第5回 10/26: file I/O・ Network Protocols 第6回 11/2: Network Programming (1)‏ 第7回 11/9: Network Programming (2)‏ 第8回 11/16: Network Programming (3) 11/23: No class! ORF! Please come! 第9回 11/30: Applied Network Programming 第10回 12/7: Work on Projects 第11回 12/14: Mid-Term Presentation (light!) 第12回 12/21: Work on Projects 第13回1/11: Final Presentations!!!

  3. 中間発表(Mid-term Presentation) Problem (or project) definition (Related work) Key idea How you will evaluate it Schedule NOT 実装、評価、論文執筆!

  4. ミニプロの中間発表について(2) Team members Division of responsibility How you will work together What programming environment? What source code control (svn, cvs, rcs...?) Plan for APIs, functional definition Testing plan

  5. Submission of Final Project Source code, a presentation, and a report Source must be commented 日本語 or 英語 (eigo) Report contents What you made How you made it Why it’s cool/what problem it solves Execution environment

  6. ミニプロの提出 提出は、ソースコードならびにレポート 提出ソースコードにはコメントを付加 日本語 or 英語 レポートには以下の項目を含める 何を作ったのか 使用方法 面白さ 実行環境

  7. Today, we fork() 講義 前回のおさらい TCP-server listen()‏ accept()‏ fork サーバの挙動 プロセス 練習1: forkに慣れよう 実習:平行サーバを作成

  8. TCP 通信の流れ(server)‏ TCP Server socket()‏ TCP client bind()‏ socket()‏ listen()‏ establish connect()‏ accept()‏ write()‏ data read()‏ write()‏ data read()‏ read()‏ end close()‏ close()‏

  9. fork

  10. Common Server Structure 複数のクライアントから 同時にアクセスを受ける Multiple clients accessing server at the same time Server 集中! Client クライアント Client クライアント Client クライアント

  11. Let’s Feel Like a Server Lots of sockets, lots of clients is hard! Have to examine one by one たくさんのソケットを扱ったり,めんどくさいことはしたくない いちいちソケットを検査するのが面倒 どれにどれだけ時間がかけられるんだ? 沢山のクライアントが接続してきたら,大変

  12. 自分の分身を作ればいいんだ! 仕事は全部,分身にまかせよう 親の仕事は,コネクションがきたときに分身を作ることだけ 親プロセス 子プロセス二号 子プロセス一号 t

  13. 平行処理(concurrent processing)‏ 素早い応答 多くの要求を処理 server listen()‏ accept()‏ fork()‏ C1 connect()‏ read()‏ write()‏ recv()‏ send()‏ C1:process C2 C2 C3 C4 C3 C4

  14. Function for creating a child fork system call int fork(); Makes an exact copy of the process How do you tell difference between parent and child? fork()’s return value: 0 for the child Integer >0 is child pid -1 is error

  15. プロセスを見る Linux系(ccx00)‏ % ps aux Solaris 又はLinux % ps -efj BSD系又はLinux % ps auxj USER PID PPID PGID …………… COMMAND nobody 123 89 89 …………… httpd

  16. プログラムの実行とプロセス 親プロセス 子プロセス プログラム プログラム } 生成 生成 fork()‏ 実行 プログラム main(int argc, char *argv)‏ { struct sockaddr_in me, peer; ……. if(pid = fork()) == 0) { child process. } else if(pid > 0) { parenet process. } else { error process. } } ・・・・・・・・・ ・・・・・・・・・ ・・・・・・・・・ ・・・・・・・・・ ・・・・・・・・・ ・・・・・・・・・ コピー プロセス プロセス OS

  17. 親と子の区別fork()の返り値Distinguishing Parent & Child int childpid; childpid = fork(); 親側 子側 if(childpid > 0){ 親の処理; } else if(childpid == 0){ 子の処理 }

  18. Common Server Processing Servers (telnet,ssh,ftpなど) with long individual connections 接続要求があったら,acceptして,とりあえずfork(); 子プロセスだったら、サービスの提供開始 親プロセスだったら、接続要求待ち Don’t have to deal w/ lots of sockets in one process

  19. Multi-client server using fork() File descriptor Server Client 1 クライアント2 Server waiting at listen() クライアント3

  20. fork()を用いたマルチクライアントサーバの仕組みfork()を用いたマルチクライアントサーバの仕組み ファイルディスクリプタ リクエスト サーバ クライアント1 クライアント2 Request comes from client (right before accept())‏ クライアント3

  21. fork()を用いたマルチクライアントサーバの仕組みfork()を用いたマルチクライアントサーバの仕組み ファイルディスクリプタ サーバ(親)‏ クライアント1 サーバ(子)‏ クライアント2 Parent closes its client socket, goes back to accept() Client closes its listen()ing socket クライアント3

  22. fork()を用いたマルチクライアントサーバの仕組みfork()を用いたマルチクライアントサーバの仕組み ファイルディスクリプタ accept()‏ リクエスト サーバ fork()‏ クライアント1 サーバ(子)‏ クライアント2 Server accepts and forks クライアント3

  23. fork()を用いたマルチクライアントサーバの仕組みfork()を用いたマルチクライアントサーバの仕組み ファイルディスクリプタ サーバ(親)‏ クライアント1 サーバ(子)‏ クライアント2 Client deals w/ one connection, parent is free to accept more. クライアント3

  24. fork()を用いたマルチクライアントサーバの仕組みfork()を用いたマルチクライアントサーバの仕組み ファイルディスクリプタ accept()‏ サーバ(親)‏ クライアント1 fork()‏ サーバ(子)‏ クライアント2 サーバ(子)‏ クライアント3 New client handled the same way.

  25. 練習1: forkに触れてみよう(次ページに解説あり)‏ #include <sys/types.h> #include <stdio.h> #include <unistd.h> intmain(int argc, char *argv[]){ int pid; int number = 5; char buf[1]; printf("original process id: %d\n", getpid()); printf("original parent process id: %d\n", getppid()); if( (pid = fork()) == 0){ /* child process */ printf("this is child process\n"); number += 10; printf("number: %d\n", number); printf("fork() return value: %d\n", pid); printf("child process id: %d\n", getpid()); printf("child parent process id: %d\n", getppid()); } else if(pid > 0){ /* parent process */ printf("this is parent process\n"); number += 20; printf("number: %d\n", number); printf("fork() return value: %d\n", pid); printf("parent process id: %d\n", getpid()); printf("parent parent process id: %d\n", getppid()); } else { perror("fork()"); } printf("number: %d\n", number); exit(0); }

  26. Practice Exercise #1 included pid int getpid()‏ プロセスidを取得 int getppid()‏ 親プロセスidを取得

  27. 練習1:Basic Structure ① forkの基本構文 int pid; if( (pid = fork()) == 0){ /* child process */ } else if(pid > 0){ /* parent process */ } else { perror("fork()"); }

  28. 練習1:重要な点② Memory with variables is copied! 変数がコピーされる Consider int number Each process’s copy stored in separate place original process id: 21146 original parent process id: 20587 this is child process number: 15 fork() return value: 0 child process id: 21147 child parent process id: 21146 number: 15 this is parent process number: 25 fork() return value: 21147 parent process id: 21146 parent parent process id: 20587 number: 25

  29. fork()を利用した並行サーバの注意点  (親プロセスの義務)fork()を利用した並行サーバの注意点  (親プロセスの義務) 子プロセスが終了すると、「どのような死に様だったか」が親プロセスに伝えられる システムが親プロセスに通知 シグナルを利用 非同期な事象をプログラムで扱うための方法 親プロセスは子プロセスの死に様を見届けなければならない 親プロセスが子プロセスの終了状態を受け取らなくては,子プロセスは成仏できずにゾンビプロセスに変わる psコマンドで確認すると,a.out <defunct>と表示される 子プロセスが死んで,終了状態を受け取らずに親プロセスが死ぬと,ゾンビプロセスがいつまでも残る 子プロセスが終了する前に親プロセスが死ぬと? プロセスID1のinitが養子として引き取ってくれる

  30. 終了状態の受け渡し 親プロセス 子プロセス 子プロセス

  31. 終了状態の受け渡し 親プロセス 子プロセス 子プロセス 終了(正常/異常)‏

  32. 終了状態の受け渡し 親プロセス ゾンビ プロセス 子プロセス 終了(正常/異常)‏

  33. 終了状態の受け渡し 親プロセス 終了した子プロセスから 状態を取得する 終了(正常/異常)‏ ゾンビ プロセス 子プロセス

  34. 終了状態の受け渡し 親プロセス 正確にはプロセスを管理 しているOSから通知される シグナル SIGCHLD ゾンビ プロセス 子プロセス

  35. 終了状態の受け渡し 親プロセス Zombie Process 子プロセス 消滅

  36. 親プロセスの義務 つまり、子プロセスが終了したというシグナルを受け取ったら「南無阿弥陀仏」と唱えなければいけない 子プロセスの終了状態(ステータス)を受け取る 呪文: wait() システムコール 子プロセスの状態を受け取り、変数へ代入 子プロセスの終了状態から、適切な処理を進められる 注意: シグナルのキューイング 複数のシグナルを同時に受信しても「1つ」しか通知されない 複数の子プロセスが同時に死んだ場合の処理を工夫

  37. Flow of Processing for Signals Signal Handler (parent) 何かの処理 Child terminates (signal created) Called automatically Finish processing 中断した所から実行を再開

  38. wait() System Call Learn about status of child process pid_t wait(int *status); pid_t waitpid(pid_t wpid, int *status, int option); 子プロセスのpidが戻り値 失敗: -1

  39. wait()とwaitpid()の違い waitは子プロセスが終了する(ほんとは状態が変わる)までブロックする 親プロセスは別の処理を行えない。 waitpid() (see also wait4() on some OSes) ブロックしないようにするオプションがある。 WNOHANG 戻り値0は、もう状態の変化したプロセスがない場合 pidを指定できる -1 を指定すると最初に状態の変化した子プロセス 0を指定すると、同一プロセスグループidを持つ子プロセス

  40. Practice Exercise #2: simple wait() Modify forktest.c to: Have child sleep() for 5 seconds Have parent wait() for child to die Include printf()s so you can see what happens

  41. Using Signal Handler void sig_child(int signo) // this is the signal handler { int pid, status; while((pid = waitpid(-1, &status, WNOHANG)) > 0) { printf("PID: %d, terminated\n", pid); } } int main(int argc, char *argv[])‏ { …. // arranges for signal handler to be called signal(SIGCHLD, sig_child); …. }

  42. Practice Exercise #3: Using signal handler Modify forktest.c from last exercise: Delete wait() in parent Set up signal handler (before fork()) Handler should print “Okay, I’m happy now”, then program should exit Have parent sleep() for 1 second, wake up, print “still unhappy....”, (don’t forget to flush()!)and loop forever

  43. 実習 以前つくったTCP-echo-severをforkを用いて並行処理可能にする 前回とに違い Server: forkする クライアントから“bye”を受け取ると通信を終了する bye以外は全てclientにエコーする waitpidする(子プロセスの終了を受け取る)‏ 複数クライアントからサーバに接続し,psコマンドを用いてforkが出来ていることを確認すること

  44. 知っておきたいシグナル SIGINT Ctrl-Cにバインドされていて、プロセスを終了するためによく使われる SIGTERM これもプロセスを終了するためによく使われる。killコマンドがdefaultで送るシグナル SIGTSTP Ctrl-Zにバインドされていて、プロセスをサスペンドするためによく使われる。 SIGCHLD fork()で作成した子プロセスがexit()したことを通知するシグナル。これを受けて wait() などの後処理を走らせる SIGALRM alarm()によって指定された秒数後に送られるシグナル。タイマーの実装でよく使う

  45. シグナルをする時 kill(pid_t pid, int sig)というシステムコール pid == どちのプロセスに送る sig == シグナルナンバー

  46. シグナルハンドラの指定: signal()‏ void (*signal(int signo, void (*func)(int)))(int); 指定したシグナル発生時に呼び出される関数(シグナルハンドラ)へのポインタを指定する 以前に設定されていたシグナルハンドラを指すポインタが戻り値 Signoは捕捉するシグナル funcはシグナルハンドラへのポインタ 第2引数のfuncは引数として整数をひとつとり、戻り値を返さない関数へのポインタ

  47. (前回の‘使い方例’)の問題点 一つのクライアントに対応している間は、他のクライアントに対応できない! 複数のクライアントが一度にアクセスした場合を考慮しなければいけない どこがネックか? accept()を多重化して実行できると良い? 実際の処理を多重化して実行できると良い?

More Related