Upload
makoto-kishimoto
View
541
Download
0
Embed Size (px)
Citation preview
同期通信によるモデルのチャネルを使った実装——食事する哲学者問題
を例に
岸本 誠
Go(Go言語)について● GoogleのKen Thompson, Rob Pikeらによって設計・開発
● 基本的にはC言語風● 型の記法はAlgol(Pascal)系● Cの嫌な点はほとんどを改善
● GCはあるが、オブジェクトetcの機能はほどほど
Go(Go言語)について(cont)● GAEクラウドで使えるコンパイラ言語として重宝
● インタプリタ的な実行も可能● 現在1.4.x● Google Native Client (NaCl)対応などが進行中
チャネル● CSPから影響を受けている、Go言語の 主要機能の一つ
● ライブラリではない● スローガンDo not communicate by sharing memory; instead, share memory by communicating. (共有メモリによって通信せず、 通信によってメモリを共有せよ)
ゴルーチン・チャネル・通信● ゴルーチン → いわゆるスレッド
● チャネル → 通信の口(ソケットの ようなもの、first class)
● チャネル通信 → ライブラリ関数ではなく そういう構文がある
ゴルーチン・チャネル・通信● ゴルーチン
● 構文go <関数呼出>
● 例go foo()
● 無名関数をその場で作って呼出すこともできる
ゴルーチン・チャネル・通信● チャネル
● 型: データ型名の前にchan を付ける例: chan int
● 生成: 言語組込みの型を作る汎用組込関数 make で作る例: ch := make(chan int[, size])
● サイズの指定もできる
ゴルーチン・チャネル・通信● チャネル通信
● 送信は「送信文」例:ch <- 10
● 受信は「受信演算子」(前置)例:v := <-ch<-ch // 受信するだけ
ゴルーチン・チャネル・通信● チャネル通信(cont)
● select文● caseに送受信イベントを列挙● CSPの外部選択● CSPについては次で
CSPとは● Communicating Sequential Processes
● C・A・R・ホーア(クイックソートや公理的意味論)考案
● 参考資料『並行システムの検証と実装』
サンプル「食事する哲学者の問題」● 素朴に実装すると、並行するプロセスがデッドロックし得る例
● デッドロック回避アルゴリズムや同期プリミティブのサンプル
● ここでは『並行システムの検証と実装』の§4.4から
サンプル「食事する哲学者の問題」
http://commons.wikimedia.org/wiki/File:Dining_philosophers.png
サンプル「食事する哲学者の問題」
サンプル「食事する哲学者の問題」● 方針
● Go言語の機能を紹介するものとする
● JCSP版のようなCSPモデルになるべく沿った形には、しない
● 簡単な修正で、デッドロックするものとしないものを示す
CSPによるモデルの記述●以下、全て前述の出典より
CSPによるモデルの記述
CSPによるモデルの記述
サンプル「食事する哲学者の問題」
● ソースコード解説● ( https://gist.github.com/metanest/e58bb0e8c013f52ccd7d )
● デモ