golang 协程机制
题目来源:腾讯
答案:
Golang 简称 Go,Go 的协程(goroutine)
和我们常见的线程(Thread)
一样,拥有其调度器。
- G (Goroutine),代表协程,也就是每次代码中使用
go 关键词
时候会创建的一个对象 - M (Work Thread),工作线程
- P (Processor),代表一个
处理器
,又称上下文
G-M-P三者的关系与特点:
- 每一个运行的 M 都必须绑定一个 P,线程M 创建后会去检查并执行G (goroutine)对象
- 每一个 P 保存着一个协程G 的
队列
- 除了每个 P 自身保存的 G 的队列外,调度器还拥有一个全局的 G 队列
- M 从
队列中
提取 G,并执行 - P 的个数就是
GOMAXPROCS
(最大256),启动时固定的,一般不修改 - M 的个数和 P 的个数不一定一样多(会有休眠的M 或 P不绑定M )(最大10000)
- P 是用一个全局数组(255)来保存的,并且维护着一个全局的 P 空闲链表