go - 内核态和用户态中的goroutine和线程是什么关系

标签 go

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

  1. 来自 effective go introduce goroutine ,那么论文中提到的os threads是什么意思呢?是指用户线程还是内核线程?

  2. 来自 go-scheduler paper ,我了解了M G P,为什么P的数量等于CPU的数量?如果所有的cpu都为go程序服务,而os系统中的其他程序没有cpu线程执行?

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

最佳答案

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

enter image description here

并建立术语:

  • 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/

相关文章:

mongodb - 如何使用 MGO 聚合管道查找符合特定条件的所有嵌入文档

unit-testing - 在 GoLang 的 sqlmock 中出错

sql - If/Else 语句中的 Golang Postgres 语法错误

multithreading - 为什么这个程序在分配的线程越少时运行得越快?

go - 将自定义类型断言为基本类型

layout - 是否需要 go 才能使用包

css - Golang CSS服务

go - 是否有任何标准库可以将 float64 转换为具有固定宽度和最大有效位数的字符串?

go - 如何更正 "if"构造中的类型比较

session - golang go-endpoints Session 使用 gorilla-toolkit