一、调度器的由来
动机:单进程计算机只能一个任务一个任务地处理;CPU浪费
CPU调度器:轮询调度进程A\B\C,时间片轮转调度。这种有切换成本。
多线程的劣势:
1.每个线程创建一个线程,导致频繁切换线程CPU消耗
2.每个进程、线程占用一定内存
N:1的协程关系,线程调度CPU,通过一个调度器切换协程,避免CPU高消耗
go协程:改了内存->几KB;灵活调度;
GM调度器模型的缺点:
1.创建、销毁、调度G需要频繁地获取锁,造成激烈地锁竞争
2.从M转移到G会造成延迟和额外的系统负载
3.系统调用导致频繁的线程阻塞和取消阻塞操作增加了系统开销
二、GMP模型
新建goroutine会放到localP中,最大256G,不行再放到全局队列中
P数量可以设置,M数量根据程序动态销毁
三、GMP设计
设计策略分为四种:复用线程、利用并行、抢占、全局G队列
复用线程的两个机制:working stealing和hand off
3.1 working stealing机制
M2空闲,所以从M1从偷取协程。(先从localP偷,再从global偷)
3.2 hand off机制
M1阻塞在G1,创建和唤醒一个线程,绑定G1和M1
3.3 利用并行:GOMAXPROCS = CPU核数/2
3.4 新的协程会抢占老协程
四、go func()执行过程
大循环:创建协程-》进入局部队列-》M获取G-》小循环(调度-》执行-》时间片用完)