Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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/

y_taka_23

December 18, 2018
Tweet

More Decks by y_taka_23

Other Decks in Technology

Transcript

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

    View Slide

  2. A Static Verification Framework
    for Message Passing in Go Using Behavioural Types
    J.Lange et al. (2018)
    #golangtokyo

    View Slide

  3. 並行処理、完璧に書ける人?
    #golangtokyo

    View Slide

  4. #golangtokyo
    Development
    Unit / E2E Tests
    Operation

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. #golangtokyo
    func prod(ch chan int) {
    for i := 0; i < 5; i++ {
    ch }
    close(ch)
    }
    func cons(ch1, ch2 chan int) {
    for {
    select {
    case x := case 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) {...}

    View Slide

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

    View Slide

  10. #golangtokyo
    func prod(ch chan int) {
    for i := 0; i < 5; i++ {
    ch }
    close(ch)
    }
    func cons(ch1, ch2 chan int) {
    for {
    select {
    case x := case 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) {...}

    View Slide

  11. 普通の型では区別できない
    #golangtokyo

    View Slide

  12. 振る舞い型
    Behavioural Types
    #golangtokyo

    View Slide

  13. #golangtokyo

    View Slide

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

    View Slide

  15. 送受信
    #golangtokyo
    ch

    View Slide

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

    View Slide

  17. 逐次実行
    #golangtokyo
    T
    S

    View Slide

  18. 内部選択
    #golangtokyo
    T S
    if

    View Slide

  19. 外部選択
    #golangtokyo
    T S
    select

    View Slide

  20. 並行実行
    #golangtokyo
    T S

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. #golangtokyo

    View Slide

  26. #golangtokyo
    Labeled Trans. Sys.
    Go Source Code
    Termination Safety / Liveness
    Specification
    Modal µ-Calculi
    Behavioural Types
    mCRL2
    KITTeL
    This Paper
    This Paper
    (By Hand)

    View Slide

  27. 検査できる性質の例
    ● 無限ループが発生しない
    ● デッドロックが発生しない
    ● どの goroutine も飢餓状態にならない
    ● close 済みチャネルに送信しない
    ● チャネル内の値はいつか受信される
    #golangtokyo

    View Slide

  28. まとめ
    ● 並行処理に特有の難しさ
    ○ 通常の単体テストによる保証が困難
    ● 振る舞い型による抽象化
    ○ チャネル通信に関わる性質のみに注目
    ● 実行することなく性質を保証
    ○ ラベル付き遷移系に変換して自動で検証
    #golangtokyo

    View Slide

  29. A Static Verification Framework
    for Message Passing in Go Using Behavioural Types
    J.Lange et al. (2018)
    #golangtokyo

    View Slide

  30. Verify Behaviour in Go!
    Presented by チェシャ猫 (@y_taka_23)
    #golangtokyo

    View Slide