基本情報23年特別 午後 問3
【解き方】
設問1
素直に、図1のT1、T2の処理順序に在庫数(50)を入れて計算します。
T1は45、T2は60になります。
(順番におきると55になるはずなのに、45か60になってしまうことが、
問題ということ)
設問2
まず、
占有ロックというのは、読み書きが起きること=入荷、出荷
共有ロックは、参照だけ=照会
ということを確認しておきます。
だから、
T3=共有ロック
T4=占有ロック
T5=占有ロック
T6=共有ロック
となります。
図だと、
まず、T3処理が起こります
=何も動いていないのでロックできます
T3処理が終わった後、T6が起こります
=何も動いてないのでロックできます
T6処理(共有ロック)中、T4処理(占有ロック)が走ります
=共有のあとに占有なので、解除されるまで「待ちます」
T4処理(占有ロック)中、T5処理(占有ロック)が走ります
=占有同士なので「待ちます」
結局、まとめると、
T4,T5は待ち状態になるが、T6はならない
設問3
実務上で言うと、
赤と白同時にロックし、
それから読み書きし
赤と白同時にロック解除します。
つまり、アとオのタイミング?
いや、でも、同時だぞ、ふつう??
ってことは、この問題は、そういうことを聞いているのではない?
ってことで、実務上、なぜ、そうするのかを考えます。
-
-
- -
-
1つはデッドロックです。でも、これは考えないと書いてある。
もう1つ、考えることが可能な理由は、
たとえば、イの位置でロックしたとすると
白のデータを読んでいるうちに、赤のデータが書き換えられる可能性があります。
そうすると、
白のデータをロックした時に赤の在庫はあったのに、
赤のデータが白読み込み中に書き換えられ、在庫がなくなり、
その後、赤のデータを読みにいったら、在庫がない!
→赤の在庫はないので、赤と白同時に出荷したい
このトランザクションはキャンセルするしかない
ということになってしまいます。
これが在庫ならまだしも、時々刻々変化するものだと、
大きなトランザクション処理をしようとしたとき、
その中に、時々刻々変わってしまうデータがあると、
トランザクション処理中に更新されてしまっているので、
コミットできず、いつまでも待ってしまう
という問題がおこる可能性があります
これを回避するため、トランザクション開始時にすべてロックし、
トランザクション順に処理するという考え方があります。
-
-
- -
-
でも、この問題は、そういうことを聞いているのではなさそうです。
トランザクションとか、一言も出てこないし、
上記のケースでも、設問1の問題はおきていません
(設問1は、上記の場合、白のデータをコミットしてしまうとおこる。
でも、上記のケースでは、矛盾を検知し、コミットしていないので、
問題は起きていない)
この問題で聞いているのは、設問1の問題が起こってしまうケースで、
それを防ぐには、設問2に書いてあるように、
・読み込みは、共有ロック
・書き出しは、占有ロック
つまり、書き出す直前に、占有ロックをすればいいよね!
ということです。で、このとき、ロックする位置は・・・
ということを設問3(ここ)で聞いているようです。
問題の流れ(空気)読むと・・・
そうだとすると、
赤のロックは、赤を書き出す直前のβ(イ)
白のロック解除は、白書き出し直後のδ(エ)
となります。
設問4
ロックするものをまとめると、
白 赤 青 黒
T8 ○ ○
T9 ○ ○
T10 ○ ○
T11 ○ ○
デッドロックは、占有するモノを、→でつないでいくとループしてしまうようなとき、起こります。つまり、
のとき、おきます。
白 → 赤 → 青 → 白(はじめに戻る)
T8 T9 T10
つまり、イですね(他の組み合わせでは、元に戻らない)
【答え】
設問1 イ エ
設問2 ウ
設問3
c イ
d エ
設問4 イ
【解き終わって】
ちなみに、デッドロックを起こさなくさせるには、
1.資源に番号をふり
2.小さい順(大きい順でもいいけど)にロックしていく
と、待つことはあっても、デッドロックにはならないことが知られています。
つまり、
白が1番、赤が2番、青が3番、黒が4番としたとき、
白 赤 青 黒
1 2 3 4
T8 ○ ○ 白→赤
T9 ○ ○ 赤→青
T10 ○ ○ 白→青
T11 ○ ○ 青→黒
の→順にアクセスしていくと、ぐるっとループが作れないので、デッドロックしません。
このように、デッドロックを回避するには、アクセス順が必要になるので、設問3では、デッドロックを考慮しないでよいという注意書きがあるのだと思います。