首页 > 编程知识 正文

golang协程调度原理,goroutine调度机制

时间:2023-05-04 00:42:31 阅读:22619 作者:921

在线程调度之前的博客中,我们简要介绍了Goroutine的总体机制。 本文较好地组织了Goroutine机制的线程阻塞处理和调度问题。

上一章将Goroutine机制分为四个部分:用户线程(g )、系统线程(m )、用户线程调度器(p )和内核调度器。 具体请参阅文章go语言的线程模型goroutine机制。 本节重点介绍p在goroutine机制中的作用和原理。

p在goroutine中的主要作用是安排g和m的对应关系。 在实际执行中,用户同时启动多个线程,这些线程进入内存后部分进入p,当p已满时,剩馀线程在外面等待。 可以理解,Go是母语支持协会计划的语言。 也就是说,打开多线程后,Go会自动创建多个p。 这一般对应于系统中包含的CPU核心数。 例如,在双核CPU系统中,当生成多个Go线程时,Go可执行文件生成4个家,每个家只能同时存储一个goroutine队列。 一个goroutine队列同时只能维护四个go线程,如果用户同时启动20个用户线程,则理想情况下将有16个用户线程进入家门,剩下的4个用户必须在家外等待。 如下图所示。

线程时间表具有以下特点:

1 ) p家空闲后(运行所有go线程后),他首先从全局等待区进入堆栈,然后按顺序将go线程叫到自己家。 如下图所示。

2 )如果一个PC的房子空出来后(运行所有的PC线程后)全局等待区域也没有要处理的PC线程,他会从另一个PC的房子挖墙,一般挖一半的PC线程来自己家里面。 如下图所示。

线程块在了解了goroutine机制的调度模式和原理后,线程块的解决就变得简单了。 例如,假设绑定到某个p的m被阻止。 首先,上述内核调度程序对CPU调用此m,同时将m标记为阻止状态。 Go运行时系统的监视线程(sysmon线程)检测到这样的m,一旦发现这样的m,就会自动断开绑定到该m的p,并查找其他m。 如果所有的m都忙,新的m将接管该p。 如果没有可以绑定的m,请将该p的gotroutine队列中的go线程放入全局等待区域,等待其他M-P组合完成运行。 被阻止的m恢复状态后,再次找到空闲的p并将其绑定到m。 大致过程如下图所示。

如果有m空闲:

如果没有m偶像:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。