goroutine和线程在内核和用户状态是什么关系

bhmjp9jg  于 2023-06-19  发布在  Go
关注(0)|答案(1)|浏览(85)

我对goroutine、用户线程和内核线程的概念感到困惑
1.从有效的开始引入goroutine,那么论文中提到的os threads是什么意思呢?是用户线程还是内核线程?
1.从go-scheduler paper中,我了解了M G P,以及为什么P的数量等于CPU的数量?如果所有的cpu都为go程序服务,而操作系统中的其他程序没有cpu线程执行?
1.操作系统生成多少个内核线程?

50pmv0ei

50pmv0ei1#

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

并建立术语:

*M:操作系统线程,也可以称为内核线程
*P:处理器或调度上下文
*G:Goroutine

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

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

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

  • OS线程表示内核线程
  • GOMAXPROCS默认为内核数量,但您可以更改它。仅仅因为您可以在所有内核上运行并不意味着您不会将CPU时间留给其他进程。并发通常需要等待大量的IO。即使你正在疯狂地进行散列运算,内核调度程序也会 Boot 你去运行其他东西。
  • 存在与所需一样多的OS线程。看看ps -eL,我的系统目前有1434个,其中一些是实际的内核作业,一些是我的go程序。

你可以在this answer中找到一个关于OS和绿色线程的很好的解释

相关问题