golangmpg
MPCPUGgolanggo
协程和线程的区别
go
P
协程的调度
PGgolangIOruntime.Gosched()
GPMMMG
P
协程队列
gogoMGPG
PGGP
lua中的协程
luagolua
luaP
抢占式调用
go
for{}
P
go整个世界
但是如果是抢占式,那么就会在切换任务时,保存当前的上下文环境,因为当前线程如果正在做一件事,做到一半我们就强制停止,这时我们就必须多保存很多信息,避免再次切换回来时任务出错,这是需要付出代价的
go语言实现的抢占式调用是非常初级的,而且最终还是需要协程主动让出才能切换
什么时候需要抢占式调用
整个世界
sysmon
sysmon20us~10ms10ms
初次之外sysmon还需要处理gc、网络轮询器的逻辑
协程切换
go1.13sysmonfor{}
sigPreempt