Document

ネットワーク・プログラミング
カーネルの役割とプロセス生成
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の役割と構成
カーネルモードとユーザモード
プロセスの生成と実行