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

协程太多

处理方案

相关推荐
我叫黑大帅5 小时前
Go 中最强大的权限控制库(Casbin)
后端·面试·go
古城小栈15 小时前
Jenkins+K8s实现Go后端服务自动化部署
go·k8s·jenkins
不会写DN1 天前
Gin 实战入门:从环境搭建到企业级常用特性全解析
go·gin
下次一定x1 天前
深度解析 Kratos 客户端服务发现与负载均衡:从 Dial 入口到 gRPC 全链路落地(下篇)
后端·go
乐茵lin2 天前
大厂都在问:如何解决map的并发安全问题?三种方法让你对答如流
开发语言·go·编程·map·并发安全·底层源码·sync.map
不会写DN2 天前
GORM 实战入门:从环境搭建到企业级常用特性全解析
sql·mysql·go·gin
F1FJJ2 天前
Shield CLI 的 PostgreSQL 插件 v0.5.0 发布:数据库导出 + 协作增强,ER 图全新体验
网络·数据库·docker·postgresql·go
liangbm34 天前
AI-ViewNote:把网课和会议视频自动卷成结构化笔记
ai·typescript·go·软件构建·开源软件·react·桌面软件
我叫黑大帅5 天前
Gin 实战入门:从环境搭建到企业级常用特性全解析
后端·面试·go
我叫黑大帅5 天前
Gin 日志体系详解
后端·面试·go