了解gmp模型的全局队列和本地队列吗
题目来源:百度
答案:
- 全局G队列(Global Queue):存放等待运⾏的G。
- P的本地G队列:同全局队列类似,存放的也是等待运⾏的G,存的数量有限,不超过256个。
新建G时,G优先加入到P的本地队列,如果队列满了,则会把本地队列中⼀半的G移动到全局队列 - P列表:所有的P都在程序启动时创建,并保存在数组中,最多有
GOMAXPROCS(可配置)个。可通过 runtime.GOMAXPROCS() 来进⾏设置,1.5版本之前默认为1,使⽤单核⼼执⾏,之后默认为最⼤逻辑cpu数量,即默认有最⼤逻辑cpu数量个P。 - M列表:当前操作系统分配给golang程序的内核线程数。线程想运⾏任务就得获取P,从P的本地队列获取G,P队列为空时,M会优先尝试从全局队列拿⼀批G放到P的本地队列,或从其他P的本地队列偷⼀半放到⾃⼰P的本地队列。M运⾏G,G执⾏之后,M会从P获取下⼀个G,不断重复下去。
Goroutine调度器和OS调度器是通过M结合起来的,每个M都代表了1个内核线程,OS调度器负责把内核线程分配到CPU的