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

标签 multithreading go

Intel core i7 上的

numLogicalProcessors8(2 X 4 物理内核)。 Linux操作系统。因此,八个操作系统线程 (M) 可以并行工作。 Go 运行时可以分配八个上下文(P1, P2....P8 - runtime.GOMAXPROCS(numLogicalProcessors) )在我的 Go 程序中。

enter image description here

Go 遵循 M:N 线程模型,其中 NOS 线程M 是 go 例程一个 Go 程序。

操作系统调度程序调度OS threads 。线程状态为 WAITINGRUNNABLEEXECUTING

Go 调度程序安排 Go 例程。 Go 例程状态为 WAITINGRUNNABLEEXECUTING。 Goroutine 是一个用户级线程。


  1. Go 程序的运行时是否显式创建这八个操作系统线程 (M)?在将每个上下文(P)分配给每个操作系统线程(M)之前?

  2. 如果操作系统线程(M1)被操作系统调度程序抢占(由于时间片),goroutine 调度程序(P1)如何管理使用 LRQ 的 goroutine G1 状态? P1 是否从操作系统收到 M1 状态已更改的通知?

最佳答案

  1. 是的,Go调度程序启动执行线程。可以使用 runtime.GOMAXPROCS 检查或更改它们的数量。 .
  2. 不,操作系统抢占对于正在运行的进程是透明的。 Go运行时从1.14版本开始可以preempt Go routines但这是为了避免通过紧环锁定线程。它与操作系统抢占无关。

关于multithreading - Go运行时会创建操作系统线程(M)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60804773/

相关文章:

c - 如何阻止 pthread 从 main 打印全局变量然后继续 pthread?

go - 为什么 channel 不关闭?

去泛型 : processing different struct types with same data member types

multithreading - POSIX 取消点是什么?

node.js - 在 Express/Node 中使用 sendFile 时出现随机 'ECONNABORTED' 错误

c++ - 并行操作 std::vector 的不同元素

go - 如何使用Golang解析ndjson文件? [复制]

multithreading - 通过单个EJB @Asynchronous方法产生多个线程

datetime - 如何在 Go 中使用 GMT 格式获取当前日期和时间?

java - 通过 Golang 访问 JMX