golang 早期调度的实现原理

mNQrnbyQbg

老调度器的几个缺点:

  1. 创建、销毁、调度 goroutine 都需要每个 M获取锁, 这就形成了激烈的锁竞争。
  2. M 转移 G 会造成延迟和额外的系统负载
  3. 系统调用(CPU 在 M之间的切换)导致频繁的协程阻塞和取消阻塞操作增加了系统开销。

多进程和多线程的缺点

  1. 设计复杂:
    1. 进程线程数量越多,切换成本就越大,也就越是浪费
    2. 搞CPU 调度消耗

进程占用内存: 虚拟内存 4GB

线程占用内存 约为 4MB

协程 引发的问题?

  1. N:1 无法利用 多个 CPU
  2. 1:1 切换协程成本昂贵
  3. M:N 能够利用多核的优势

早期 go语言调度器 使用 队列 处理 协程, 多个线程切换调度队列的任务。