Intel core i7 上的
numLogicalProcessors
为 8
(2 X 4 物理内核)。 Linux操作系统。因此,八个操作系统线程 (M
) 可以并行工作。 Go 运行时可以分配八个上下文(P1
, P2
....P8
- runtime.GOMAXPROCS(numLogicalProcessors)
)在我的 Go 程序中。
Go 遵循 M:N
线程模型,其中 N
是 OS 线程,M
是 go 例程一个 Go 程序。
操作系统调度程序调度OS threads 。线程状态为 WAITING
、RUNNABLE
和 EXECUTING
。
Go 调度程序安排 Go 例程。 Go 例程状态为 WAITING
、RUNNABLE
和 EXECUTING
。 Goroutine 是一个用户级线程。
Go 程序的运行时是否显式创建这八个操作系统线程 (
M
)?在将每个上下文(P
)分配给每个操作系统线程(M
)之前?如果操作系统线程(
M1
)被操作系统调度程序抢占(由于时间片),goroutine 调度程序(P1
)如何管理使用 LRQ 的 goroutineG1
状态?P1
是否从操作系统收到M1
状态已更改的通知?
最佳答案
- 是的,Go调度程序启动执行线程。可以使用 runtime.GOMAXPROCS 检查或更改它们的数量。 .
- 不,操作系统抢占对于正在运行的进程是透明的。 Go运行时从1.14版本开始可以preempt Go routines但这是为了避免通过紧环锁定线程。它与操作系统抢占无关。
关于multithreading - Go运行时会创建操作系统线程(M)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60804773/