Go 语言协程管理精解

1.基础

        协程切换需要操作寄存器,这些操作需要通过汇编辅助实现。另外,每一个协程都有一个协程栈,实际上协程栈也是有结构的。汇编程序和栈结构这些概念可能大部分开发者都不太了解,在介绍协程管理之间,先简要介绍。

1.1 汇编入门

学习 Go 语言协程还需要掌握汇编程序吗?其实不需要对汇编多么熟悉,只需要简单了解常用的一些汇编指令即可。 

Go 语言本身就提供了很多工具,例如,编译工具 compile 用于编译 Go 程序,我们可以使用它将上述 Go 程序编译为汇编代码。编译命令以及编译后的汇编代码如下:

//-N 禁止优化 -l 禁止内联 -S 输出汇编
go tool compile -S -N -l test.go
// addSub 函数编译后的汇编代码
"".addSub STEXT nosplit size=49 args=0x20 locals=0x00x0000 00000 (test.go:3)    MOVQ    $0, "".~r2+24(SP)0x0009 00009 (test.go:3)    MOVQ    $0, "".~r3+32(SP)0x0012 00018 (test.go:4)    MOVQ    "".a+8(SP), AX0x0017 00023 (test.go:4)    ADDQ    "".b+16(SP), AX0x001c 00028 (test.go:4)    MOVQ    AX, "".~r2+24(SP)0x0021 00033 (test.go:4)    MOVQ    "".a+8(SP), AX0x0026 00038 (test.go:4)    SUBQ    "".b+16(SP), AX0x002b 00043 (test.go:4)    MOVQ    AX, "".~r3+32(SP)0x0030 00048 (test.go:4)    RET// main 函数编译后的汇编代码
"".main STEXT size=68 args=0x0 locals=0x280x000f 00015 (test.go:7)      SUBQ    $40, SP0x0013 00019 (test.go:7)      MOVQ    BP, 32(SP)0x0018 00024 (test.go:7)      LEAQ    32(SP), BP0x001d 00029 (test.go:8)      MOVQ    $333, (SP)0x0025 00037 (test.go:8)      MOVQ    $222, 8(SP)0x002e 00046 (test.go:8)      CALL    "".addSub(SB)0x0033 00051 (test.go:9)      MOVQ    32(SP), BP0x0038 00056 (test.go:9)      ADDQ    $40, SP0x003c 00060 (test.go:9)      RET

如下所示:

协程退出

        协程的入口函数为 gofunc,执行完成时,最后一条语句是 “RET” 汇编指令,它将从协程栈弹出 8 字节数据,并存储到程序计数器 PC,随后通过 "JMP" 指令跳转。“RET” 弹出的是函数 runtime.goexit 首地址,就相当于跳转到了函数 runtime.goexit,该函数代码如下:

//函数 runtime.goexit 是汇编代码实现的,调用了函数 runtime.goexit1
void goexit1(void){mcall(goexit0)
}//系统栈执行该函数
func goexit0(gp *g){//设置协程状态,执行回收操作casgstatus(gp,_Grunning,_Gdead)//省略了清理协程相关数据的逻辑//添加到空闲队列gfput(_p_,gp)//调度schedule()
}

        需要注意的是,函数 runtime.goexit 是汇编代码实现的,底层直接调用了函数 runtime.goexit1。同样,这里是通过函数 runtime.mcall 切换到系统栈,所以函数 runtime.goexit0 是在系统栈执行的,也是它完成的协程的收尾工作,包括修改协程状态为_Gdead,清理协程相关数据,将协程回收到逻辑处理器 P 的空闲队列,执行调度程序等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、undo log、Buffer Pool、WAL、redo log

目录 1、undo log2、Buffer Pool3、WAL4、redo log5、总结6、问题 1、undo log undo log日志是一种用于撤销回退的逻辑日志,在事务未提交前会记录相反的操作到undo log,当事务回滚,使用undo log 进行回滚,保证了事务的原子性。MV…

【生活英语】1、高兴与难过

【生活英语】1、高兴与难过 一、我非常非常开心二、心情三、不开心四、运气五、英语对话1、We broke up2、中奖了 一、我非常非常开心 (1) I’m really happy. (2) I’m really overjoyed. (3) I couldn’t be happier. I couldn’t agree with you more. 我非常赞同你。 (4) …

C++ TinyWebServer项目总结(8. 高性能服务器程序框架)

《Linux 高性能服务器编程》一书中,把这一章节作为全书的核心,同时作为后续章节的总览。这也意味着我们在经历了前置知识的学习后,正式进入了 Web 服务器项目的核心部分! 前置内容回顾: 1. C TinyWebServer项目总结&…

每日一问:GET请求和POST请求的区别

每日一问:GET请求和POST请求的区别 在Web开发中,GET请求和POST请求是最常见的两种HTTP请求方法。尽管它们在功能上有许多相似之处,但在使用场景、数据传递方式、缓存策略等方面存在显著差异。了解这些区别不仅有助于我们在开发中做出正确的选…

Docker拉取镜像-2024-07-有效

Docker拉取镜像-有效 配置加速地址 首先&#xff0c;创建Docker配置目录&#xff1a;sudo mkdir -p /etc/docker然后&#xff0c;编辑daemon.json文件&#xff0c;添加以下加速地址&#xff1a;sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors"…

go gc信息如何查看

目录 1.几种常见方法1.1.设置环境变量 GODEBUG打印GC日志1.2.使用 debug.ReadGCStats1.3.使用 runtime.ReadMemStats 2.GC日志打印示例3.参考 在Go语言中&#xff0c;可以通过设置环境变量和使用运行时包中的调试功能来打印垃圾回收&#xff08;GC&#xff09;的信息。 1.几种…

等保测评中的安全测试方法

等保测评&#xff0c;即信息安全等级保护测评&#xff0c;是我国网络安全领域的重要评估机制&#xff0c;用于验证网络系统或应用是否满足相应的安全保护等级要求。在等保测评中&#xff0c;安全测试方法扮演着至关重要的角色。本文将详细介绍等保测评中常用的安全测试方法及其…

LinkedHashMap和TreeMap的基本使用

一.LinkedHashMap集合&#xff1a;&#xff08;是HashMap集合的儿子&#xff0c;Map集合的孙子&#xff09; 1.特点&#xff1a; 2.代码实现&#xff1a; 1)键的唯一性&#xff1a; package com.itheima.a01myMap; ​ import java.util.LinkedHashMap; ​ public class A07_…

二十三种模式之单例模式(基础了解)

1.设计模式的分类 创建型模式(五种)&#xff1a;工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。结构型模式(七种)&#xff1a;适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。行为型模式(十一种)&#xff1a;状态模式、模板方法…

Flamingo中的Perceiver Resampler

在 Flamingo 模型中&#xff0c;Perceiver Resampler 是一个关键组件&#xff0c;用于将输入的多模态数据&#xff08;如图像和文本&#xff09;转化为适合Transformer处理的表示形式。具体来说&#xff0c;它是为了解决高维视觉输入&#xff08;如图像&#xff09;和低维语言表…

【Docker项目实战】使用Docker部署webtop桌面版Linux环境

【Docker项目实战】使用Docker部署webtop桌面版Linux环境 一、webtop介绍1.1 webtop简介1.2 主要特点1.3 使用场景二、webtop相关说明2.2 webtop支持架构2.2 镜像版本说明三、本地环境介绍3.1 本地环境规划3.2 本次实践介绍四、本地环境检查4.1 检查Docker服务状态4.2 检查Dock…

YOLOv8目标检测部署RK3588全过程,附代码pt->onnx->rknn,附【详细代码】

目录 一、训练yolov8模型&#xff0c;得到最佳权重文件best.pt 二、pt转onnx,即best.pt->best11.onnx 1、对下载的YOLOv8代码修改 2、加入模型导出功能&#xff0c; 3、导出指令采用如下代码 三、ONNX转RKNN 四、RK3588部署 1、拷贝rknn文件到rk3588板子内 2、执行…

48.x86游戏实战-封包抓取进图call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

使用Supervisor守护Nginx进程

supervisor是个好工具。superviosr是一个Linux/Unix系统上的进程监控工具&#xff0c;Supervisor是用Python开发的一套通用的进程管理程序&#xff0c;能将一个普通的命令行进程变为后台daemon&#xff0c;并监控进程状态&#xff0c;异常退出时能自动重启。只要在supervisor的…

递归神经网络 (RNN) 简介

文章目录 一、介绍二、什么是递归神经网络 &#xff08;RNN&#xff09;&#xff1f;三、展开递归神经网络四、训练递归神经网络五、RNN 的类型六、现实生活中的 RNN 用例七、RNN 的两个主要限制八、RNN的变体8.1 双向递归神经网络 &#xff08;BRNN&#xff09;8.2 长短期记忆…

YOLOv8改进 | 融合改进 | C2f融合Faster-GELU模块提升检测速度【完整代码 + 主要代码解析】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

240824字节笔试题复盘

测试/测试开发方向 1、用户文档测试场景 2、大根堆排列顺序 3、时间复杂度对比 4、资源分配 5、矩阵排列 6、TCP和UDP区别 7、栈 8、用例分析与选择 9、信息脱敏 10、数据库并发 11、锁 12、边界值等价类用例设计 13、信息安全与防御 14、有关复选框的测试用例 …

节省 60% 成本还能加速业务扩展,ScraperAPI 在云基础设施上的多年实践

对于流量密集型的业务来讲&#xff0c;在创业初期&#xff0c;最头疼的就是数据库的管理&#xff0c;以及大量流量带来的高额账单。然而&#xff0c;ScraperAPI 通过结合使用 DigitalOcean 的 Droplet、托管数据库、应用托管服务和 Kubernetes&#xff0c;一箭三雕&#xff0c;…

基于信号量和环形队列的生产者消费者模型

文章目录 POSIX信号量信号量接口初始化信号量销毁信号量等待信号量发布信号量 基于环形队列的生产者消费者模型单生产单消费多生产多消费 POSIX信号量 POSIX信号量和SystemV信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源目的。 但POSIX可以…

接口返回结果封装

接口返回结果封装 1、错误信息枚举 package com.zhw.enums;public enum AppHttpCodeEnum {// 成功SUCCESS(200,"操作成功"),// 登录NEED_LOGIN(401,"需要登录后操作"),NO_OPERATOR_AUTH(403,"无权限操作"),SYSTEM_ERROR(500,"出现错误&quo…