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