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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-31 05:20:02491浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn