Golang--协程调度
协程bilibiliGoroutine调度模型早期调度模型GgoroutineGo协程对应数据结构runtime.gMmachine工作线程对应数据结构runtime.m在程序地址空间的数据段中有重要的全局变量g0主协程对应的G。不同于其他的协程g0的协程栈在主线程栈上进行分配。m0主线程对应的M。allg用于记录所有的G。allm用于记录所有的M。g0和m0中都分别记录了对方的地址m0最开始的执行的协程就是g0。Golang的早期调度器中只有G和M所有的G被维护在一个全局队列中所有的M互斥地从全局队列中拿取G执行。但是多个M访问全局队列时频繁的加锁和解锁会导致M的等待影响程序并发性能。若G中进行了系统调用则OS会将对应的M阻塞则能够从全局队列中拿取G的M就少了代表执行能力变弱了。若全局队列中大部分G都会进行系统调用则就会让大部分M进入阻塞状态全局队列产生堆积。对于该问题需要对线程池中的M数量做把控太多了也会会由于多个线程抢占CPU反而导致执行能力下降。GMP模型在GM的基础上又引入了P。Pprocessor包含运行Go代码的必要资源也有调度goroutine的能力对应数据结构runtime.g每一个P中维护了一个自己的本地队列。代码段中添加有全局变量sched调度器其中记录了所有空闲的M和P以及全局队列等与调度相关的内容。allp保存了所有的P在调度器初始化时会根据GOMAXPROCS该环境变量决定创建多少个P保存于allp中并将第一个Pallp[0]与m0进行关联。将一个P关联到一个M该M就能从P的本地队列中获取G而不再只能从全局队列中去获取。若P的本地队列满了等待执行的G就会被放入全局队列。M会优先从P的本地队列拿取G执行若P的本地队列空了再到全局队列中拿取G若全局队列也空了M会从别的M关联的P中偷取一定的G进行分担一般一次偷取一半。GMP执行大致过程schedinit调度器初始化new main goroutine调用newproc函数创建main goroutine。newproc的参数为由用户指定调用的函数f即goroutine运行入口以及需要传入f的参数。newproc会为goroutine构造一个栈帧方便goroutine结束后调用goexit函数来进行协程的回收处理决定该goroutine是放回空闲G队列备用还是直接销毁。将main goroutine加入到allp[0]的本地队列中。mstart开启调度循环mstart是所有工作线程的入口主要通过调用schedule函数来执行调度循环。对于一个活跃的M要么是正在执行某个G要么是正在执行调度程序获取某个G。runtime.mainmian goroutine的执行入口其会创建监控线程初始化包等操作。其中包括调用main.main开始执行用户编写的语句。在main.main返回之后runtime.main会调用exit函数结束进程。假设我们执行的是以下代码packagemainimport(fmttime)funchello(){fmt.Println(Hello World)}funcmain(){gohello()time.Sleep(1*time.Second)}go hello()会调用newproc创建一个goroutine我们称为hello goroutine。若**GOMACPROCS**为1则hello goroutine会进入allp[0]的本地队列。time.Sleep会让main goroutine让到timer中进行等待。m0调用schedule函数进行调度让hello goroutine得以运行。当main goroutine的等待时间结束会被放入allp[0]的本地队列中。最后main goroutine结束m0调用exit结束进程。若**GOMACPROCS**1意味着不止有一个P则可能会启动新的线程来关联空闲的P。之后再将hello goroutine放入到空闲的这个P的本地队列中。GMP调度策略队列轮转P会将其本地队列中的G周期性地调度到M中执行执行一段时间将上下文保存放入队列尾部再从队列拿取一个G调度。每个P也会周期性地查看全局队列中是否有G待运行并将其调度到M中执行全局队列中的G主要来自于从系统调用中恢复的G。为了保证全局队列中的G不会被饿死故P会周期性查看全局队列。系统调用当某个M在执行的G中发生了系统调用该M会释放掉其关联的P由别的空闲的M来获取P继续执行P的本地队列中剩下的G。而之前的G发生系统调用结束后根据执行它的M是否能获取到P对该G进行不同的处理有空闲的P获取一个P继续执行G没有空闲的P将G放入全局队列等待被其他的P调度。M进入线程池休眠。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2416123.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!