简单介绍GMP调度器模型

一、调度器的由来

动机:单进程计算机只能一个任务一个任务地处理;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-》小循环(调度-》执行-》时间片用完)