golang MPG并发模型
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