首页 > 后端开发 > Golang > 在存在阻塞操作的情况下,Go 调度程序如何管理 M 和 P 的创建?

在存在阻塞操作的情况下,Go 调度程序如何管理 M 和 P 的创建?

Mary-Kate Olsen
发布: 2024-10-31 05:20:02
原创
577 人浏览过

How does the Go scheduler manage the creation of M and P in the presence of blocking operations?

理解 Go Scheduler 中的 M 和 P 创建

Go 调度器在涉及 goroutine、OS 线程 (M) 和上下文的模型上运行/处理器(P)。为了优化性能,调度程序动态管理 M 和 P 的创建和使用。

M 的创建

当调度程序检测到需要执行阻塞时创建 M任务。在示例代码中,goroutines 执行阻塞数据库操作,这将触发创建额外的 M。创建的 M 的确切数量取决于阻塞 goroutine 的数量和可用的系统资源。

创建P

P 是在新的 goroutine 启动时创建的。然而,调度器不会为每个 goroutine 创建一个新的 P。相反,它会重用现有的 P 实例,维持固定数量的 P 等于 GOMAXPROCS 的值,通常设置为可用 CPU 的数量。

在您的示例代码中

在您的测试代码中,您分两批创建了 50 个 goroutine。由于数据库操作是阻塞的,因此将根据需要创建 M 来处理阻塞 goroutine。但是,由于 P 实例被重用,因此只会创建 8 个 P,代表系统上虚拟核心的数量。

更多资源

欲进一步探索此问题主题,请参考以下资源:

  • [Go Goroutine、操作系统线程和 CPU 管理](https://www.programming-books.net/2019/07/understand-go-scheduler- goroutine.html)
  • 【理解 Go GMP (Goroutine-M-P) 模型】(https://blog.container-solutions.com/understand-go-gmp-goroutine-m-p-model)

以上是在存在阻塞操作的情况下,Go 调度程序如何管理 M 和 P 的创建?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板