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

Go標準パッケージのI/O処理をながめる

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for matumoto matumoto
March 12, 2026

 Go標準パッケージのI/O処理をながめる

「Go Junction#1 by DeNA.go & DMM.go & CA.go」で発表した登壇資料です。

イベントページ: https://cyberagent.connpass.com/event/381653/

Avatar for matumoto

matumoto

March 12, 2026
Tweet

More Decks by matumoto

Other Decks in Technology

Transcript

  1. © DMM 2 松本 響輝 (matumoto) • 合同会社DMM.com 開発統括本部 マーケティングテクノロジー部所属

    • Goがちょっと好きな24新卒です • X(Twitter): @matumoto_1234 • DMM.go 運営やってます!
  2. © DMM 標準パッケージのI/O処理についての話 • ioやいくつかのパッケージに関しての紹介 • その内部での仕組み ◦ ファイルディスクリプタ、kqueue、など ◦

    (ほぼ入門的な立ち位置になります) 5 標準で提供されているパッケージを知って 実装時の手札を増やしたい!
  3. © DMM 標準パッケージのI/O処理についての話 • ioやいくつかのパッケージに関しての紹介 • その内部での仕組み ◦ ファイルディスクリプタ、kqueue、など ◦

    (ほぼ入門的な立ち位置になります) 6 標準で提供されているパッケージを知って 実装時の手札を増やしたい! さらに、内部の仕組みを理解したい!
  4. © DMM 他にも多くの補助関数が • io.CopyN(): n バイトだけ src から dst

    にコピー • io.ReadAll(): EOFまで読み取る • io.ReadAtLeast(): 少なくとも min バイト読み込む • io.Pipe(): Writerに書き込んだものがReaderから読み取れる • など 24
  5. © DMM fmtパッケージ • fmt.Fscan() や fmt.Fprint() が用意されている 28 例えば

    *os.File の Read メソッドはバッファリング されていない そのまま渡すと遅くなりがち...
  6. © DMM internal/poll パッケージについて 52 (翻訳) Package poll は、ポーリングによるファイル記述子でのノン ブロッキング

    I/O をサポートします。これにより、スレッドではなく goroutine のみをブロックする I/O 操作が可能になります。これは net パッケージおよび os パッケージで使用されます。ランタイムに 組み込まれたポーラーを使用し、ランタイムスケジューラのサポー トを受けています。
  7. © DMM ファイルディスクリプタ(FD) • プロセスがファイルを識別するためにカーネルが割り当てる非 負の整数値 • 0, 1, 2

    は特殊なFDとしてあらかじめ /dev/stdin, /dev/stdout, /dev/stderr にそれぞれ紐づけられている 54 0 1 2 3 …
  8. © DMM (再掲)internal/poll パッケージについて 58 (翻訳) Package poll は、ポーリングによるファイル記述子でのノン ブロッキング

    I/O をサポートします。これにより、スレッドではなく goroutine のみをブロックする I/O 操作が可能になります。これは net パッケージおよび os パッケージで使用されます 。ランタイム に組み込まれたポーラーを使用し、ランタイムスケジューラのサ ポートを受けています。
  9. © DMM (再掲)internal/poll パッケージについて 59 (翻訳) Package poll は、ポーリングによるファイル記述子でのノン ブロッキング

    I/O をサポートします。これにより、スレッドではなく goroutine のみをブロックする I/O 操作が可能になります。これは net パッケージおよび os パッケージで使用されます 。ランタイム に組み込まれたポーラーを使用し、ランタイムスケジューラのサ ポートを受けています。 poll.FD は net パッケージでも使われている
  10. © DMM いったんここまで整理 • os.File の Read では poll.FD の

    Read が呼ばれてる! • net.TCPConn の Read でも poll.FD の Read が呼ばれてる • そしてシステムコールを使って読み込み処理をしている! 67
  11. © DMM (再掲)internal/poll パッケージについて 70 (翻訳) Package poll は、ポーリングによるファイル記述子での ノンブロッキング

    I/O をサポートします。これにより、スレッドでは なく goroutine のみをブロックする I/O 操作が可能になります。 これは net パッケージおよび os パッケージで使用されます。ラン タイムに組み込まれたポーラーを使用し、ランタイムスケジュー ラのサポートを受けています。
  12. © DMM GMPモデル • G: Goroutine。 • M: Machine。OSのスレッド •

    P: Processor。GとMの紐付けをするキューを持つ • グローバルキュー: グローバルに使えるGを貯めるキュー • sysmon: 監視 + グローバルキューへの移動など • system monitor(専用のMと紐づいている) • netpoller: ネットワークI/Oでポーリング処理を担うもの 73
  13. © DMM こんな感じで動いているとする 75 P1 グローバルキュー G1 G2 M1 P2

    G3 M2 sys mon netpoller P(キュー)に積まれたGoroutineが M(OSスレッド)で実行されていく M3
  14. © DMM こんな感じで動いているとする 76 P1 グローバルキュー G1 G2 M1 P2

    G3 M2 sys mon netpoller G3がネットワーク 読み込み待ちになる M3
  15. © DMM こんな感じで動いているとする 78 P1 グローバルキュー G1 G2 M1 P2

    G3 M2 sys mon netpoller M3 読み込み準備が完了したら、 グローバルキューに入れる
  16. © DMM M3 こんな感じで動いているとする 79 P1 グローバルキュー G1 G2 M1

    P2 G3 M2 sys mon netpoller 空いているM(OSスレッド)は 別のGを割り当てて使える
  17. © DMM M3 こんな感じで動いているとする 80 P1 グローバルキュー G1 G2 M1

    P2 G3 M2 sys mon netpoller 空いている M(OSスレッド)は 別のGを割り当てて使える →OSスレッドはブロックしない !
  18. © DMM まとめ • I/O処理ではシステムコールが呼ばれている • Goの内部ではgoroutineとOSスレッドの割り当てをうまくするこ とでOSスレッドのブロッキングを防ぐ仕組みがある • (少なくともNetwork

    I/Oでは。Network I/O以外でnetpollerのような仕 組みは見つけられずでしたがあるんでしょうか) • netpoller では epoll や kqueue といったシステムコールでイベ ント監視をしている 84