タグ

2021年12月11日のブックマーク (1件)

  • GoはネットワークI/Oをどう実現しているか - 日記マン

    goroutine自体はOSスレッドに多重化してスケジュールされる。 ランタイムでは goroutine関数をG、OSスレッドをM、GをMに割り当てるスケジューラをP、と名称し実装されている。 qiita.com ではG全てがI/O実行を行いブロック状態になった場合、Gに紐づかれたMがそのままブロック状態になるのだろうか。 100個のgoroutineが同時にI/O待ちのときに、100個のOSスレッドがI/O待ちの状態になっているのか。 結論からいうとならない。なぜならラインタイム以下で非同期I/Oを実現している。 ネットワークI/Oの場合はGoの標準ライブラリではあたかもブロッキングI/Oのようなインターフェイスを提供しているが、 Goランタイム(で動くsysmonという特別なワーカー)が待ち状態のgoroutineのI/Oを非同期I/Oに変換している。 (Linux環境ではepoll(

    GoはネットワークI/Oをどう実現しているか - 日記マン