本文主要是介绍Go —— GMP面试题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
关于GMP的详细讲解请移步:Go —— 协程
简单介绍一下Go的GMP调度模型
0)G:协程,M:系统线程,P:协程调度器
1)通过go func() 生成一个 G
2)G会优先放到P的本地队列,如果P的队列已满,则会放入全局队列中
3)G需要在M中执行,G通过P进行调度,M与P的关系是1:1对应的,如果P的本地队列为空,则会优先从全局队列中获取G,其次从其他MP组合中窃取G
4)M执行G的过程是一个循环的过程
5)如果M发生系统调度,则会释放P,P会找一个空闲的M进行执行,如果没有空闲的M,则会唤醒或者新建一个M
6)当M的系统调度停止后,会重新找空闲的P,如果找不到则会进入休眠或者销毁,G会被放入到全局队列中
问:M的数量是固定的还是动态的
在GMP调度的过程中,M会被动态唤醒、创建、休眠、销毁,所以是动态的
问:每一个P调用全局队列的概率大概为多少
大概为 1/p总数
P的个数默认为CPU的核数。每个P会周期性地查看全局队列中是否有G待运行并将其调度到M中执行,全局队列中的G主要来自从系统调用中恢复地G。之所以P会周期性地查看全局队列,是为了防止全局队列中的G长时间得不到调度机会而被“饿死”。
这篇关于Go —— GMP面试题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!