开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 20 天,点击查看活动详情
今天来学习下Go常见的习题问题(三十),也是面试中可能会遇到的,让我们来一起学习吧~
GPM模型
什么是GPM模型?GPM分别代表了三个组成部分:goroutine、machine、processor
- G(Goroutine):Go协程,通过go关键字会创建一个协程
- M(Machine):工作线程,操作系统中的线程,数量对应真实的CPU数,真正在运行的部分
- P(Processor):处理器,不是操作系统中的CPU,包含程序运行的资源,用来调度 G 和 M 之间的连接关系,其数量可通过 GOMAXPROCS() 来设置,默认为核心数
工作线程(M)必须通过处理器(P)才可以执行go协程(G)中的代码,处理器中包含多个包含go协程的队列,并且调度安排G分配给M执行
Goroutine调度策略
这里假设我们有5个线程和5个处理器,Processor和Machine是相互绑定的,当新创建一个Goroutine会被分配到local等待队列中去,另外再创建一个Goroutine就会继续分配到空的队列中去,当所有的处理器分配的队列都满了,就会进去全局队列中等待,那么如何进行调度呢,分为以下三点:
- 队列轮转:Processor会定期的将Goroutine分配到Machine中去执行,执行一段时间没有完成,会保存上下文存放到Goroutine的队尾等待下一次调用,然后再继续从队列中重新取一个出来Goroutine进行调度,此外Processor还会查看全局队列是否有Goroutine在等待也会取出来进行调度
- 系统调用:如果Goroutine0即将进入系统调用时,Machine0也会进入系统调用,那么队列P中其他的G不能干等着,所以会直接释放掉匹配的Processor,去寻找其他空闲的Machine,继续执行P队列中剩下的G,当G0系统调用结束后,寻找空闲的P进行执行,如果找不到,就会放入全局队列中等待,等待被其他的P调度,然后M0将进入缓存池睡眠
总结
今天浅谈了Go的习题(三十),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!