並列プログラミング言語による
Dining Philosophers Problem の検証
大井 謙
数理科学コース 4年 福永研究室
2010年 3月 4日 (木)
1
目次
1. 並列処理について
2. Dining Philosophers Problem
2.1. 問題の概要
2.2. 具体的な解法
2.2.1. Edsger W.Dijkstraによる解法
2.2.2. Carel S.Scholten による解法
2.3. 解法についての検証
3. まとめ
2
1. 並列処理について
 逐次処理と並列処理
– 逐次処理 : 1つずつ処理を実行
– 並列処理 : 複数の処理を同時に実行
例 試し割りによる1000までの素数判定
逐次処理
試し割り : 判定する数を
3 ~ √n の整数で順番に
割る方法
並列処理
n = 1 ~ 1000
n = 1 ~ 500
素数 n を出力
素数 n を出力
n = 501 ~ 1000
同時に判定
計算時間削減
3
2. Dining Philosophers Problem
2.1. 問題の概要
 並列処理の同期問題を一般化した例
 発端は1971年 Edsger W.Dijkstra の提示
同期 : 同時並行して動く
処理間で時系列的な制
御をすること
5台のコンピュータがある
これらが5台のテープ装置に競合アクセスする
 Antony Hoare により一般化される
–
–
–
–
–
互いに会話しない 5人の哲学者達がいる
空腹時に座り 自分の両隣のフォークを取る
要求が満たされないと待ち続ける
食事に必要なフォークは2本
片方ずつしか取れない
← ウィキペディア
「食事する哲学者の問題」の
写真から引用
(http://ja.wikipedia.org/wi
ki/食事する哲学者の問題)
4
2. Dining Philosophers Problem
2.1. 問題の概要
 哲学者達の振舞い
PHIL = ( 座る → フォーク取る L → フォーク取る R → 食べる →
フォーク置く L → フォーク置く R → 立つ → PHIL )
 フォークの振舞い
FORK = ( R 側 PHIL に取られる → R 側 PHIL に置かれる → FORK
or
L 側 PHIL に取られる → L 側 PHIL に置かれる → FORK )
 全体の振舞い
– PHILとFORKを並列処理
(5つずつ 計10)
← ウィキペディア
「食事する哲学者の問題」の
写真から引用
(http://ja.wikipedia.org/wi
ki/食事する哲学者の問題)
5
2. Dining Philosophers Problem
2.1. 問題の概要
 何が問題なのか
– 全員同時に腹が減ったとき
5人が同時にフォークを取る
その後 もう片方を取ろうとすると・・・
誰の要求も満たされず 全員が永遠に待ち続ける
デッドロック
← ウィキペディア
「食事する哲学者の問題」の
写真から引用
(http://ja.wikipedia.org/wi
ki/食事する哲学者の問題)
6
2. Dining Philosophers Problem
2.2. 具体的な解法
 デッドロックが起こる条件
5人全員による満たされない要求が円になる
これを崩せば良い!
 2つの解法
– 哲学者の挙動を直接書き換える方法
 Edsger W.Dijkstra による解
– 外部から哲学者の挙動に制限をかける方法
 Carel S.Scholten による解
7
2. Dining Philosophers Problem
2.2. 具体的な解法
2.2.1. Edsger W.Dijkstra による解法
利き腕の違う哲学者を用意する
(※) 左利き:左 → 右 の順にフォークを取ると考える
 哲学者達の振舞い
LPHIL = ( 座る → フォーク取る L → フォーク取る R → 食べる →
フォーク置く L → フォーク置く R → 立つ → LPHIL )
RPHIL = (座る → フォーク取る R → フォーク取る L → 食べる →
フォーク置く R → フォーク置く L → 立つ → RPHIL )
8
2. Dining Philosophers Problem
2.2. 具体的な解法
2.2.1. Edsger W.Dijkstra による解法
右
4
3
2
1
ステップ 0
左
左
← ウィキペディア
「食事する哲学者の問題」の
写真から引用
(http://ja.wikipedia.org/wi
ki/食事する哲学者の問題)
左
左
9
2. Dining Philosophers Problem
2.2. 具体的な解法
2.2.2. Carel S.Scholten による解法
召使い (Footman) を 1人 任用する
(※) 召使いは 同時に4人以下の哲学者しか座らせない
 召使いの振舞い
( j ∈ {1, 2, 3} )
FOOT(0) = ( 座らせる → FOOT(1) )
FOOT( j ) = ( 座らせる → FOOT( j + 1 )
or
立たせる → FOOT( j - 1 ) )
FOOT(4) = ( 立たせる → FOOT(3) )
10
2. Dining Philosophers Problem
2.2. 具体的な解法
2.2.2. Carel S.Scholten による解法
2
1
ステップ 0
F
← ウィキペディア
「食事する哲学者の問題」の
写真から引用
(http://ja.wikipedia.org/wi
ki/食事する哲学者の問題)
11
2. Dining Philosophers Problem
2.3. 解法についての検証
 設計段階でミスがない事を保証できるか
– 哲学者1人あたりの状態数は6通り
– フォーク1本あたりの状態数は3通り
手動では非常に困難!
– 哲学者は5人 フォークは5本
最悪状態数 = 6^5 * 3^5 = 約190万
 検証ツールの重要性
例 CSP記述の検証ツール(PAT)
CSP : 並行システムを形
式的に記述し、解析する
ための言語
12
3. まとめ
まとめ
– 逐次処理と並列処理を対比した上で
並列処理に潜む問題点を確認
– Dining Philosophers Problem を
解決するための案を2つ提示・検証
– 検証ツールの重要性について考察
13
ダウンロード

PPT