1. GMP模型简介

GMP_复用GMP_go_02

  • 全局队列:等待执行的
  • 本地队列:等待执行的G 优先放进这里 如果满了房子全局队列 最大不超过256个
  • P列表:启动时创建 最多gomaxprocs个
  • M列表:内核线程数 通过setmaxthreads设置 但是M是动态的 如果M有空闲 回收 如果M阻塞 会创建 

2. 设计策略

 (1)复用线程

  • work stealing机制:加入P1 P2两个P P1有G P2无G P2会从P1队尾拿一个执行
  • hand off 机制:GMP_协程_03如图所示,本来P1 P2两个 P1执行G1时候遇到阻塞 会创建M3线程 同时 P1的剩下任务迁移到M3 G1继续执行的话 就加入到其他队列中 M1睡眠、销毁

  (2) 利用并行

        gopromaxprocs

(3)抢占

       G到时间了10ms 其他G抢占执行 

(4)全局G队列

      当其他P偷取不到G 从全局队列拉取

3. 调度流程

    GMP_go_04

     GMP_复用_05

4. 调度器的生名周期

     GMP_面试_06