go PMG

92 阅读1分钟
sequenceDiagram
participant go as 程序启动进程
participant p as p处理器
participant m as m线程
participant s as sched调度器

 


go->>m: 创建10000个线程
go->>p: 创建 GOMAXPROCS 个处理器

p->>m: 尝试与m进行1:1绑定
loop pmg循环
m->>p: 尝试获取可执行g
p->>p: 1. 先从本地队列查找,2. 在从全局队列查找, 3. 从其他p处理器上窃取
p-->>m: 没有可运行g,则自动休眠,有可运行g则执行g代码。g运行成功后则继续循环
end

go->>p: 通过go func创建g
p->>p: 存储本地队列中,本地队列满则存储到全局队列,闲置的P处理器唤醒m线程,执行 [pmg循环]
s->>m: g运行过程中是否阻塞,没有阻塞则执行 [pmg循环]
s->>p: g执行时阻塞,将p处理器和m线程绑定解除,让p处理器重新绑定新创建线程(空闲线程会复用),保障并发度
m->>m: g执行完毕,尝试获取空闲p处理器执行,如果获取不到p处理器,m线程进入休眠,g被放入全局队列