Skip to main content

go/0010-调度器

· One min read

GPM 模型

n:m

调度器核心函数 - runtime.gopark

runtime.gopark是Go调度器的核心函数之一,其源码实现位于src/runtime/proc.go中,主要用于将当前goroutine挂起(暂停执行)并切换到其他任务

func gopark(
unlockf func(*g, unsafe.Pointer) bool, // 解锁回调函数
lock unsafe.Pointer, // 关联的锁对象
reason waitReason, // 挂起原因(如等待通道、网络I/O等)
traceEv byte, // 事件跟踪标记
traceskip int, // 堆栈跟踪跳过的层级
)

1、网络 IO 阻塞:netpool 将 G 挂起,直到 fd 就绪后通过 goready 唤醒。 2、通道操作:读写 channel 时若条件不满足(如无缓冲区),会调用 gopark 并设置 waitReasonChanSend/Receive。 3、定时器:time.Sleep 最终通过 gopark 挂起 G,到期后由定时器堆触发唤醒。