go语言-协程

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工作时候,向目标线程发送信号

协程太多

处理方案

相关推荐
qqxhb6 小时前
零基础设计模式——行为型模式 - 访问者模式
java·设计模式·go·访问者模式
郝同学的测开笔记9 小时前
云原生探索系列(十九):Go 语言 context.Context
后端·云原生·go
weixin_5275504011 小时前
深入理解 Go 语言类型之间的转换与注意事项
microsoft·golang·go
用户67570498850214 小时前
不用WebSocket也能搞定实时消息推送?试一试SSE吧!
后端·go
叫我阿杰好了14 小时前
Go 语言的基础数据类型
后端·go
DemonAvenger15 小时前
Go GC 停顿时间优化:实现毫秒级响应的技术实践
性能优化·架构·go
程序员爱钓鱼15 小时前
Go语言中的文件与IO:JSON、CSV、XML处理
后端·google·go
程序员爱钓鱼2 天前
Go语言中的文件与IO:bufio 和 scanner
后端·google·go
mCell2 天前
你可能在用错密码:服务端密码安全的真相与陷阱
后端·安全·go
梦兮林夕3 天前
Docker + Gin + Gorm Gen:现代 Go Web 开发高效数据库实践
数据库·go·gin