gmp具体的调度策略
参考解析
答案:
Go的调度器内部有三个重要的结构,G(代表一个goroutine,它有自己的栈),M(Machine,代表内核级线程),P(Processor([prɑːsesər]),上下文处理器,它的主要用途就是用来连接执行的goroutine和内核线程的,定义在源码的src/runtime/runtime.h文件中)
-G代表一个goroutine对象,每次go调用的时候,都会创建一个G对象
-M代表一个线程,每次创建一个M的时候,都会有一个底层线程创建;所有的G任务,最终还是在M上执行
-P代表一个处理器,每一个运行的M都必须绑定一个P,就像线程必须在每一个CPU核上执行一样
一个M对应一个P,一个P下面挂多个G,但同一时间只有一个G在跑,其余都是放入等待队列(runqueue([kjuː]))。
当一个P的队列消费完了就去全局队列里取,如果全局队列里也消费完了会去其他P的队列里抢任务(所以需要单独存储下一个 g 的地址,而不是从队列里获取)。