
go调度器
wsk8520
这个作者很懒,什么都没留下…
展开
-
06 go启动生命周期M0和G0
M01、启动程序后的编号为0的主线程(当前启动一个进程时,进程中会包含一个线程,进程中的第一个线程的编号设置为M0)如果进程中不开任何线程,可以理解为一个进程就是一个线程。2、在全局变量runtime.M0中,不需要在heap(堆)上分配。(M0在整个进程中是唯一的,无需在堆上分配)3、负责执行初始化操作和启动第一个G(M0是负责启动第一个G的,go语言是跑在协程上)4、启动第一个G之后,M0就和其他的M一样了(负责给其他M进行抢占)G01、每次启动一个M,都会第一个创建的.原创 2021-05-13 17:09:47 · 2695 阅读 · 0 评论 -
04、GMP的调度器策略
一、复用线程:避免频繁的创建、销毁线程,而是对线程的复用。work stealing机制(偷取机制)和hand off机制(握手机制)M1和P已经绑定且此时G1的协程正在被执行,G2和G3正在被等待中……M2此时是空闲的且它的P不分配,显然M2是空闲的,没有被使用。我们要将M2也利用上,即M2要想执行一个协程的话,它本身P的本地队列中是没有协程的,他就要从M1(其他队列)中偷取一个协程过来,这既是work steaking机制。hand off是分离机制。...原创 2021-05-07 22:13:39 · 712 阅读 · 0 评论 -
03、GMP模型简介
一、GMP简介prosessor处理器是用来处理goroutine协程的,processor包含着每一个goroutine的资源。如果想要运行一个goroutine的话首先要获取processor.processor可能就包含着可运行的goroutine的一些队列。二、GMP的全局队列和本地队列一个P同一时刻只能执行一个G,一个当前程序最高的并行数量就是GOMAXPROCS的数量。目前所有绿色的G全部都是等待运行的,如果想要执行,那就要首先拿到P中。一个新创...原创 2021-05-01 22:15:49 · 1088 阅读 · 0 评论 -
Golang调度器的由来
原创 2021-04-28 09:20:48 · 147 阅读 · 0 评论 -
Golang早期调度器
G表示一个其中一个goroutine协程,M表示一个内核线程。go语言实际上有一些线程,比如CPU目前是4核的,4个M0,我有个队列,里面存放n个协程,就是可以理解每次出现一个协程我都会放入这个队列中,协程和线程是一个M:N的对应关系。当M0想去调用一个go协程,就需要获取全局go协程队列,队列会有一个锁进行保护,获取锁以后会尝试执行其中一个goroutine,获取完goroutine之后,剩余的goroutine会在队列中向前挪动,挪动到队列的头部,以便下次的...原创 2021-04-28 09:18:59 · 126 阅读 · 0 评论