デッドロック発見器をつくる(2)
11月30日土曜日、晴れ
参加してきた。
同時に動く複数のプログラムの協調を「イベント同期」という仕組みをつかって見る、というもの。
イベント同期とは例えばプログラムAがイベントEを出して別のプログラムBが同じイベントEを出すまで待ちあわせるだとか、プログラムAがイベントE1からE5までの五つを提示して待っているところにプログラムBがイベントE2を出してE2を選択するだとか。
例えばと言いながら非常に抽象的な話になったけれど、これを基礎に据えてプログラムの協調をモデル化し動作を確認できる。
「メモリー」プロセスと、これから数を読み出して1加えて書き戻す「加算」プロセス二つを同時に走らせるとどうなるか。
「加算」プロセスが「読み」「書き」「読み」「書き」の順で動作すれば(0から始めて)結果は2になるけれど、不幸にして「読み」「読み」「書き」「書き」の順に動いてしまうと結果は1になる──という話を、今日つくった検出器で可視化できる。下の図がそう。
このモデル化では、ふたつの加算プロセスが読み書きする共有メモリーさえもが「プロセス」として表現されるというところが面白い。
そして共有メモリープロセスは、その値を「変数」として(あるいは「記憶域」として)覚えるのでなく、その実行位置で覚えるところも面白い。(変数があるとしてもいいけれど、それは本質ではない。状態遷移図の「状態」が覚えている数字を表現するのだ)
この問題を解決するために「ミューテックス」を導入しましょう、となるわけだけれど、これもまたプロセスで表現する。
ミューテックスを利用する「加算」プロセスはこんな感じになって……
これ二つが同時に動くなら、こんな複雑な話になり……
他方でミューテックスとメモリーは同時に動くとこうで、
この二つを合成するとあら不思議。排他制御が完成しました。
ほんとうにおもちゃのようなプログラムだけれど、自分でつくったおもちゃが動くのは楽しい。