我对goroutine、用户线程和内核线程的概念感到困惑
来自 effective go introduce goroutine ,那么论文中提到的
os threads
是什么意思呢?是指用户线程还是内核线程?来自 go-scheduler paper ,我了解了
M G P
,为什么P
的数量等于CPU的数量?如果所有的cpu都为go程序服务,而os系统中的其他程序没有cpu线程执行?os系统产生了多少内核线程?
最佳答案
让我们包括来自 go-scheduler 的图片您链接到的页面。
并建立术语:
- M:OS线程,也可以称为内核线程
- P:处理器,或调度上下文
- G:协程
goroutines 是我们在 Go 中最熟悉的东西,可以被认为是用户线程。这些更专业的名称是 Green Threads .
P 用于执行从多个 goroutine 到多个 OS 线程的映射。每个操作系统线程有一个,数量由 GOMAXPROCS
的值决定(默认情况下,系统报告的 CPU 数量)。
因此,按顺序回答您的问题:
- OS线程是指内核线程
GOMAXPROCS
默认为核心数,但您可以更改它。仅仅因为您可以在所有内核上运行并不意味着您不会将 CPU 时间留给其他进程。并发通常涉及大量等待IO。即使您疯狂地对事物进行哈希处理,内核调度程序也会引导您运行其他事物。- 操作系统线程的数量与需要的数量一样多。查看
ps -eL
,我的系统目前有 1434 个,其中一些是实际的内核作业,一些用于我的 go 程序。
您可以在 this answer 中找到关于操作系统与绿色线程的非常好的解释。
关于go - 内核态和用户态中的goroutine和线程是什么关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48638663/