
单进程时代
特点
- 串行:one by one
缺点
- 进程阻塞后,CPU空转
多进程/线程时代
特点
- 并发
- 调度
缺点
进程/线程切换代价大
内存占用大
- 进程:GB
- 线程:MB
协程
特点
- 非抢占式
协程和线程对应关系
1:1
1:N
- 协程阻塞问题
M:N
- 协程调度器
Goroutine
特点
内存小
- KB级别
调度灵活
runtime调度
- 协程阻塞后,其它协程可以被其它线程调用
调度器
GM
组成
G
- 全局的Goroutine队列
M
- 一组Thread
调度过程
线程互斥的去访问G
- 创建新Goroutine
- 销毁Goroutine
- 调度Goroutine
缺点
互斥访问效率低
不满足局部性原理
- Goroutine中创建的其它Goroutine由另一个线程负责
M之间切换频繁
GPM
组成
G
- 全局Goroutine队列
P
- 持有一个本地Goroutine队列
- 数量:$GOMAXPROCS
M
- Thread
调度过程
M访问P中的Goroutine
P不为空
P满了
- 将本地一半Goroutine移动到全局G队列中
P为空
- 从其它P中偷取Goroutine加入到P
- 从全局队列G中获取Goroutine加入到P
M因G阻塞
- 释放绑定的P
- 创建新的M