...menustart
...menuend
- Q: 线程切换开销大
- A:
- Go 语言的调度器通过使用与 CPU 数量相等的线程, 以减少线程频繁切换的开销, 同时在每一个线程上执行额外开销更低的 Goroutine 来降低操作系统和硬件的负载。
-
v1.1 任务窃取调度器
- 引入处理器, G-M-P 模型
- P 持有一个G的队列,还反向持有一个 线程M, 调度器 在调度时 会从P的队列中取G 放到M上执行。
- 任务窃取调度器将每一个线程绑定到了独立的 CPU 上,这些线程会被不同的P管理。不同的P通过工作窃取对任务进行再分配实现任务的平衡,
-
问题: 在某些情况下,Goroutine 不会让出线程,进而造成饥饿问题;
-
v1.2 抢占式调度器
-
v1.4 基于信号的抢占式调度。