Goroutine与内核和用户状态下的线程之间的关系是什么

Jim*_*een 2 go

我对goroutine,用户线程和内核线程概念感到困惑

  1. 有效的介绍goroutine,那么os threads本文提到的是什么意思?是用户线程还是内核线程?

  2. 我从go-scheduler论文中了解到M G P,为什么的数量P等于CPU的数量?如果所有的cpus用于go程序,但是os系统中的其他程序没有cpu线程要执行?

  3. os系统生成了多少个内核线程?

Mar*_*arc 5

让我们包括链接到的go-scheduler页面中的图片。

在此处输入图片说明

并建立术语:

  • M:OS线程,也可以称为内核线程
  • P:处理器或调度上下文
  • G:Goroutine

goroutines是我们在Go中最熟悉的东西,可以被认为是用户线程。这些的更专业的名称是Green Threads

P用于执行从许多goroutine到许多OS线程的映射。每个OS线程只有一个,并且该线程数由的值确定GOMAXPROCS(默认情况下,系统报告的CPU数量)。

因此,按顺序回答您的问题:

  • OS线程意味着内核线程
  • GOMAXPROCS默认为内核数,但是您可以更改它。仅仅因为您可以在所有内核上运行并不意味着您没有为其他进程留出CPU时间。并发通常涉及大量等待IO。即使您正在疯狂地哈希事物,内核调度程序也会引导您运行其他事物。
  • 有足够多的操作系统线程。看一下ps -eL,我的系统当前有1434,其中一些是实际的内核作业,一些是我的go程序。

您可以在此答案中找到OS与Green线程的很好解释