セマフォを用いて、二つの独立した共有資源を排他制御するプログラムを考える。共有資源AについてはセマフォSa、共有資源Bについてはセマフォ Sb
を用いるものとし、初期値はそれぞれ1とする。次の二つの並行プロセスであるプロセス1とプロセス2がある。
プロセス1 プロセス2
P(a) P(e)
P(b) P(f)
<二つの共有資源を処理> <二つの共有資源を処理>
V(c) V(g)
V(d) V(h)
a から h にはセマフオ Sa または Sb がPV命令の引数として与えられる。次のうち正しく動く組合せを選べ。
┌─┬─┬─┬─┬─┬─┬─┬─┬─┐
│ │a│b│c│d│e│f│g│h│
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│@│Sa│Sb│Sb│Sa│Sa│Sb│Sb│Sa│
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│A│Sa│Sb│Sb│Sa│Sb│Sa│Sa│Sb│
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│B│Sa│Sb│Sb│Sa│Sb│Sa│Sb│Sa│
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│C│Sb│Sa│Sa│Sb│Sa│Sb│Sb│Sa│
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│D│Sb│Sa│Sa│Sb│Sa│Sb│Sa│Sb│
└─┴─┴─┴─┴─┴─┴─┴─┴─┘
@
セマフォは、複数のプロセスが並行して動作し、一つの資源を共有する場合にそのアクセスを制御するための機構のことである。
セマフォの値は「あといくつのプロセスが使えるか」を表す。
P操作は、セマフォの値から1を引き、実行を継続する。
V操作は、セマフォの値に1を足し、待っているタスクが実行可能となる。
プロセス1とプロセス2は並行処理であるが、プロセス1がほんの少しだけ先に処理すると仮定する。
@ 正しい。
プロセス1のP(a) により Sa = 1から1を引き、Sa = 0
プロセス1のP(b) により Sb = 1から1を引き、Sb = 0
プロセス2のP(e) は、Sa が1になるのを待っている状態。
プロセス1が2つの共有資源を処理。
V(c) により Sb = 1
V(d) により Sa = 1
Sa = 1 になったので、プロセス2のP(e) が処理開始。
P(e) により Sa = 0
P(f) により Sb = 0
2つの共有資源を処理。
V(g) により Sb = 1
V(h) により Sa = 1
従って、正しく動作する。
AP(a) により Sb = 0
P(e) により Sa = 0
P(b) により Sa が1になるのを待っている状態。
P(f) により Sb が1になるのを待っている状態。
ここでデッドロックが発生する。
B Aと同じ
CP(a) により Sa = 0
P(e) により Sb = 0
P(b) により Sb が1になるのを待っている状態。
P(f) により Sa が1になるのを待っている状態。
ここでデッドロックが発生する。
D Cと同じ
W−11 | 目次 | W−13 |