内核和用户状态中的goroutine和线程之间的关系是什么

时间:2018-02-06 08:37:12

标签: go

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

  1. 来自effective go introduce goroutine,那么os threads是什么意思?它是指用户线程还是内核线程?

  2. go-scheduler paper开始,我了解M G P,以及为什么P的数量等于CPU的数量?如果所有的cpus都用于go程序,但是os系统中的其他程序没有cpu线程来执行?

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

1 个答案:

答案 0 :(得分:4)

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

enter image description here

建立术语:

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

goroutines是我们在Go中最熟悉的,可以被认为是用户线程。这些更具技术性的名称是Green Threads

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

所以,按顺序回答你的问题:

  • OS线程意味着内核线程
  • ps -eL默认为核心数,但您可以更改它。仅仅因为您可以在所有核心上运行并不意味着您不会将CPU时间留给其他进程。并发通常涉及大量等待IO。即使你正在疯狂地挖掘东西,内核调度程序也会引导你运行其他东西。
  • 根据需要有多少个OS线程。查看{{1}},我的系统目前有1434个,其中一些是实际的内核作业,一些是我的go程序。

您可以在this answer

中找到有关操作系统与绿色线程的非常好的解释