goroutine
2023-12-19 20:05:31 0 举报
goroutine模型
作者其他创作
大纲/内容
...
KSE
P
G是goroutine实现的核心结构,它包含了栈,指令指针,以及其他对调度goroutine很重要的信息,例如其阻塞的channel。
线程
Kernel Scheduling Entity- 内核态线程的基础执行单元- 一个内核线程对应一个KSE- 内核线程的创建,销毁,以及被cpu调度时的上下文切换, 都需要大量cpu开销
queue
CPU-6
操作系统
G
M
出队
Sched
用户态空间
P的Local队列
用户级线程模型- 线程与KSE是M对1关系- 致命缺陷:若KSE对应的内核线程阻塞, 会导致所有用户进程阻塞
被CPU调度
m:1
内核态空间
1:1
P是Processor,处理器,它的主要用途就是用来执行goroutine的,它维护了一个goroutine队列,即runqueue。Processor是让我们从N:1调度到M:N调度的重要部分。
进程
线程的调度信息
cpu-scheduler: 基于时间片分时调度执行线程
入队
用户级线程模型
CPU-5
- 为了提高CPU资源的利用率,CPU会给每个进程分配一定的时间配额,超过时间配额则会切换其他线程- CPU切换线程,会产生进程上下文切换的开销- CPU检测进程是否时间片超时的过程(检查-调度),本身也是一段代码,可以被主动或者被动调起- GO语言实现的混合线程模型中, 无法被动式调起“检查-调度”,因此go应对策略为:在go运行时会在每次函数调用之前触发“检查-调度”
m:n
goroutineentity
全局G队列
内核级线程模型- 线程与KSE是1对1关系- 对操作系统的线程(内核级线程)的一层封装- 致命缺陷: 需要创建大量内核线程,开销大
font color=\"#a23735\
混合型线程模型- 线程与KSE是M对N关系- 一个进程可以创建多个KSE,线程可以动态关联KSE
混合型线程模型
CPU-2
G-P-M模型
M是Machine,系统线程,它由操作系统管理的,goroutine就是跑在M之上的;M是一个很大的结构,里面维护小对象内存cache(mcache)、当前执行的goroutine、随机数发生器等等非常多的信息。
内核级线程模型
CPU-1
processor
主进程
线程的状态
物理多核cpu
CPU
CPU-3
CPU-4
GOMAXPROCS个
全局M队列
goroutine
0 条评论
回复 删除
下一页