golang调度器原理

 1 创建一个goroutine后,即生成一个G,会先找到一个P的本地队列,如果没满,则放入等待,若满了,就会取该P本地队列的一半和这个G放入全局队列等待,执行G的时候,若发生阻塞/非阻塞系统调用,则P会与当前的M解绑去寻找其它的M,当P的本地队列没有G时,M会进入自旋,等待运行G,这时P会从全局队列至少取一个G,n = min(len(GQ)/GOMAXPROCS + 1, len(GQ/2)),若全局队列也没有G,则会从其它的P里steal一半的G过来,

https://learnku.com/articles/41728

https://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-goroutine/

原文地址:https://www.cnblogs.com/xxswkl/p/14198592.html