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,到期后由定时器堆触发唤醒。