18
同期通信によるモデルのチャネルを 使った実装——食事する哲学者問題 を例に 岸本 誠

Shizuoka go lang csp

Embed Size (px)

Citation preview

Page 1: Shizuoka go lang csp

同期通信によるモデルのチャネルを使った実装——食事する哲学者問題

を例に

岸本 誠

Page 2: Shizuoka go lang csp

Go(Go言語)について● GoogleのKen Thompson, Rob Pikeらによって設計・開発

● 基本的にはC言語風● 型の記法はAlgol(Pascal)系● Cの嫌な点はほとんどを改善

● GCはあるが、オブジェクトetcの機能はほどほど

Page 3: Shizuoka go lang csp

Go(Go言語)について(cont)● GAEクラウドで使えるコンパイラ言語として重宝

● インタプリタ的な実行も可能● 現在1.4.x● Google Native Client (NaCl)対応などが進行中

Page 4: Shizuoka go lang csp

チャネル● CSPから影響を受けている、Go言語の 主要機能の一つ

● ライブラリではない● スローガンDo not communicate by sharing memory; instead, share memory by communicating. (共有メモリによって通信せず、  通信によってメモリを共有せよ)

Page 5: Shizuoka go lang csp

ゴルーチン・チャネル・通信● ゴルーチン → いわゆるスレッド

● チャネル → 通信の口(ソケットの ようなもの、first class)

● チャネル通信 → ライブラリ関数ではなく そういう構文がある

Page 6: Shizuoka go lang csp

ゴルーチン・チャネル・通信● ゴルーチン

● 構文go <関数呼出>

● 例go foo()

● 無名関数をその場で作って呼出すこともできる

Page 7: Shizuoka go lang csp

ゴルーチン・チャネル・通信● チャネル

● 型: データ型名の前にchan を付ける例: chan int

● 生成: 言語組込みの型を作る汎用組込関数 make で作る例: ch := make(chan int[, size])

● サイズの指定もできる

Page 8: Shizuoka go lang csp

ゴルーチン・チャネル・通信● チャネル通信

● 送信は「送信文」例:ch <- 10

● 受信は「受信演算子」(前置)例:v := <-ch<-ch // 受信するだけ

Page 9: Shizuoka go lang csp

ゴルーチン・チャネル・通信● チャネル通信(cont)

● select文● caseに送受信イベントを列挙● CSPの外部選択● CSPについては次で

Page 10: Shizuoka go lang csp

CSPとは● Communicating Sequential Processes

● C・A・R・ホーア(クイックソートや公理的意味論)考案

● 参考資料『並行システムの検証と実装』

Page 11: Shizuoka go lang csp

サンプル「食事する哲学者の問題」● 素朴に実装すると、並行するプロセスがデッドロックし得る例

● デッドロック回避アルゴリズムや同期プリミティブのサンプル

● ここでは『並行システムの検証と実装』の§4.4から

Page 12: Shizuoka go lang csp

サンプル「食事する哲学者の問題」

http://commons.wikimedia.org/wiki/File:Dining_philosophers.png

Page 13: Shizuoka go lang csp

サンプル「食事する哲学者の問題」

Page 14: Shizuoka go lang csp

サンプル「食事する哲学者の問題」● 方針

● Go言語の機能を紹介するものとする

● JCSP版のようなCSPモデルになるべく沿った形には、しない

● 簡単な修正で、デッドロックするものとしないものを示す

Page 15: Shizuoka go lang csp

CSPによるモデルの記述●以下、全て前述の出典より

Page 16: Shizuoka go lang csp

CSPによるモデルの記述

Page 17: Shizuoka go lang csp

CSPによるモデルの記述

Page 18: Shizuoka go lang csp

サンプル「食事する哲学者の問題」

● ソースコード解説● ( https://gist.github.com/metanest/e58bb0e8c013f52ccd7d )

● デモ