君の並行処理は実行するまでもなく間違っている #golangtokyo / golang.tokyo 20th

332f89cc697355902a817506b6995f2b?s=47 y_taka_23
December 18, 2018

君の並行処理は実行するまでもなく間違っている #golangtokyo / golang.tokyo 20th

golang.tokyo #20 で使用した論文紹介スライドです。

Go のチャネルによる並行処理は強力で魅力的な機能ですが、同時にバグが発生しやすくかつ発見しづらい部分でもあります。この論文では、Go プログラムからその挙動を形式的に記述した振舞い型 (behavioural types) を抽出することで、並行処理に潜むバグを静的に検出する手法が提案されています。

イベント概要:https://golangtokyo.connpass.com/event/111077/
元論文:http://mrg.doc.ic.ac.uk/publications/a-static-verification-framework-for-message-passing-in-go-using-behavioural-types/

332f89cc697355902a817506b6995f2b?s=128

y_taka_23

December 18, 2018
Tweet

Transcript

  1. 君の並行処理は 実行するまでもなく 間違っている チェシャ猫 (@y_taka_23) golang.tokyo #20 (2018/12/18) #golangtokyo

  2. A Static Verification Framework for Message Passing in Go Using

    Behavioural Types J.Lange et al. (2018) #golangtokyo
  3. 並行処理、完璧に書ける人? #golangtokyo

  4. #golangtokyo Development Unit / E2E Tests Operation

  5. #golangtokyo Development Unit / E2E Tests Operation too hard...

  6. #golangtokyo Development Unit / E2E Tests Operation too hard... Chaos

    Tests
  7. #golangtokyo Development Unit / E2E Tests Operation Static Types! too

    hard... Chaos Tests
  8. #golangtokyo func prod(ch chan int) { for i := 0;

    i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch2) } prod(ch chan int) {...} cons(ch1, ch2 chan int) {...} main(ch chan int) {...}
  9. #golangtokyo func prod(ch chan int) { for i := 0;

    i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch1) }
  10. #golangtokyo func prod(ch chan int) { for i := 0;

    i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch1) } prod(ch chan int) {...} cons(ch1, ch2 chan int) {...} main(ch chan int) {...}
  11. 普通の型では区別できない #golangtokyo

  12. 振る舞い型 Behavioural Types #golangtokyo

  13. #golangtokyo

  14. チャネル生成 #golangtokyo ch := make(chan int, 4)

  15. 送受信 #golangtokyo ch <- 42 / x:= <-ch

  16. バッファリング #golangtokyo x y

  17. 逐次実行 #golangtokyo T S

  18. 内部選択 #golangtokyo T S if

  19. 外部選択 #golangtokyo T S select <-ch1 <-ch2

  20. 並行実行 #golangtokyo T S

  21. #golangtokyo func prod(ch chan int) { for i := 0;

    i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch2) }
  22. #golangtokyo func prod(ch chan int) { for i := 0;

    i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch2) }
  23. #golangtokyo func prod(ch chan int) { for i := 0;

    i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch2) }
  24. #golangtokyo func prod(ch chan int) { for i := 0;

    i < 5; i++ { ch <- 1 } close(ch) } func cons(ch1, ch2 chan int) { for { select { case x := <-ch1: fmt.Println(x) case x := <-ch2: fmt.Println(x) } } } func main() { ch1, ch2 := make(chan int), make(chan int) go prod(ch1) go prod(ch2) cons(ch1, ch2) }
  25. #golangtokyo

  26. #golangtokyo Labeled Trans. Sys. Go Source Code Termination Safety /

    Liveness Specification Modal µ-Calculi Behavioural Types mCRL2 KITTeL This Paper This Paper (By Hand)
  27. 検査できる性質の例 • 無限ループが発生しない • デッドロックが発生しない • どの goroutine も飢餓状態にならない •

    close 済みチャネルに送信しない • チャネル内の値はいつか受信される #golangtokyo
  28. まとめ • 並行処理に特有の難しさ ◦ 通常の単体テストによる保証が困難 • 振る舞い型による抽象化 ◦ チャネル通信に関わる性質のみに注目 •

    実行することなく性質を保証 ◦ ラベル付き遷移系に変換して自動で検証 #golangtokyo
  29. A Static Verification Framework for Message Passing in Go Using

    Behavioural Types J.Lange et al. (2018) #golangtokyo
  30. Verify Behaviour in Go! Presented by チェシャ猫 (@y_taka_23) #golangtokyo