调度器
线程是操作系统调度时的基本单元,而linux并不区分线程和进程的调度
设计原理
GMP调度器(线程M,Goroutine G 和处理器P) 历史上其实本身是G-M模型
历史变迁
单线程调度器
简单评价就是一个能用的调度器,G-M模型。全局只有一个线程
多线程调度器
GOMAXPROCS 可以控制程序中的最大处理器数,即活跃线程数
- 调度器和锁是全局资源,所有的调度状态都是中心化存储的,锁竞争问题严重
- 线程需要经常互相传递可运行的Goroutine,引入了大量的延迟
- 每个线程都需要处理内存缓存,导致大量的内存占用并影响数据局部性
- 系统调用频繁阻塞和解除阻塞正在运行的线程,增加了额外开销
任务窃取调度器
- 当前的G-M模型中引入了处理器P,增加中间层
- 在处理器P的基础上实现了基于工作窃取的调度器
抢占式调度器
一些疑问
- go的调度器,其实跟linux系统里面的线程调度的本质区别是什么,是否也是抢占式调度 采用抢占式调度如何避免饿死的问题
- 调度相关的问题,其实在java的场景中应该也会遇到,有时间可以查下java里面的调度是什么样子的