Go语言进阶学习笔记
协程 创建时默认的 stack 的⼤⼩ JDK5 以后 Java Thread stack 默认为1M Groutine 的 Stack 初始化⼤⼩为2K 和 KSE (Kernel Space Entity 系统线程) 的对应关系 Java Thread 是 1:1 Groutine 是 M:N Thread 切换代价大 先说,协程的本质是用户态的线程,用户对其有控制权限,内存占用少,切换代价低。 再来解释一下MPG是什么意思。 M代表内核线程,所有的G都要放在M上才能运行。 P代表控制器,调度G到M上,其维护了一个队列,存储了所有需要它来调度的G。 G代表一个go routine单元。 补充几点常见的调度策略: 1,如果某个M陷入阻塞呢? 当一个OS线程M由于io操作而陷入阻塞,假设此时G0正跑在了M上,那么M上绑定的P就会带着余下的所有G去寻找新的M。当M恢复过来时,一般情况下,会从别的M上拿过来一个P,并把原先跑在其上的G0放到P的队列中,从而运行G0。如果,没有拿到可用的P的话,就把G0放入到全局global runqueue队列中,使G0等待被调度,然后M进入线程缓存。所有的P也会周期性的检查global runqueue并运行其中的goroutine,否则global runqueue上的goroutine永远无法执行。 2,如果有的M较忙,有的M较闲呢?