34
1 オオオオオオオオオオオオ 2004 オオオオ (1) 2004 オ 10 オ 8 オ オオ オオ

オペレーティングシステム 2004 プロセス (1)

  • Upload
    malha

  • View
    61

  • Download
    0

Embed Size (px)

DESCRIPTION

オペレーティングシステム 2004 プロセス (1). 2004 年 10 月 8 日 海谷 治彦. 目次. アプリケーションプログラムの動作 プロセスの意味の復習 カーネル ( 復習 ) カーネル内でのプロセス プロセスの作成 プロセスの停止と削除 リソース その他,雑多な用語の話. アプリの動かし方 Linux の例. ターミナルから実行可能プログラムのパス名を打つ.. アプリの動かし方 Win の例 1. 基本的にはアイコンをつっつくとアプリが起動できる.. アプリの動かし方 Win の例 2. - PowerPoint PPT Presentation

Citation preview

Page 1: オペレーティングシステム 2004 プロセス  (1)

1

オペレーティングシステム 2004

プロセス (1)

2004 年 10 月 8 日海谷 治彦

Page 2: オペレーティングシステム 2004 プロセス  (1)

2

目次

• アプリケーションプログラムの動作• プロセスの意味の復習• カーネル ( 復習 )

• カーネル内でのプロセス• プロセスの作成• プロセスの停止と削除• リソース• その他,雑多な用語の話

Page 3: オペレーティングシステム 2004 プロセス  (1)

3

アプリの動かし方 Linux の例

ターミナルから実行可能プログラムのパス名を打つ.

Page 4: オペレーティングシステム 2004 プロセス  (1)

4

アプリの動かし方 Win の例 1

基本的にはアイコンをつっつくとアプリが起動できる.

Page 5: オペレーティングシステム 2004 プロセス  (1)

5

アプリの動かし方 Win の例 2

実は Windows でもコマンドを指定してプログラムを起動できる.

Page 6: オペレーティングシステム 2004 プロセス  (1)

6

プログラムの処理の流れ

• プログラムがメモリに読み込まれる.

• 計算に必要なメモリも確保される.(変数等のため )

• CPU がプログラムを順に読んで,計算をする.

• 必要ならば,デバイス( ファイル等 ) にアクセスする.

メモリ

ディスク

CPUプログラ

変数等アーキテクチャの授業等の復習ですな.

Page 7: オペレーティングシステム 2004 プロセス  (1)

7

プロセス• 処理中のプログラム.• プログラムのインスタンス.• 全頁の「メモリに読み込まれたプログラムと

データ」に対応する概念.• 1 つのプログラムをもとに複数のプロセスが発生

するため,プログラムとは概念的に区別される.• 以下の対比でイメージを得て!

書き物 実行ソフトウェア プログラム プロセス音楽 譜面 演奏

Page 8: オペレーティングシステム 2004 プロセス  (1)

8

Linux での実際• プロセスが計算を実行するためには資源が必

要,少なくともメモリと CPU は必要.• 1 つのプログラムをもとに多数のプロセスが

生成されている.• 無論,実行可能なプログラムは多数ある.• 沢山のプロセスが同時に動いている ( ように

見える ) .• プロセスの生成と消滅が繰り返されている.

OS を通して業務 ( アプリの実行 ) するので当たり前か.

• プロセスの寿命はまちまち.ls は一瞬で終わるが, httpd は何日も動いている.

Page 9: オペレーティングシステム 2004 プロセス  (1)

9

プロセス管理の (kernel への )要件

• どんなプロセスが存在するのかを記録しておかなければならない.資源分配のため.

• プロセスの生成と削除ができなければならない.生成・削除の要求を出すのはカーネルとはかぎらない.

• プロセスが計算するのに必要な資源 ( メモリ ,CPU など ) を各プロセスに割り当てあげないといけない.

• 特に CPU を使える ( 計算をできる ) 順番をスケジュールしないといけない.一般にプロセスの数の方が CPU の数 ( 普通 1 つ ) より

多い.

Page 10: オペレーティングシステム 2004 プロセス  (1)

10

マルチプロセス• 昨今の OS は同時に複数のプロセスを

実行することができる.– 例えば,音楽を聞きながらワープロで文章

が書ける.• まずは,ある時点でどんなプロセスが

いくつ動作しているかを観察する.

Page 11: オペレーティングシステム 2004 プロセス  (1)

11

Linux でのプロセスの観察 1

ps コマンドはプロセスの状態を安易?に観察するツールである.

Page 12: オペレーティングシステム 2004 プロセス  (1)

12

Linux でのプロセスの観察 2

top というコマンドでも観察できる.

Page 13: オペレーティングシステム 2004 プロセス  (1)

13

Win でのプロセスの観察タスクマネージャーから動作しているプロセスを観察できる.

( 通常, Ctrl ・ Alt ・ Del のキーを同時に押すと出てくる. )

Page 14: オペレーティングシステム 2004 プロセス  (1)

14

プロセスの生成

• 一般的に UNIX では,すでに存在するプロセスの複製をつくり,複製の内容を作り変えることで,新しいプロセスを生成する.

• この複製もとになっているプロセスを通常,「親プロセス」と呼ぶ.

Page 15: オペレーティングシステム 2004 プロセス  (1)

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)

Page 16: オペレーティングシステム 2004 プロセス  (1)

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 …

上の場合,下の図のような親子関係になっている.子は親の複製がもとになっている.

Page 17: オペレーティングシステム 2004 プロセス  (1)

17

最初のプロセス

• 複製をもとにプロセスが生成されると,最初にタネになるプロセスがないとはじまらない.

• Linux には以下の 2 つのタネになるプロセスがある.– プロセス 0 Swapper, 初期化プロセス等とよ

ばれ,カーネル内の変数等の初期化をする.– プロセス 1 Init ほとんどすべてのプロセス

の先祖となる

Page 18: オペレーティングシステム 2004 プロセス  (1)

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]

Page 19: オペレーティングシステム 2004 プロセス  (1)

19

どうやって複製を作るか?

• fork システムコールを利用– 実際に複製を作成する関数.– man fork 参照

• clone システムコールを利用– 親と一部のデータを共有する子プロセスを

作成する関数.– 上記の fork より処理が軽い.– 本講義ではとりあず扱わない.

Page 20: オペレーティングシステム 2004 プロセス  (1)

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| }

Page 21: オペレーティングシステム 2004 プロセス  (1)

21

fork() 関数の実行• この実行が行われた時点でプロセスのコピー

が作成される.• 実行後,自分がコピー ( 子供 ) かオリジナル

かは fork() の返り値でわかる.– 返り値 =0: 子供– 返り値 >0: オリジナル,値は子供のプロセス ID– それ以外 : fork()失敗.

• 前述の例では, if 文の最初の条件が成り立った分岐は子の処理の流れ,次の分岐がオリジナルの流れとなる.

• 原則,分岐した流れは併合することはない.

Page 22: オペレーティングシステム 2004 プロセス  (1)

22

fork1.c の説明• 単純に自分の複製を作成するプログラ

ム.• プログラム自体は文字 c を 1秒おきに

20個画面に表示するダケの関数 showchar(c) を実行しているだけ.

• しかし親プロセスと子プロセスで異なる文字を表示するため,プロセスが複製されたことがわかる.

Page 23: オペレーティングシステム 2004 プロセス  (1)

23

fork1.c の実行と観察• 単にコンパイルすれば動きます.

– Cygwin でも動きました.• 動作させて二つの文字が表示されるの

を確認する.• 同時に ps コマンド (ps –lx) で同じ名前

のプロセスが存在し,• 親子関係があるのを確認する.

Page 24: オペレーティングシステム 2004 プロセス  (1)

24

shell の実体 プロセス複製器

コマンド名をいれるとプログラムが実行されるのは,シェルといわれるプロセス複製プログラムと対話していることになる.

文献 1 p.81, shell は自分で作れる!

bash の例

tcsh の例

Page 25: オペレーティングシステム 2004 プロセス  (1)

25

fork2.c 簡単な shell• 文字入力をコマンドとみたてて,その

実行を行うプログラム.• bashや tcsh も基本的にはこの構成.• プロセス生成・消滅機構の簡単な例.• 観察事項

– 確かに他のコマンドを呼び出せるかを確認.– 呼び出されたコマンドともとのプログラ

ムに親子関係があるかを ps –xl 等で確認.• 親が 10秒待つようにコードをかいてある.

Page 26: オペレーティングシステム 2004 プロセス  (1)

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| }

Page 27: オペレーティングシステム 2004 プロセス  (1)

27

ライブラリ関数 execl• 実行中のプロセスを他のプログラムに

作り変える関数.• システムコール execve を簡易に使える

ようにしたもの. ( フロントエンド )

• 詳細はマニュアルを参照.• execlp と execlv とか仲間の関数が多数

ある.• 詳細は次回に.

Page 28: オペレーティングシステム 2004 プロセス  (1)

28

システムコール wait• 子プロセスの実行終了を待つための関

数.• 同時に子プロセスの利用していた資源

の解放も行う.– コレによって子プロセスは完全に消滅す

る.– コレをしないとゾンビ (後述 ) が残る場合

がある.

Page 29: オペレーティングシステム 2004 プロセス  (1)

29

プロセスの消滅とゾンビ• 計算が終わるとプロセスも消滅し,

カーネル内から削除される・・・・はずである.

• しかし, (死んだ ) 子供の情報に親がアクセスする場合を UNIX は想定しているので,計算が終わったのにプロセスのデータが残っているという状態が起こる.

• この状態を,ゾンビ状態という.

Page 30: オペレーティングシステム 2004 プロセス  (1)

30

ゾンビの例

詳細は zombie.c を参照.

Page 31: オペレーティングシステム 2004 プロセス  (1)

31

以下は雑多な用語の解説

Page 32: オペレーティングシステム 2004 プロセス  (1)

32

アンケートで目についた用語• ADT

• BSD

• SVR4

• Darwin

• Cygwin

• CUI / GUI

• IEEE

• POSIX

• kernel

• システムコール• リソース

• Daemon

• DNS

• FTP

• cftp

Page 33: オペレーティングシステム 2004 プロセス  (1)

33

リエントラント (再入可能 )

• メモリにロードされた時点でも,複数のプロセスが共有可能なプログラムの性質.

• コード側にデータ(static 変数のようなもの ) がなければ,普通リエントラント.

文献 2 p.82, 文献 5 p.26

コード(データは含まれない )

データ

データ

プロセス1

プロセス2

Page 34: オペレーティングシステム 2004 プロセス  (1)

34

80386

• インテル社の CPU で,現在広く使われているペンティアム等の直系の祖先となる.

• 現在のインテル系 CPU の基礎的技術が確立された CPU .

• i386 とか x86 とか 80x86 とか IA32 とかいう略称は,すべて 80386 とその子孫( ペンティアム等 ) を指す.

今日はおしまい