首页 > 后端开发 > Golang > 正文

当 Goroutine 执行阻塞操作时,Go 调度器如何创建新的 M 和 P?

Patricia Arquette
发布: 2024-10-30 02:18:28
原创
437 人浏览过

How Does the Go Scheduler Create New M and P When Goroutines Perform Blocking Operations?

当 Go Scheduler 在 GMP 模型中创建新的 M 和 P

在 Go 的 GMP(Goroutine、Machine、Processor)模型中,调度器根据特定条件管理 M(机器)和 P(处理器)的创建。

M 创建

M 是为了响应特定事件而创建的,例如:

  • 阻塞操作: 当 goroutine 执行阻塞操作(例如,I/O、系统调用)时,与该 goroutine 关联的 M 会被阻塞。为了继续执行 Goroutine,调度器会创建一个新的 M。
  • 调度管道: 当存储等待执行的 Goroutine 的全局 G 队列中的 Goroutine 数量多于可用的 M 数量时,调度器创建新的 M 来执行 goroutine。

P 创建

P 是在程序启动时根据 GOMAXPROCS 环境变量创建的,该变量指定可用P的最大数量。默认值为系统上逻辑CPU的数量。

示例分析

在您的示例代码中,您有两批goroutine运行数据库操作。每个 goroutine 执行阻塞 I/O 操作。

  • 第一批: 调度程序将创建 8 M (因为您有 8 个虚拟核心)和 1 P 来运行第一批goroutine 的。每个M都会执行P的本地队列中的一个goroutine。
  • 第二批:由于阻塞操作导致最初的M被阻塞,调度器将为剩余的goroutine创建新的M在第二批中。 M 将与新的 P 相关联,即使 P 的数量仍为 1。

因此,在您的情况下,调度程序将为第二批 goroutine 创建超过 8 M,因为操作被阻塞。 P 将根据 GOMAXPROCS 值限制为 1,但 M 将根据需要动态创建。

其他资源

进一步了解,请参考以下内容资源:

  • https://www.programmersought.com/article/795578​​85527/
  • https://blog.golang.org/go-goroutine-os-thread-and -CPU管理

以上是当 Goroutine 执行阻塞操作时,Go 调度器如何创建新的 M 和 P?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!