线程模型

内核级线程模型(KSE(Kernel Scheduling Entity))

关键点: 完全靠操作系统调度
每一个用户线程绑定一个实际的内核线程,而线程的调度则完全交付给操作系统内核去做,应用程序对线程的创建、终止以及同步都基于内核提供的系统调用来完成

单个进程

两级(混合型)线程模型

关键点: 自身调度与系统调度协同工作
用户线程与内核KSE是多对多(N : M)的映射模型:
首先,区别于用户级线程模型,两级线程模型中的一个进程可以与多个内核线程KSE关联,于是进程内的多个线程可以绑定不同的KSE,这点和内核级线程模型相似;
其次,又区别于内核级线程模型,它的进程里的所有线程并不与KSE一一绑定,而是可以动态绑定不同KSE, 当某个KSE因为其绑定的线程的阻塞操作被内核调度出CPU时,其关联的进程中其余用户线程可以重新与其他KSE绑定运行

GPM模型

基本概念

  • M
goroutineMM10000MGGGM
  • P
<=GGP
  • G
goGGMGPG
  • Seched
MPGG

模型调度

关于线程说明:
内核级线程: 线程的切换由内核控制,可以直接用户态到内核态,或者内核态到用户态,能够充分利用CPU的核数
用户级线程: 线程的切换由用户自己控制,不需要内核控制,少了进出内核的消耗,但是不能很好的利用CPU的核数

用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。
PGSechedMMPMPGGP
M
blocking syscall (for example opening a file)
network input
channel operations
primitives in the sync package

主要可归为两类

  • 用户态阻塞/唤醒
goroutinewait_Gruning_Gwaittingsleep
  • 系统调用阻塞
_Gsyscallblock on syscallidleidleidle
work stealing

参考文档