Goroutine
2024-08-01 17:49:17 0 举报
Golang的Goroutine流程图
作者其他创作
大纲/内容
P
5.1-若G.func()发送systemCall/阻塞
M1
P的本地队列
内核空间
多线程/多进程操作系统
优先级:本地>全局
切换成本低
出队
7-M把Main放到P队列,与其他G运行一致
进程B
阻塞操作
进程A
M2
package mainimport \"fmt\"func main(){ fmt.Println(\"Hello world\")}
G1
G0
入队
2-M0创建G0,并关联
G3
2.1-局部队列已满则入全局队列
go func()
问题1、单一执行进程、计算机只能一个任务一个任务处理2、进程阻塞所带来的CPU浪费时间
P1
用户空间
6.1-超时回到队列尾部
Goroutine
创建/唤醒一个machine thread
3.2-若M1的P本地队列为空,则从全局队列获取
全局队列
G2
3.1-若M1的P本地队列为空,则从其他的MP组合偷取G
进程C
1-创建
线程(Thread)
协程(co-routine)
解决阻塞问题但是有切换成本,线程/进程的数量越多,切换成本就越大,浪费的时间、内存就越大(主要是把CPU寄存器里当前进程的数据保存到内存,然后再从内存里把另一个进程的数据加载到CPU)
4-M0创建main的goroutine
P2
3-M通过P获取G
goroutine协程
6-M0与绑定P
Golang对早期调度器的处理
开始
4-调度
5-执行
时间
M3
Golang对协程的处理
1-创建M0
2-入局部队列
6-func() 函数
G
5.2-创建一个M或从休眠队列取一个M
“go func()”
work stealing机制
3-初始化调度
时间片
早期单进程操作系统
A->B->C->...(顺序执行)
减少内存占用
5.3-接管当前正在阻塞G的P(hand off机制)
协程(Goroutine)调度器原理
6.1-时间片超时返回
6.2-销毁
G2.1
hand off机制
M
7-返回
×
A ->B ->C ->(并发执行)
8- panic/exit
thread线程
Main
M0
休眠M队列
协程调度器
5-M0与G0解绑
G2.2
5.3.1-M1和阻塞的G0绑定,若阻塞完成,M1已没有绑定的CPU,销毁或者移到休眠M队列5.3.2-G0再去寻找其他的P队列或者全局队列
CPU调度器
0 条评论
回复 删除
下一页