ネットワーク・プログラミ ング カーネルの役割とプロセス生成
1.1 OS の役割 仮想マシン OS はハードウェアの多様性 をカプセル化し、利用者を 複雑な処理から開放する。 プロセス管理 時間多重化により各プロセ スに CPU を割当てる。 メモリ管理 メモリ空間の多重化により、 各プロセスにメモリを割当 る。 資源管理 各プロセスに資源(プリン タ、ハードディスク等)の 共有及びアクセス保護のた めのインタフェースを提供 する。 Latex オペレーションシステム( OS) tar ls xfig 周辺装置メモリ CPU
1. 2 カーネルモードとユーザモード カーネルモード カーネルの特権モード。 プロセッサの全命令を利 用でき、全メモリ領域を アクセス出来る。マシン 資源と直接対話出来る。 ユーザモード プロセスの実行モード。 実行できる命令は制限さ れ、ユーザモードのメモ リ領域のみアクセス出来 る。マシン資源と直接対 話出来ない。 システムコール カーネルがプロセスに代 わってマシン資源をアク セスし、結果を返す。 資源1資源2 カーネル プロセス A プロセス B システムコー ル 結果 マシン資源と はハードディ スク等のハー ドウェアを指 す
プロセスの生成とコマンドの実 行 2.1 プロセスの生成 lv.c #include int main(int argc,char *argv[]) { int dep_time; dep_time=atoi(argv[1])*60-300; if (fork()==0) { // 子プロセスの生成 sleep(dep_time); fprintf(stderr,”Leave in 5 min\n”); } return EXIT_SUCCESS; } % gcc lv.c –o lv %./lv 30 ( 30 分後に予 定あり) % % Leave in 5 min ( 5 分前にア ラーム) fork 子プロセスを生成する インクルードファイル #include #include 書式 pid_t fork (void); 戻値成功時 親プロセス : 子プロセス ID 子プロセス : 0 失敗時 -1 説明子プロセスは親プロセスの複製で あり、戻値によって各プロセスは自 身が親か子かを判断する。 親プロセス pid=100 fork(); 戻値 102 子プロセス pid=102 fork(); 戻値 0 子プロセスの生成 /usr/include/stdlib.h ポインタ変数の配 列 % man fork % man atoi
2.2 簡単なシェルの作成 nsh.c int main() { char command[256],line[256]; int st; static char prompt[64]=“>”; fprintf(stderr, “%s”,prompt); while (fgets(line,sizeof(line),stdin) !=NULL) { if (sscanf(line,”%s”,command)>0) { if (fork()==0) { if (execl(command,command,NULL)<0) { exit(EXIT_SUCCESS); } else { wait(&st); } fprintf(stderr,”%s”,prompt); } return EXIT_SUCCESS; } %./nsh > /bin/ps プロセスの一覧が表示される >/bin/ls ファイル名一覧が表示される > ( Ctrl-D を押すと、もとのシェルに戻る) % シェルとは、 1. 文字列を入力する 2. 入力された文字列で示されるコ マンド(プログラム)を実行 3. コマンドの実行が終ったら1. へ nsh.c を実行しましょう。 プロンプト ( > )をディス プレイ上に表示 子プロセ ス が実行 command を子プ ロセス上で実行 子プロセス終 了 親プロセ ス が実行
2.3 プログラムの実行 execl プログラムをロードし実行 インクルードファイル #include 書式 int execl(const char *path, const char *arg,..); 戻値成功時 なし 失敗時 -1 説明 execl の引く数で指定したプログラムが execl を呼出たプロセスを上書きする プロセス execl(“/bin/ls”,”/bin/ls”,”-l”,NULL); ハードディスク / ls wait 子プロセスの終了を待つ インクルードファイル #include #include 書式 pid_t wait (int *status); 戻値成功時 子プロセス ID 失敗時 -1 親プロセス fork(); wait(); 子プロセス exit(); usrbin execl を実行する と、ハードディス クに格納された ls コマンドをメモリ 上にロードする。 子プロセス の終了を待 つ 子プロセスの生成
宿題3 宿題:20秒前と5秒前にメッ セージを出すプログラム (hw3.c) を作成し、動作を linux 上で確認せよ。 表紙に氏名と学籍番号を書く 本文にプログラムを書く プログラムの実行結果を書く 実施した内容を説明する文章 を書く レポートの締切は次の週の水 曜日 18:00 親子孫 sleep(40) printf() fork() return sleep(15) printf() return fork() return hw3.c #include int main(int argc, char *argv[]) { int dep_time; int dep_time2=15; dep_time=atoi(argv[1])*60-20; if (fork()==0) { //child if (fork()==0) { //grandchild sleep(dep_time2); fprintf(stderr,"Leave in 5 sec\n"); } return EXIT_SUCCESS; } 20 秒前にメッセージ ( ”Leave in 20 sec” ) を出力する命令文 (2行)をここに挿 入する。 $./hw3 1 $ Leave in 20 sec Leave in 5 sec $ 5 秒前にこのメッセージが出 る
まとめ OS の役割と構成 カーネルモードとユーザモード プロセスの生成と実行