• 検索結果がありません。

排他制御の仕組1 まず 共有変数への排他制御を 考えてみる

N/A
N/A
Protected

Academic year: 2021

シェア "排他制御の仕組1 まず 共有変数への排他制御を 考えてみる"

Copied!
22
0
0

読み込み中.... (全文を見る)

全文

(1)

排他制御の仕組1

まず

共有変数への排他制御を 考えてみる

共有変数に

「読んで書く」更新をすると どうなるか

(2)

共有変数の更新

X を読出す X+a を計算し

X へ書戻す

X を読出す X+b を計算し

X へ書戻す

X=X+a X=X+b

プロセスA プロセスB

初期値0

共有 データ

共有変数の更新

X を読出す X+a を計算し

X へ書戻す

X を読出す X+b を計算し

X へ書戻す

X=X+a X=X+b

プロセスA プロセスB

初期値0

共有 データ

同時に⾛ると、どうなるか︖

(3)

共有変数の更新

タイミング例1 タイミング例2

Aが読出す(0) Aが読出す(0) Aが書戻す(a) Bが読出す(0) Bが読出す(a) Aが書戻す(a) Bが書戻す(a+b) Bが書戻す(b)

X=a+b X=b

X を読出す X+a を計算

X へ書戻す

X を読出す X+b を計算

X へ書戻す

X=X+a X=X+b

プロセスA プロセスB

初期値0

共有 データ

結果が違う

共有変数の更新

タイミング例1 タイミング例2

Aが読出す(0) Aが読出す(0) Aが書戻す(a) Bが読出す(0) Bが読出す(a) Aが書戻す(a) Bが書戻す(a+b) Bが書戻す(b)

X=a+b X=b

X を読出す X+a を計算

X へ書戻す

X を読出す X+b を計算

X へ書戻す

X=X+a X=X+b

プロセスA プロセスB

初期値0

共有 データ

本来なら0に a を足して b を足すので X は a+b になる

このタイミングだと X は b になる

結果が違う

(4)

共有変数の更新

タイミング例1 タイミング例2

Aが読出す(0) Aが読出す(0) Aが書戻す(a) Bが読出す(0) Bが読出す(a) Aが書戻す(a) Bが書戻す(a+b) Bが書戻す(b)

X=a+b X=b

X を読出す X+a を計算

X へ書戻す

X を読出す X+b を計算

X へ書戻す

X=X+a X=X+b

プロセスA プロセスB

初期値0

共有 データ

本来なら0に a を足して b を足すので X は a+b になる

このタイミングだと X は b になる

結果が違う

なぜか

共有変数の更新

順序がおかしい

Aが読出す(0) Aが読出す(0) Aが書戻す(a) Bが読出す(0) Bが読出す(a) Aが書戻す(a) Bが書戻す(a+b) Bが書戻す(b)

X=a+b X=b

(5)

共有変数の更新

順序がおかしい

Aが読出す(0) Aが読出す(0) Aが書戻す(a) Bが読出す(0) Bが読出す(a) Aが書戻す(a) Bが書戻す(a+b) Bが書戻す(b)

X=a+b X=b

Aが書き戻して いないので、

まだ 0 なのに Bが読出した

共有変数の更新

順序がおかしい

Aが読出す(0) Aが読出す(0) Aが書戻す(a) Bが読出す(0) Bが読出す(a) Aが書戻す(a) Bが書戻す(a+b) Bが書戻す(b)

X=a+b X=b

どうすればよいのか︖

Aが書き戻して いないので、

まだ 0 なのに Bが読出した

(6)

共有変数の更新

Aが先に読む+書くしてから、Bが読む+書くか、

Bが先に読む+書くしてから、Aが読む+書くか、

どちらかに制限する

共有変数の更新

Aが先に読む+書くしてから、Bが読む+書くか、

Bが先に読む+書くしてから、Aが読む+書くか、

どちらかに制限する (左の2つならOK)

Aが読出す(0) Bが読出す(0) Aが読出す(0) Aが書戻す(a) Bが書戻す(b) Bが読出す(0) Bが読出す(a) Aが読出す(b) Aが書戻す(a) Bが書戻す(a+b) Aが書戻す(b+a) Bが書戻す(b)

X=a+b X=a+b X=b

OK NG

(7)

共有変数の更新

Aが先に読む+書くしてから、Bが読む+書くか、

Bが先に読む+書くしてから、Aが読む+書くか、

どちらかに制限する

Aの(読む+書く)の間は、Bはアクセスさせない

Bの(読む+書く)の間は、Aはアクセスさせない

共有変数の更新

Aが先に読む+書くしてから、Bが読む+書くか、

Bが先に読む+書くしてから、Aが読む+書くか、

どちらかに制限する

Aの(読む+書く)の間は、Bはアクセスさせない

Bの(読む+書く)の間は、Aはアクセスさせない

| |

「相互排他」

(8)

排他の仕組=ロック

排他の仕組=ロック

共有データXを一方のプロセスがロックすると、

解除するまで、

他のプロセスはアクセス(読書き)できない

(9)

排他の仕組=ロック

共有データXを一方のプロセスがロックすると、

解除するまで、

他のプロセスはアクセス(読書き)できない

X を読出す X+a を計算

X へ書戻す

X を読出す X+b を計算

X へ書戻す

X=X+a X=X+b

プロセスA プロセスB

初期値0

共有 データ

ロック

解除

ロック

解除

この間は他のプロセスが 共有データXを 読書きできない

排他の仕組=ロック

共有データXを一方のプロセスがロックすると、

解除するまで、

他のプロセスはアクセス(読書き)できない

X を読出す X+a を計算

X へ書戻す

X を読出す X+b を計算

X へ書戻す

X=X+a X=X+b

プロセスA プロセスB

初期値0

共有 データ

この間は他のプロセスが 共有データXを 読書きできない

ロック

解除

ロック

解除

資源確保

資源の解放 資源を占有

(10)

• プロセス(orスレッド)

が排他的な資源を 使いたくなる

• 空いていれば占有

(ロック)できる

相互排他と占有

プロセスA

(スレッドA)

実行

相互排他が 必要な資源

占有

Aが資源を 使いたい ロックする

• プロセス(orスレッド)

が排他的な資源を 使いたくなる

• 空いていれば占有

(ロック)できる

• 使い終わったら解放

相互排他と占有

プロセスA

(スレッドA)

実行

相互排他が 必要な資源

Aが占有

Aが資源を 使いたい

実行

Aが資源を 解放する

ロックする

(11)

• プロセス(orスレッド)

が排他的な資源を 使いたくなる

• 空いていれば占有

(ロック)できる

• 他のプロセスは資源 が空くまで待たされる

(ブロックされる)

相互排他と占有

プロセスA

(スレッドA) プロセスB

(スレッドB)

実行

相互排他が 必要な資源

占有 実行

Bも資源を 使いたい Aが資源を

使いたい ロックする

既にAが使用中

• プロセス(orスレッド)

が排他的な資源を 使いたくなる

• 空いていれば占有

(ロック)できる

• 他のプロセスは資源 が空くまで待たされる

(ブロックされる)

相互排他と占有

プロセスA

(スレッドA) プロセスB

(スレッドB)

実行

相互排他が 必要な資源

Aが占有 実行

Bも資源を 使いたい Aが資源を

使いたい

Bは待たされる

ブロック されている ロックする

既にAが使用中

(12)

• プロセス(orスレッド)

が排他的な資源を 使いたくなる

• 空いていれば占有

(ロック)できる

• 使い終わったら解放

• 他のプロセスは資源 が空くまで待たされる

(ブロックされる)

相互排他と占有

プロセスA

(スレッドA) プロセスB

(スレッドB)

実行

相互排他が 必要な資源

占有 実行

Bも資源を 使いたい Aが資源を

使いたい

Bはされる

実行

Aが資源を 解放する

ブロック されている ロックする

• プロセス(orスレッド)

が排他的な資源を 使いたくなる

• 空いていれば占有

(ロック)できる

• 使い終わったら解放

• 他のプロセスは資源 が空くまで待たされる

(ブロックされる)

相互排他と占有

プロセスA

(スレッドA) プロセスB

(スレッドB)

実行

相互排他が 必要な資源

Aが占有 実行

Bも資源を 使いたい Aが資源を

使いたい

Bは待たされる占有

実行

Aが資源を 解放する

ブロック されている ロックする

空いたので ロックできる

(13)

• プロセス(orスレッド)

が排他的な資源を 使いたくなる

• 空いていれば占有

(ロック)できる

• 使い終わったら解放

• 他のプロセスは資源 が空くまで待たされる

(ブロックされる)

相互排他と占有

プロセスA

(スレッドA) プロセスB

(スレッドB)

実行

相互排他が 必要な資源

占有 実行

Bも資源を 使いたい Aが資源を

使いたい

BはされるBが占有

実行 実行

Aが資源を 解放する

Bが資源を 解放する

ブロック されている ロックする

空いたので ロックできる

ことば︓ クリティカルセクション

• 相互排他

= mutual exclusion 短縮してmutexと呼ぶ

• ロック = かぎ(錠)〜を掛け て他が入れない、占有

(14)

ことば︓ クリティカルセクション

• 相互排他

= mutual exclusion 短縮してmutexと呼ぶ

• ロック = かぎ(錠)〜を掛け て他が入れない、占有

• クリティカルセクション

(クリティカルリージョン)

||

プログラム中で、資源に排他 的にアクセスする部分のこと

プロセス(or スレッド)

資源に 関わらない コード部分

資源をロック 資源にアクセス

(1回とは限らない)

(ロックしたまま 何度もアクセス することも多い)

資源を解放

資源に 関わらない コード部分

資源使用中

この部分のコードをクリティカルセクションと呼

(脱線)ロックの実現

(15)

(脱線)ロックの実現

共有変数「ロック中」(使用中)を用意し、

(脱線)ロックの実現

共有変数「ロック中」(使用中)を用意し、

もし「1」なら使用中なので待つ

(16)

(脱線)ロックの実現

共有変数「ロック中」(使用中)を用意し、

もし「1」なら使用中なので待つ

もし「0」なら空いているので

「1」にして、使い始める 使い終わったら「0」に戻す

(脱線)ロックの実現

共有変数「ロック中」(使用中)を用意し、

もし「1」なら使用中なので待つ

もし「0」なら空いているので

「1」にして、使い始める 使い終わったら「0」に戻す

問題点︓

「ロック中」変数を共有メモリ上に取って

上の仕組を作ると うまくいかない

(17)

(脱線)ロックの実現

共有変数「ロック中」

がうまくいかない

プロセスA 共有変数ロックL

ロックの操作

ロックしたい Lを読んで 0ならOK

Lに1を書込む

プロセスB

初期値0

値1

ロックしたい Lを読んで 0ならOK

Lに1を書込む

ロックの操作

ロックできたと思 ロックできた思い込む

(脱線)ロックの実現

共有変数「ロック中」

がうまくいかない

Aが変数Lに 1 を書き 込まないうちに、

Bが L を読出して

まだ空いていると思う

プロセスA 共有変数ロックL

ロックの操作

ロックしたい Lを読んで 0ならOK

Lに1を書込む

プロセスB

初期値0

値1

ロックしたい Lを読んで 0ならOK

Lに1を書込む

ロックの操作

ロックできた思い込む ロックできたと思い込む

(18)

(脱線)ロックの実現

共有変数「ロック中」

がうまくいかない

Aが変数Lに 1 を書き 込まないうちに、

Bが L を読出して

まだ空いていると思う

AもBもロックできた と思い込む

プロセスA 共有変数ロックL

ロックの操作

ロックしたい Lを読んで 0ならOK

Lに1を書込む

プロセスB

初期値0

値1

ロックしたい Lを読んで 0ならOK

Lに1を書込む

ロックの操作

ロックできたと思 ロックできた思い込む

(脱線)ロックの実現

共有変数「ロック中」

がうまくいかない

Aが変数Lに 1 を書き 込まないうちに、

Bが L を読出して

まだ空いていると思う

AもBもロックできた と思い込む

プロセスA 共有変数ロックL

ロックの操作

ロックしたい Lを読んで 0ならOK

Lに1を書込む

プロセスB

初期値0

値1

ロックしたい Lを読んで 0ならOK

Lに1を書込む

ロックの操作

ロックできた思い込む ロックできたと思い込む

なぜ︖ ⇒ Aが「読んで書く」間に(書く前に)Bが読出すから

(19)

(脱線)ロックの実現〜解決策

1. ハードウェアに工夫して

「読む⇒書く」の動作を 不可分(その間他の操作を できない)にする

例︓Test & Set 命令など 2. 1CPU上での多プロセス

の場合に限って有効だが、

プロセス切替(割込み)を 起こさせない(禁止)よう にする

例︓割込み禁⽌による

プロセスA 共有変数ロックL

ロックの操作

ロックしたい Lを読んで 0ならOK

Lに1を書込む

プロセスB

初期値0

値1

ロックしたい Lを読んで 0ならOK

Lに1を書込む

ロックの操作

ロックできたと思 ロックできた思い込む

排他制御の仕組のまとめ

共有データ(共有ファイルも)を

「読んで書く」などしたいとき、

(20)

排他制御の仕組のまとめ

共有データ(共有ファイルも)を

「読んで書く」などしたいとき、

その間で他プロセスがアクセスすると 動作の不統一が起こる

排他制御の仕組のまとめ

共有データ(共有ファイルも)を

「読んで書く」などしたいとき、

その間で他プロセスがアクセスすると 動作の不統一が起こる

それを防ぐには

(21)

排他制御の仕組のまとめ

共有データ(共有ファイルも)を

「読んで書く」などしたいとき、

その間で他プロセスがアクセスすると 動作の不統一が起こる

それを防ぐには

他プロセスが間に入って困る不可分の動作中は

排他制御の仕組のまとめ

共有データ(共有ファイルも)を

「読んで書く」などしたいとき、

その間で他プロセスがアクセスすると 動作の不統一が起こる

それを防ぐには

他プロセスが間に入って困る不可分の動作中は ロックによって排他すればよい

(22)

42

排他制御の必要性と

ロックによる排他制御の方法が 理解できましたか︖

次へ

〇 ×

参照

関連したドキュメント

Bでは両者はだいたい似ているが、Aではだいぶ違っているのが分かるだろう。写真の度数分布と考え

IDLE 、 STOP1 、 STOP2 モードを解除可能な割り込みは、 INTIF を経由し INTIF 内の割り. 込み制御レジスター A で制御され CPU へ通知されます。

3.排出水に対する規制

いメタボリックシンドロームや 2 型糖尿病への 有用性も期待される.ペマフィブラートは他の

自分は超能力を持っていて他人の行動を左右で きると信じている。そして、例えば、たまたま

国連海洋法条約に規定される排他的経済水域(以降、EEZ

排除 (vy¯avr.tti) と排除されたもの (vy¯avr.tta) を分離して,排除 (vy¯avr.tti)

★従来は有機溶剤中毒予防規則により作業環 境へ溶剤蒸気を漏らさず、外気への排出を主に