go语言-协程

go语言-协程_第1张图片

go语言-协程_第2张图片go语言-协程_第3张图片go语言-协程_第4张图片go语言-协程_第5张图片go语言-协程_第6张图片go语言-协程_第7张图片

go语言-协程_第8张图片

mOS结构体 每一种操作系统不同的线程信息 

g给g0栈给g0协程内存中分配的地址,记录函数跳转信息,

go语言-协程_第9张图片

go语言-协程_第10张图片

go语言-协程_第11张图片

go语言-协程_第12张图片

单线程循环  0.x版本

go语言-协程_第13张图片

1.0版本  多线程循环

go语言-协程_第14张图片

go语言-协程_第15张图片

操作系统并不知道Goroutine的存在

操作系统线程执行一个调度循环,顺序执行Goroutine

调度循环非常像线程池

G-M-P调度模型

本地队列抓取资源,避免锁冲突

go语言-协程_第16张图片

go语言-协程_第17张图片

P是本地队列,go语言-协程_第18张图片m是服务的线程

head是头  tail是尾部   runq  协程结构体数据

go语言-协程_第19张图片下一个可用结构体

go语言-协程_第20张图片

go语言-协程_第21张图片

协程饥饿问题

go语言-协程_第22张图片

go语言-协程_第23张图片

切换时机

主动挂起gopark

go语言-协程_第24张图片

go语言-协程_第25张图片

mcall切换栈

系统调用完成时

go语言-协程_第26张图片

go语言-协程_第27张图片

抢占式调度

调用其他方法之前,编译器都要插入一个runtime.morestack(),基于协作主动调度

morestack的本意是检查协程栈是否有足够空间

系统监控Goruntime运行超过10s   将g.stackguard0置为0xfffffade

执行morestack0时判断是否被抢占如果被抢占,回到schedule0

基于信号的抢占式调度

操作系统中,有很多基于信号的底层通信方式

比如 SIGPIPE / SIGURG / SIGHUP

线程可以注册对应信号的处理函数

注册SIGURG信号的处理函数  紧急信号

GC工作时候,向目标线程发送信号

go语言-协程_第28张图片

协程太多

go语言-协程_第29张图片

处理方案

go语言-协程_第30张图片

go语言-协程_第31张图片

go语言-协程_第32张图片

go语言-协程_第33张图片

你可能感兴趣的:(Go,go)