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