1.基础模型

1.1.单进程时代的两个问题

  • 当一执行流程、计算机智能一个任务一个任务处理
  • 进程堵塞所带来的CPU浪费时间

1.2.能不能宏观的执行多个任务呢?

17.Goroutine的基本模型和调度设计策略_单进程

1.3.多线程/多进程解决了阻塞问题

新的问题

17.Goroutine的基本模型和调度设计策略_复用_02

说明

17.Goroutine的基本模型和调度设计策略_Go_03

面临的问题

  • 多线程 随着 同步竞争(如 锁、竞争资源冲突等)
  • 开发设计 变的越来越复杂 17.Goroutine的基本模型和调度设计策略_多线程_04

1.4.思考

1.4.1.空间切分

17.Goroutine的基本模型和调度设计策略_复用_05

延伸
17.Goroutine的基本模型和调度设计策略_单进程_0617.Goroutine的基本模型和调度设计策略_复用_07

17.Goroutine的基本模型和调度设计策略_系统开销_08

继续演化
17.Goroutine的基本模型和调度设计策略_复用_09

1.4.2.Golang对协程的处理

17.Goroutine的基本模型和调度设计策略_多线程_10

早期调度器的处理

17.Goroutine的基本模型和调度设计策略_复用_11
17.Goroutine的基本模型和调度设计策略_单进程_12
17.Goroutine的基本模型和调度设计策略_系统开销_13
早期调度器缺点

  • 创建、销毁、调度G都需要每个M获取锁,这就形成了激烈的所竞争。
  • M转移G会造成延迟和额外的系统负载 17.Goroutine的基本模型和调度设计策略_Go_14
  • 系统调用(cpu在M之间的切换)导致频繁的线程堵塞和取消操作增加了系统开销

GMP

17.Goroutine的基本模型和调度设计策略_Go_15

详细说明
17.Goroutine的基本模型和调度设计策略_系统开销_16

2.调度器设计策略

  • 复用线程
    • work stealing机制
    • hand off 机制
  • 利用并行
    • GOMAXPROCS限定P的个数
    • = CPU核数/2
  • 抢占
  • 全局G队列

2.1.work stealing机制

17.Goroutine的基本模型和调度设计策略_Go_17
17.Goroutine的基本模型和调度设计策略_复用_18

2.2.hand off 机制

17.Goroutine的基本模型和调度设计策略_系统开销_19
17.Goroutine的基本模型和调度设计策略_复用_20
17.Goroutine的基本模型和调度设计策略_单进程_21
17.Goroutine的基本模型和调度设计策略_复用_22

2.3.抢占

早期的方式i

17.Goroutine的基本模型和调度设计策略_Go_23
17.Goroutine的基本模型和调度设计策略_多线程_24

goroutine方式

17.Goroutine的基本模型和调度设计策略_多线程_25
17.Goroutine的基本模型和调度设计策略_多线程_26

2.4.全局G队列

17.Goroutine的基本模型和调度设计策略_多线程_27
17.Goroutine的基本模型和调度设计策略_单进程_28