View
61
Download
0
Category
Preview:
DESCRIPTION
オペレーティングシステム 2004 プロセス (1). 2004 年 10 月 8 日 海谷 治彦. 目次. アプリケーションプログラムの動作 プロセスの意味の復習 カーネル ( 復習 ) カーネル内でのプロセス プロセスの作成 プロセスの停止と削除 リソース その他,雑多な用語の話. アプリの動かし方 Linux の例. ターミナルから実行可能プログラムのパス名を打つ.. アプリの動かし方 Win の例 1. 基本的にはアイコンをつっつくとアプリが起動できる.. アプリの動かし方 Win の例 2. - PowerPoint PPT Presentation
Citation preview
1
オペレーティングシステム 2004
プロセス (1)
2004 年 10 月 8 日海谷 治彦
2
目次
• アプリケーションプログラムの動作• プロセスの意味の復習• カーネル ( 復習 )
• カーネル内でのプロセス• プロセスの作成• プロセスの停止と削除• リソース• その他,雑多な用語の話
3
アプリの動かし方 Linux の例
ターミナルから実行可能プログラムのパス名を打つ.
4
アプリの動かし方 Win の例 1
基本的にはアイコンをつっつくとアプリが起動できる.
5
アプリの動かし方 Win の例 2
実は Windows でもコマンドを指定してプログラムを起動できる.
6
プログラムの処理の流れ
• プログラムがメモリに読み込まれる.
• 計算に必要なメモリも確保される.(変数等のため )
• CPU がプログラムを順に読んで,計算をする.
• 必要ならば,デバイス( ファイル等 ) にアクセスする.
メモリ
ディスク
CPUプログラ
ム
変数等アーキテクチャの授業等の復習ですな.
7
プロセス• 処理中のプログラム.• プログラムのインスタンス.• 全頁の「メモリに読み込まれたプログラムと
データ」に対応する概念.• 1 つのプログラムをもとに複数のプロセスが発生
するため,プログラムとは概念的に区別される.• 以下の対比でイメージを得て!
書き物 実行ソフトウェア プログラム プロセス音楽 譜面 演奏
8
Linux での実際• プロセスが計算を実行するためには資源が必
要,少なくともメモリと CPU は必要.• 1 つのプログラムをもとに多数のプロセスが
生成されている.• 無論,実行可能なプログラムは多数ある.• 沢山のプロセスが同時に動いている ( ように
見える ) .• プロセスの生成と消滅が繰り返されている.
OS を通して業務 ( アプリの実行 ) するので当たり前か.
• プロセスの寿命はまちまち.ls は一瞬で終わるが, httpd は何日も動いている.
9
プロセス管理の (kernel への )要件
• どんなプロセスが存在するのかを記録しておかなければならない.資源分配のため.
• プロセスの生成と削除ができなければならない.生成・削除の要求を出すのはカーネルとはかぎらない.
• プロセスが計算するのに必要な資源 ( メモリ ,CPU など ) を各プロセスに割り当てあげないといけない.
• 特に CPU を使える ( 計算をできる ) 順番をスケジュールしないといけない.一般にプロセスの数の方が CPU の数 ( 普通 1 つ ) より
多い.
10
マルチプロセス• 昨今の OS は同時に複数のプロセスを
実行することができる.– 例えば,音楽を聞きながらワープロで文章
が書ける.• まずは,ある時点でどんなプロセスが
いくつ動作しているかを観察する.
11
Linux でのプロセスの観察 1
ps コマンドはプロセスの状態を安易?に観察するツールである.
12
Linux でのプロセスの観察 2
top というコマンドでも観察できる.
13
Win でのプロセスの観察タスクマネージャーから動作しているプロセスを観察できる.
( 通常, Ctrl ・ Alt ・ Del のキーを同時に押すと出てくる. )
14
プロセスの生成
• 一般的に UNIX では,すでに存在するプロセスの複製をつくり,複製の内容を作り変えることで,新しいプロセスを生成する.
• この複製もとになっているプロセスを通常,「親プロセス」と呼ぶ.
15
プロセスの親子関係の例UID PID PPID C STIME TTY TIME CMDroot 1 0 0 Aug27 ? 00:00:05 initroot 2 1 0 Aug27 ? 00:00:00 [kflushd]root 3 1 0 Aug27 ? 00:00:01 [kupdate]root 4 1 0 Aug27 ? 00:00:00 [kpiod]root 5 1 0 Aug27 ? 00:00:04 [kswapd]root 6 1 0 Aug27 ? 00:00:00 [mdrecoveryd]root 47 1 0 Aug27 ? 00:00:00 [khubd]root 547 1 0 Aug27 ? 00:00:02 /usr/sbin/sshdroot 940 547 0 23:18 ? 00:00:00 /usr/sbin/sshdkaiya 941 940 0 23:18 pts/0 00:00:00 -cshkaiya 1013 941 0 23:23 pts/0 00:00:00 ps -efkaiya 968 941 0 23:19 pts/0 00:00:00 vi a.croot 538 1 0 Aug27 ? 00:00:00 inetdroot 983 538 0 23:22 ? 00:00:00 in.rlogindroot 984 983 0 23:22 pts/1 00:00:00 login -- kaiya $kaiya 985 984 0 23:22 pts/1 00:00:00 -bashkaiya 1012 985 3 23:23 pts/1 00:00:00 emacs Foo.java
ある日,あるマシンのプロセスを抜粋 (ps –ef)
16
読み方UID PID PPID C STIME TTY TIME CMDroot 538 1 0 Aug27 ? 00:00:00 inetdroot 983 538 0 23:22 ? 00:00:00 in.rlogindroot 984 983 0 23:22 pts/1 00:00:00 login -- kaiya $kaiya 985 984 0 23:22 pts/1 00:00:00 -bashkaiya 1012 985 3 23:23 pts/1 00:00:00 emacs Foo.java
1 行が 1プロセ
ス
自プロセスの番号
親プロセスの番号
プロセスのもととなったコマン
ド名
inetdin.rlogind
login
bashemacs …
上の場合,下の図のような親子関係になっている.子は親の複製がもとになっている.
17
最初のプロセス
• 複製をもとにプロセスが生成されると,最初にタネになるプロセスがないとはじまらない.
• Linux には以下の 2 つのタネになるプロセスがある.– プロセス 0 Swapper, 初期化プロセス等とよ
ばれ,カーネル内の変数等の初期化をする.– プロセス 1 Init ほとんどすべてのプロセス
の先祖となる
18
最初のプロセスの実際• プロセス 0 Swapper
– init/main.c の中の, start_kernel(void) 関数が実体.• プロセス 1 init
– init/main.c の, init(void * unused) 関数が実体.– init/main.c の中の一番最後に記述されている.
• ゼロから Linux が起動するあたりの話は別の回にやりますが,文献 10 あたりがイイカンジ.
UID PID PPID C STIME TTY TIME CMDroot 1 0 0 Aug27 ? 00:00:05 initroot 2 1 0 Aug27 ? 00:00:00 [kflushd]root 3 1 0 Aug27 ? 00:00:01 [kupdate]root 4 1 0 Aug27 ? 00:00:00 [kpiod]root 5 1 0 Aug27 ? 00:00:04 [kswapd]
19
どうやって複製を作るか?
• fork システムコールを利用– 実際に複製を作成する関数.– man fork 参照
• clone システムコールを利用– 親と一部のデータを共有する子プロセスを
作成する関数.– 上記の fork より処理が軽い.– 本講義ではとりあず扱わない.
20
fork のサンプルプログラム ( 抜粋 )
1| void showchar(char c){ 2| // 省略 3| } 4| 5| main(int argc, char* argv[]){ 6| pid_t ch; 7| if((ch=fork())==0){ // child 8| showchar('c'); 9| }else if(ch>0){ // parent 10| showchar('p'); 11| } 12| 13| }
21
fork() 関数の実行• この実行が行われた時点でプロセスのコピー
が作成される.• 実行後,自分がコピー ( 子供 ) かオリジナル
かは fork() の返り値でわかる.– 返り値 =0: 子供– 返り値 >0: オリジナル,値は子供のプロセス ID– それ以外 : fork()失敗.
• 前述の例では, if 文の最初の条件が成り立った分岐は子の処理の流れ,次の分岐がオリジナルの流れとなる.
• 原則,分岐した流れは併合することはない.
22
fork1.c の説明• 単純に自分の複製を作成するプログラ
ム.• プログラム自体は文字 c を 1秒おきに
20個画面に表示するダケの関数 showchar(c) を実行しているだけ.
• しかし親プロセスと子プロセスで異なる文字を表示するため,プロセスが複製されたことがわかる.
23
fork1.c の実行と観察• 単にコンパイルすれば動きます.
– Cygwin でも動きました.• 動作させて二つの文字が表示されるの
を確認する.• 同時に ps コマンド (ps –lx) で同じ名前
のプロセスが存在し,• 親子関係があるのを確認する.
24
shell の実体 プロセス複製器
コマンド名をいれるとプログラムが実行されるのは,シェルといわれるプロセス複製プログラムと対話していることになる.
文献 1 p.81, shell は自分で作れる!
bash の例
tcsh の例
25
fork2.c 簡単な shell• 文字入力をコマンドとみたてて,その
実行を行うプログラム.• bashや tcsh も基本的にはこの構成.• プロセス生成・消滅機構の簡単な例.• 観察事項
– 確かに他のコマンドを呼び出せるかを確認.– 呼び出されたコマンドともとのプログラ
ムに親子関係があるかを ps –xl 等で確認.• 親が 10秒待つようにコードをかいてある.
26
fork2.c の概要 1| main(int argc, char* argv[]){ 2| pid_t ch; char buf[100]; 3| 4| while(fgets(buf, 100, stdin)!=NULL){ 5| buf[strlen(buf)-1]='\0'; 6| if((ch=fork())==0){ // child 7| execl(buf, buf, NULL); // execve を呼ぶ 8| }else if(ch>0){ // parent 9| sleep(10); 10| printf("done %d\n", ch); 11| wait(0); 12| } 13| } 14| 15| }
27
ライブラリ関数 execl• 実行中のプロセスを他のプログラムに
作り変える関数.• システムコール execve を簡易に使える
ようにしたもの. ( フロントエンド )
• 詳細はマニュアルを参照.• execlp と execlv とか仲間の関数が多数
ある.• 詳細は次回に.
28
システムコール wait• 子プロセスの実行終了を待つための関
数.• 同時に子プロセスの利用していた資源
の解放も行う.– コレによって子プロセスは完全に消滅す
る.– コレをしないとゾンビ (後述 ) が残る場合
がある.
29
プロセスの消滅とゾンビ• 計算が終わるとプロセスも消滅し,
カーネル内から削除される・・・・はずである.
• しかし, (死んだ ) 子供の情報に親がアクセスする場合を UNIX は想定しているので,計算が終わったのにプロセスのデータが残っているという状態が起こる.
• この状態を,ゾンビ状態という.
30
ゾンビの例
詳細は zombie.c を参照.
31
以下は雑多な用語の解説
32
アンケートで目についた用語• ADT
• BSD
• SVR4
• Darwin
• Cygwin
• CUI / GUI
• IEEE
• POSIX
• kernel
• システムコール• リソース
• Daemon
• DNS
• FTP
• cftp
33
リエントラント (再入可能 )
• メモリにロードされた時点でも,複数のプロセスが共有可能なプログラムの性質.
• コード側にデータ(static 変数のようなもの ) がなければ,普通リエントラント.
文献 2 p.82, 文献 5 p.26
コード(データは含まれない )
データ
データ
プロセス1
プロセス2
34
80386
• インテル社の CPU で,現在広く使われているペンティアム等の直系の祖先となる.
• 現在のインテル系 CPU の基礎的技術が確立された CPU .
• i386 とか x86 とか 80x86 とか IA32 とかいう略称は,すべて 80386 とその子孫( ペンティアム等 ) を指す.
今日はおしまい
Recommended