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

协程太多

处理方案

相关推荐
武大打工仔1 小时前
如何理解 Golang 中的 Context?
go
Java陈序员21 小时前
精致简约!一款优雅的开源云盘系统!
mysql·docker·开源·go·云盘
捧 花1 天前
Go语言模板的使用
golang·go·template method·模板·web app
凉凉的知识库1 天前
在Go中读取MySQL Date类型,一不小心就踩坑
mysql·面试·go
51972 天前
goup是一个纯Rust编写的优雅的Go多版本管理工具
go
豆浆Whisky2 天前
Go微服务通信优化:从协议选择到性能调优全攻略|Go语言进阶(20)
后端·微服务·go
码一行3 天前
Eino AI 实战:解析 PDF 文件 & 实现 MCP Server
后端·go
赵大海4 天前
golang运维平台实战,服务树,日志监控,任务执行,分布式探测
go
喵个咪4 天前
go-kratos-admin 快速上手指南:从环境搭建到启动服务(Windows/macOS/Linux 通用)
vue.js·go