为了账号安全,请及时绑定邮箱和手机立即绑定

Go运行时会创建操作系统线程(M)吗?

Go运行时会创建操作系统线程(M)吗?

Go
慕田峪7331174 2023-08-21 14:45:31
numLogicalProcessorsIntel core i7 上是8(2 X 4 个物理核心)。Linux操作系统。因此,八个操作系统线程(M)可以并行工作。Go 运行时可以在我的 Go 程序中分配八个上下文(P1, P2.... P8- runtime.GOMAXPROCS(numLogicalProcessors))。Go 遵循M:N线程模型,其中N是操作系统线程,M是 Go 程序的 go 例程。操作系统调度程序调度操作系统线程。线程状态是WAITING, RUNNABLE& EXECUTING。Go 调度程序安排 Go 例程。Go 例程状态是WAITING, RUNNABLE& EXECUTING。Goroutine 是一个用户级线程。Go 程序的运行时是否显式创建这八个操作系统线程(M)?在将每个上下文(P)分配给每个操作系统线程(M)之前?如果操作系统线程(M1)被操作系统调度程序抢占(由于时间片),那么goroutine调度程序(P1)如何使用LRQ管理goroutine的状态G1?是否P1从操作系统收到状态已更改的通知M1?
查看完整描述

1 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

  1. 是的,Go调度程序启动执行线程。可以使用runtime.GOMAXPROCS检查或更改它们的数量。

  2. 不,操作系统抢占对于正在运行的进程是透明的。从 1.14 版本开始,Go 运行时可以抢占 Go 例程,但这是为了避免通过紧密循环锁定线程。它与操作系统抢占无关。


查看完整回答
反对 回复 2023-08-21
  • 1 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信