Dead Lock
Menuさまざまな言語で書いたロックをテストするプログラムがある。
どれか一つの言語を選び、デッドロックする例と、それを避ける例を記述せよ。
CとPerl、Java
これらを用いて、この授業のデッドロックを2相ロックで再現してみよ。また、2相ロックでない場合に矛盾が生じる例を示せ。
(注) sleep などを使わないとうまくdead lock しないことがある。二人でおなじようにアクセスするのではdead lockしない。
flock_test.pl の使い方
echo 1 > plane.txt ; echo 1 > hotel.txt perl flock_test.pl Oc & perl flock_test.pl Attonこんな感じで実行する。
先に飛行機を予約する flock_test.pl と、先にホテルを予約する flock_test1.pl の両方を作っておく。これを組み合わせるとバグが出やすい。sleep はバグが出るように入れてる。
flock_test.pl のバグ 1
飛行機を取った時点でロックを解放してから、ホテルを取りに行くようにする。(2相ロック )
この方法では、飛行機とホテルを片方しか取れない場合があることを示せ。
一人が先にホテルをとって、一人が先に飛行機をとる必要がある。
ソースとそのようになる実行例を示せ。
flock_test.pl のバグ 2
飛行機のロックを解放をホテルをとってからにする。デッドロックが起きることを示せ。
デッドロックが起きないように順序をそろえる。
perl flock_test.pl Oc & perl flock_test.pl Atton
Java
Java のsyncrhonized method を用いて、2相ロックでのthread の dead lockが起きる可能性がある
hg ssh://shongane.ie.u-ryukyu.ac.jp//home/hg/teacher/kono/os/ex/ThreadTestのdeadLockTestを jpf で動作させて、dead lock を捕まえよ。
deak lock が起きないようにプログラムを修正せよ。
正しいプログラムがdead lockしないことをJava PathFinderを用いて確認せよ。
以下はオプションです。
Scala
同様なことをScala で記述せよ
Erlang
同様なことをErlang で記述せよ
go
同様なことをgo で記述せよ runtime.cas() を使うらしいです...