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

チャネルの仕組み

 チャネルの仕組み

2018/04/16 golang.tokyo #14 の発表です

Kenshi Kamata

April 16, 2018
Tweet

More Decks by Kenshi Kamata

Other Decks in Programming

Transcript

  1. 自己紹介 • 鎌田健史 • KLab 株式会社 ◦ Unity でエディタ拡張書いたり ◦

    JS でミニゲーム作ってたり ◦ 最近は Python ツールのサポート • Women Who Go のハンズオンのお手 伝い
  2. channel の構造 • チャネルには2種類ある ◦ バッファあり/なし • 実装 ◦ https://golang.org/src/runtime/chan.go#L31

    • chan T で生成されるものは実は hchan 構造体のポインタ • メモリ上のヒープ領域に配置される
  3. バッファありチャネルの内部 • buf ◦ データを持つための配列への unsafe.Pointer • lock ◦ チャネルとデータのやり取りをするときにロックを取る

    • sendx ◦ チャネルに送った場合に配列のどこに置かれるか • recvx ◦ チャネルから取り出すときにどの位置から出すか
  4. まとめ • chan T の実態は hchan のポインタ • バッファありチャネルのバッファは FIFO

    • その実装はデータを取り出すためのインデックスとデータを受け取 るためのインデックスで実装されている
  5. 送信 buf sendx = 0 lock recvx = 0 0

    1 ・・・ 9 0 1 ・・・ 9
  6. 送信 buf sendx = 0 lock recvx = 0 0

    1 ・・・ 9 0 1 ・・・ 9
  7. 送信 buf sendx = 0 lock recvx = 0 0

    1 ・・・ 9 0 1 ・・・ 9
  8. 送信 buf sendx = 1 lock recvx = 0 0

    1 ・・・ 9 0 1 ・・・ 9
  9. 送信 buf sendx = 1 lock recvx = 0 0

    1 ・・・ 9 0 1 ・・・ 9
  10. バッファを超える送信をした場合 buf sendx = 0 lock recvx = 0 0

    1 ・・・ 9 送信をブロックしなければいけない
  11. 寄り道: goroutine のスケジューリングの話 • M:N thread モデル ◦ M 個の

    OS thread で N 個のgoroutine を分担して動かす • それぞれの OS thread に goroutine の Queue を持つ • キリが良いところまで実行して次の goroutine を実行する
  12. M 個の OS thread G M(OS thread) G G(goroutine) P(Context

    of Scheduling) G M(OS thread) G G(goroutine) P(Context of Scheduling) ・・・
  13. Select で使う場合 • 全部の channel をロックする • 全部の channel の

    sudog に自分を入れて待ち状態にする • 勝った case のところから処理を再開する