goroutine 和 kernel thread 之间是什么关系?

参考解析

题目来源:pingCAP

答案:

在进程被划分为更小的线程后,线程成为了最小的调度单元,也是在 CPU 上执行的最小单元

操作系统将内存空间划分为内核空间用户空间

由于用户级线程一般使用线程库来模拟线程且对操作系统保持透明,因此对操作系统而言只能调度内核空间中的内核级线程

内核级线程 kernel thread 简称 KSE

由此可以将内核级线程视作用户级线程上 CPU 运行的机会

image-20220417134648439

对于传统的内核级线程和用户线程,有一对一一对多多对多三种模型

对于同一进程内的用户级线程切换,不需要切换上下文也无需额外开销

对于不同进程内的用户级线程切换,要切换进程的上下文,开销较大

image-20220417135413988

在 go 中使用 goroutine,而 goroutine 是 go 中实现的用户级线程

因此一般来看 go 中的线程调度应该如左图所示

在 go 中使用 GMP 模型,其中 P(processor) 专门管理一个 goroutine 的队列,实际情况如右图所示

image-20220417141424408

总结:goroutine 依靠 kernel thread 执行