プロセスの状態遷移

プロセスの状態遷移
復習です
前の教材で
「プロセスの切換え」の
内容を覚えていますか
1
プロセスの切換えは
• 何のため?
2
プロセスの切換えは
• 何のため? (元々は)CPUの空き時間を
少なくするため
3
プロセスの切換えは
• 何のため? (元々は)CPUの空き時間を
少なくするため
• 何をする?
4
プロセスの切換えは
• 何のため? (元々は)CPUの空き時間を
少なくするため
• 何をする? プログラムを切換えて実行す
る
5
プロセスの切換えは
• 何のため? (元々は)CPUの空き時間を
少なくするため
• 何をする? プログラムを切換えて実行す
る
• 具体的にはどうやって切換える?
6
プロセスの切換えは
• 何のため? (元々は)CPUの空き時間を
少なくするため
• 何をする? プログラムを切換えて実行す
る
• 具体的にはどうやって切換える?
• メモリ上のプログラムイメージはそのままで
• CPU上のPC・レジスタ・フラグを退避・復旧
7
それぞれのプロセスを
時間軸で見る
8
それぞれのプロセスを時間軸で見る
C物
P理
U的
はに
1は
つ
仕事Aをする
仮想CPU-1
仕事Bをする
仮想CPU-2
仕事Bの
計算
• 前にこんな絵があった
9
仕事Aの
計算
仕事Aの
計算
仕事Bの
計算
仕事Bの
計算
それぞれのプロセスを時間軸で見る
C物
P理
U的
はに
1は
つ
仕事Aをする
仮想CPU-1
仕事Bをする
仮想CPU-2
仕事Aの
計算
仕事Aの
計算
仕事Bの
計算
仕事Bの
計算
仕事Bの
計算
• 前にこんな絵があった
• プロセス(仮想CPU)を管理する立場で
それぞれのプロセスを追いかけてみよう
10
それぞれのプロセスを時間軸で見る
仕事Aをする
仮想CPU-1
仕事Aの
計算
仕事Aの
計算
時間軸
11
それぞれのプロセスを時間軸で見る
仕事Aをする
仮想CPU-1
仕事Aの
計算
仕事Aの
計算
時間軸
• プロセス(仮想CPU)1は
CPUが割り当てられていれば計算を実行
12
それぞれのプロセスを時間軸で見る
仕事Aをする
仮想CPU-1
仕事Aの
計算
仕事Aの
計算
時間軸
• プロセス1(仮想CPU-1)は
実CPUが割り当てられていれば計算を実行
• そうでないときは(元の話では「入出力中」)
13
それぞれのプロセスを時間軸で見る
仕事Aをする
仮想CPU-1
仕事Aの
計算
仕事Aの
計算
時間軸
• プロセス1(仮想CPU-1)は
実CPUが割り当てられていれば計算を実行
• そうでないときは(元の話では「入出力中」)
CPUを使わない/入出力を待っている状態
14
それぞれのプロセスを時間軸で見る
仕事Aをする
仮想CPU-1
仕事Aの
計算
仕事Aの
計算
時間軸
「状態」という眼で見ると
• CPUで処理を実行中の状態
か
• 入出力を待っていてCPUを使わない状態
15
もう少し細かく見ると
それぞれのプロセスについて
• CPUで処理を実行中の状態
16
前のページで見た
もう少し細かく見ると
それぞれのプロセスについて
• CPUで処理を実行中の状態
これも前のページで見た
• 入出力の終わるのを待っている状態
(CPUを使っていない)
17
もう少し細かく見ると
それぞれのプロセスについて
• CPUで処理を実行中の状態
• 入出力の終わるのを待っている状態
(CPUを使っていない)
• CPUが空くのを待っている状態
(この時もこのプロセスはCPUを使っていない)
の3つの状態が考えられる
18
もう少し説明しよう
プロセスが何かを待っている時
• 2通りの理由が考えられる
19
プロセスが何かを待っている時
• 2通りの理由が考えられる
• 入出力などCPUが自分では制御できない
ことが終わるのを待っている時
20
プロセスが何かを待っている時
• 2通りの理由が考えられる
• 入出力などCPUが自分では制御できない
ことが終わるのを待っている時
• 自分は今でも実行できる (何かが終わるのを
待っているわけではない) のに
CPUを他の人が使っているために
CPUが空くのを待っている時
21
プロセスが何かを待っている時
• 2通りの理由が考えられる
• 入出力などCPUが自分では制御できない
ことが終わるのを待っている時
• 自分は今でも実行できる (何かが終わるのを
待っているわけではない) のに
CPUを他の人が使っているために
CPUが空くのを待っている時
この2つを区別する
22
プロセスが何かを待っている時
• 2通りの理由が考えられる
事象待ち状態
• 入出力などCPUが自分では制御できない
ことが終わるのを待っている時
• 自分は今でも実行できる (何かが終わるのを
待っているわけではない) のに 実行可能状態
CPUを他の人が使っているために
CPUが空くのを待っている時
この2つを区別する
23
計算実行中状態と併せると
• 3つの状態が考えられる
24
計算実行中状態と併せると
• 3つの状態が考えられる
• 実行中 CPUで処理が実行中の状態
• 事象待ち 入出力などが終わるのを
待っている状態
• 実行可能 CPUが空くのを待っている状態
別名「レディ状態」とも呼ぶ
25
もう少しあります
「状態遷移」の考え方
26
「状態遷移」とは
• 状態の「移り変わり」という意味
27
「状態遷移」とは
• 状態の「移り変わり」という意味
• いくつかの(有限個の)状態の間を遷移する
28
「状態遷移」とは
• 状態の「移り変わり」という意味
• いくつかの(有限個の)状態の間を遷移する
•例
単純な信号機
赤 → 青 → 黄 → 赤 の順で変化する
変化のきっかけは、予め決めた時間の経過
29
「状態遷移」とは
• 状態の「移り変わり」という意味
• いくつかの(有限個の)状態の間を遷移する
•例
単純な信号機
赤 → 青 → 黄 → 赤 の順で変化する
変化のきっかけは、予め決めた時間の経過
動作の様子を図に描いてみる
(状態遷移図と呼ぶ)
30
「状態遷移」とは
• 状態の「移り変わり」という意味
• いくつかの(有限個の)状態の間を遷移する
•例
単純な信号機
X秒経過
状態
「青」
状態
「黄」
Y秒経過
Z秒経過
信号機の状態遷移図
31
状態
「赤」
「状態遷移」とは
• 状態の「移り変わり」という意味
• いくつかの(有限個の)状態の間を遷移する
•例
単純な信号機
・状態を長丸で書く
状態の名前を長丸の中に書く
状態
「黄」
状態
「青」
信号機の状態遷移図
32
状態
「赤」
「状態遷移」とは
• 状態の「移り変わり」という意味
• いくつかの(有限個の)状態の間を遷移する
•例
単純な信号機
・状態を長丸で書く
状態の名前を長丸の中に書く
・状態間の遷移を矢印で書く
X秒経過
状態
「青」
状態
「黄」
遷移を起こす条件を傍に書く
Y秒経過
Z秒経過
信号機の状態遷移図
33
状態
「赤」
では、プロセスの「状態遷移」は
34
では、プロセスの「状態遷移」は
• プロセスの状態の「移り変わり」
35
では、プロセスの「状態遷移」は
• プロセスの状態の「移り変わり」
• プロセスの状態は?
36
では、プロセスの「状態遷移」は
• プロセスの状態の「移り変わり」
• プロセスの状態は
そうです!
「実行中」「事象待ち」「実行可能」の3つ
37
では、プロセスの「状態遷移」は
• プロセスの状態の「移り変わり」
• プロセスの状態は
「実行中」「事象待ち」「実行可能」
• では、状態遷移(移り変わり)は?
38
条件は?
では、プロセスの「状態遷移」は
• プロセスの状態の「移り変わり」
• プロセスの状態は
「実行中」「事象待ち」「実行可能」
• では、状態遷移(移り変わり)は?
1つ1つよく考えてみましょう!
39
条件は?
では、プロセスの「状態遷移」は
• プロセスの状態の「移り変わり」
• プロセスの状態は
「実行中」「事象待ち」「実行可能」
• では、状態遷移(移り変わり)は? 条件は?
1つ1つよく考えてみましょう!
「実行中」から他の2つへ移るのは?
40
「実行中」から他の2つへ移るのは?
• CPUで実行していたプロセスを中断して
• 事象待ち (例えば入出力完了待ち) に移るのは?
どういう時でしょうか?
41
「実行中」から他の2つへ移るのは?
• CPUで実行していたプロセスを中断して
• 事象待ち (例えば入出力完了待ち) に移るのは?
どういう時でしょうか?
>そう、写真でタイマーを押してパシャッと
なるのを待つ感じ
42
「実行中」から他の2つへ移るのは?
• CPUで実行していたプロセスを中断して
• 事象待ち (例えば入出力完了待ち) に移るのは?
どういう時でしょうか?
>そう、写真でタイマーを押してパシャッと
なるのを待つ感じ
入出力だと、入力(出力)頼むって言って
データが入ってくる(印刷される)のを待つ
43
「実行中」から他の2つへ移るのは?
• CPUで実行していたプロセスを中断して
• 事象待ち (例えば入出力完了待ち) に移るのは?
どういう時でしょうか?
>つまり事象を仕掛けたとき、です
44
「実行中」から他の2つへ移るのは?
• CPUで実行していたプロセスを中断して
• 事象待ち (例えば入出力完了待ち) に移るのは?
>事象を仕掛けたとき
• では、実行可能状態に移るのは?
45
「実行中」から他の2つへ移るのは?
• CPUで実行していたプロセスを中断して
• 事象待ち (例えば入出力完了待ち) に移るのは?
>事象を仕掛けたとき
• では、実行可能状態に移るのは?
>これは「プロセスからCPUを取り上げる」
ことに相当します
46
「実行中」から他の2つへ移るのは?
• CPUで実行していたプロセスを中断して
• 事象待ち (例えば入出力完了待ち) に移るのは?
>事象を仕掛けたとき
• では、実行可能状態に移るのは?
>これは「プロセスからCPUを取り上げる」
ことに相当します
プリエンプションと呼びます
47
「実行中」から他の2つへ移るのは?
• CPUで実行していたプロセスを中断して
• 事象待ち (例えば入出力完了待ち) に移るのは?
>事象を仕掛けたとき
• では、実行可能状態に移るのは?
>これは「プロセスからCPUを取り上げる」
ことに相当します
プリエンプションと呼びます
後で出てくる「CPUスケジューリング」で
使います。ここでは置いておきます
48
「実行中」から他の2つへ移るのは?
• CPUで実行していたプロセスを中断して
• 事象待ち (例えば入出力完了待ち) に移るのは?
>事象を仕掛けたとき
• 実行可能状態に移るのは?
>プロセスからCPUを取り上げるとき
(プリエンプション)
• となりました。では事象待ちの場合は?
49
「事象待ち」から他の2つへ移るのは?
• 事象待ち状態のプロセスは、
待っていた事象が起きるとどうするか?
• 例えば入力完了待ちが、入力が完了すると
どうするでしょうか?
50
「事象待ち」から他の2つへ移るのは?
• 事象待ち状態のプロセスは、
待っていた事象が起きるとどうするか?
• 例えば入力完了待ちが、入力が完了すると
どうするでしょうか?
• 入力を受取って次の処理を始めるでしょう
>つまり、実行を始めるわけです
51
「事象待ち」から他の2つへ移るのは?
• 事象待ち状態のプロセスは、
待っていた事象が起きるとどうするか?
• 例えば入力完了待ちが、入力が完了すると
どうするでしょうか?
• 入力を受取って次の処理を始めるでしょう
>つまり、実行を始めるわけです
では「実行状態」にするのか?
52
「事象待ち」から他の2つへ移るのは?
• 事象待ち状態のプロセスは、
待っていた事象が起きるとどうするか?
• 例えば入力完了待ちが、入力が完了すると
どうするでしょうか?
• 入力を受取って次の処理を始めるでしょう
>つまり、実行を始めるわけです
では「実行中状態」にするのか?
実は、「実行可能状態」にします
53
「事象待ち」から他の2つへ移るのは?
• 事象待ち状態のプロセスは、
待っていた事象が起きるとどうするか?
• 実行可能状態にする
なぜ「実行中」にしないで「実行可能」か?
54
「事象待ち」から他の2つへ移るのは?
• 事象待ち状態のプロセスは、
待っていた事象が起きるとどうするか?
• 実行可能状態にする
なぜ「実行中」にしないで「実行可能」か?
脱線になりますが、細かく説明します。
55
脱線
なぜ「実行中」にしないで「実行可能」か?
• Aが事象待ちだと、CPUは他の仕事Bをしています
つまり、CPU上には実行中のプロセスBがいます
•
56
脱線
なぜ「実行中」にしないで「実行可能」か?
• Aが事象待ちだと、CPUは他の仕事Bをしています
つまり、CPU上には実行中のプロセスBがいます
• この時、事象待ちだったプロセスAを
いきなり「実行中」にすると、
今CPUを使っているプロセスBを追い出します
57
脱線
なぜ「実行中」にしないで「実行可能」か?
• Aが事象待ちだと、CPUは他の仕事Bをしています
つまり、CPU上には実行中のプロセスBがいます
• この時、事象待ちだったプロセスAを
いきなり「実行中」にすると、
今CPUを使っているプロセスBを追い出します
• もしAがBと同程度に重要(優先度が同程度)なら
わざわざBを追い出すことも無いわけです
58
脱線
なぜ「実行中」にしないで「実行可能」か?
• Aが事象待ちだと、CPUは他の仕事Bをしています
つまり、CPU上には実行中のプロセスBがいます
• この時、事象待ちだったプロセスAを
いきなり「実行中」にすると、
今CPUを使っているプロセスBを追い出します
• もしAがBと同程度に重要(優先度が同程度)なら
わざわざBを追い出すことも無いわけです
Bが済んでからAを続けたってよいでしょう
59
脱線
なぜ「実行中」にしないで「実行可能」か?
• Aが事象待ちだと、CPUは他の仕事Bをしています
つまり、CPU上には実行中のプロセスBがいます
• この時、事象待ちだったプロセスAを
いきなり「実行中」にすると、
今CPUを使っているプロセスBを追い出します
• またBがAより重要(優先度が高い)なら
AがBを追い出してはいけないでしょう
• だから実行可能でCPUが空くのを待たせるわけです
60
「事象待ち」から他の2つへ移るのは?
戻ります
• 事象待ち状態のプロセスは、
待っていた事象が起きるとどうするか?
• 実行可能状態にする
なお、事象待ち状態から出てゆく矢印は
これ1つしかありません
ではその次
61
「実行可能」から他の2つへ移るのは?
• 実行可能状態のプロセスは、
次にどういう状態遷移があるか?
62
「実行可能」から他の2つへ移るのは?
• 実行可能状態のプロセスは、
次にどういう状態遷移があるか?
• 実行可能 → 実行中 が考えられます
これはCPUが空いたので、CPUを待っていた
プロセスが実行を始めるときです
63
「実行可能」から他の2つへ移るのは?
• 実行可能状態のプロセスは、
次にどういう状態遷移があるか?
• 実行可能 → 実行中 が考えられます
これはCPUが空いたので、CPUを待っていた
プロセスが実行を始めるときです
CPUを与えて実行を始めさせることを
プロセスをディスパッチすると呼びます
64
「実行可能」から他の2つへ移るのは?
• 実行可能状態のプロセスは、
次にどういう状態遷移があるか?
• 実行可能 → 実行中 が考えられます
きっかけはCPUが空いてディスパッチされた為
• 実行可能 → 事象待ち
なぜ?
65
はあり得ません
「実行可能」から他の2つへ移るのは?
• 実行可能状態のプロセスは、
次にどういう状態遷移があるか?
• 実行可能 → 実行中 が考えられます
きっかけはCPUが空いてディスパッチされた為
• 実行可能 → 事象待ち
はあり得ません
実行可能はCPUの空き待ち状態なので、まだ
CPUは割当てられていません。
命令を実行しないので、事象待ちを発生させる
操作 (入力起動とか) が起こらないからです
66
全体をまとめると
プロセスの状態遷移は、
67
全体をまとめると
プロセスの状態遷移は、
• 実行中 → 事象待ち(入出力起動などで待ちを
仕掛けた為)
• 実行中 → 実行可能(CPUの取上げの為
プリエンプション)
• 事象待ち → 実行可能(事象が発生した為)
• 実行可能 → 実行中(CPUが空いてディスパッチ
された為)
68
全体をまとめると
プロセスの状態遷移は、
• 実行中 → 事象待ち(入出力起動などで待ちを
仕掛けた為)
• 実行中 → 実行可能(CPUの取上げの為
プリエンプション)
• 事象待ち → 実行可能(事象が発生した為)
• 実行可能 → 実行中(CPUが空いてディスパッチ
された為)
では、状態遷移図を描いてみましょう
69
状態遷移図に描くと
• 実行中 → 事象待ち(事象待ちを仕掛けた為)
• 実行中 → 実行可能(CPUの取上げプリエンプションの為)
• 事象待ち → 実行可能(事象が発生した為)
• 実行可能 → 実行中(ディスパッチされた為)
実行可能
状態
事象発生
CPU割当て
(ディスパッチ)
CPU取上げ
(プリエンプション)
事象待ち
状態
実行中
状態
事象待ち
プロセスの状態遷移図
70
まとめると
• 1つ1つのプロセスの「状態」を管理する
• 3つの状態がある
•
?
•
?
•
?
• 状態間の遷移を考える
• 状態遷移図が描ける
71
自分で描けますね
おまけの状態遷移
• 教科書には「生成」と「消滅」がある
• プロセスが無い状態から生成されると実行可能になる
• 実行中のプロセスが消滅(=自殺)する
生成
実行可能
状態
事象発生
あまり本質でない
ので紹介するだけ
にしておく
72
CPU割当て
(ディスパッチ)
CPU取上げ
(プリエンプション)
事象待ち
状態
実行中
状態
事象待ち
プロセスの状態遷移図
消滅
プロセスの状態遷移について
理解できましたか?
〇
次へ
73
×