mOS结构体 每一种操作系统不同的线程信息
g给g0栈给g0协程内存中分配的地址,记录函数跳转信息,
单线程循环 0.x版本
1.0版本 多线程循环
操作系统并不知道Goroutine的存在
操作系统线程执行一个调度循环,顺序执行Goroutine
调度循环非常像线程池
G-M-P调度模型
本地队列抓取资源,避免锁冲突
P是本地队列,m是服务的线程
head是头 tail是尾部 runq 协程结构体数据
下一个可用结构体
协程饥饿问题
切换时机
主动挂起gopark
mcall切换栈
系统调用完成时
抢占式调度
调用其他方法之前,编译器都要插入一个runtime.morestack(),基于协作主动调度
morestack的本意是检查协程栈是否有足够空间
系统监控Goruntime运行超过10s 将g.stackguard0置为0xfffffade
执行morestack0时判断是否被抢占如果被抢占,回到schedule0
基于信号的抢占式调度
操作系统中,有很多基于信号的底层通信方式
比如 SIGPIPE / SIGURG / SIGHUP
线程可以注册对应信号的处理函数
注册SIGURG信号的处理函数 紧急信号
GC工作时候,向目标线程发送信号