13 协程设计原理与汇编实现

协程的问题

  1. 为什么要有协程?
  2. 协程的原语操作?
  3. 协程的切换?
  4. 协程的struct如何定义?
  5. 协程的scheduler(调度)如何定义?
  6. 调度策略如何实现?
  7. 协程如何与posix,api兼容?
  8. 协程多核模式?
  9. 协程的性能如何测试?

为什么要有协程

同步的编程方式,异步的性能。同步编程时,我们需要等待io就绪。但是在协程这里,我们使用一种机制,当io需要等待时,就切到下一个io,之后当之前的io就绪时,再切换回来继续处理就绪事件。

IO 异步操作与 IO 同步操作

同步/异步是用来形容两者之间的关系的
举个例子:这里有个dns服务器,还有一个dns客户端,假如我们向dns服务器发送50个请求,也就是我们发送发送50个域名,然后dns要返回50个ip地址。
同步就是我们向dns服务器请求一个,然后dns服务器返回一个。也就是这50个事串行的。
异步就是我们向dns服务器请求很多个,然后dns服务器有结果了就返回。也就是这50个事并行的。
在这里插入图片描述
从代码上看:
同步

sync(){send(request);recv(response);
}
response_cb(){//回调函数recv();
}
async(){send(request,response_cb);
}

异步有个缺点,send()和response()不是在一个流程里面,他可能有一个线程,或者有一个while()循环一直监视着是否可以调用response。所以可能send()和response()不是在一个线程里面。如果response中再调用回调的话,那么这个代码非常不利于人的阅读。

对比项IO 同步操作IO 异步操作
代码逻辑程序整体逻辑清晰子模块逻辑清晰
程序性能响应时间长,性能差响应时间短,性能好

所以同步编程简单,易于阅读。异步编程复杂,不太利于人的阅读。

再例如:检测io,读写,再一个流程里面。这里的同步和异步是说的检测io和读写io之间的关系。同步的性能是不如异步的。
7300ms,同步

while(1){epoll_wait();for(){recv();send();}
}

1600ms,异步

while(1){epoll_wait();for(){push_thread();}
}

在这里插入图片描述
所以同步编程简单,易于阅读。异步编程复杂,不太利于人的阅读。

所以有没有一种方式编程方式,拥有同步的编程方式,异步一样的性能。
协程就是这样的,我们写代码的时候看着是同步的,但是他底层是异步的。

async_Recv(fd,buffer,length){ret=poll(fd);//是否就绪epoll_ctl(add);//就是就绪了之后能切换回来。switch(next_fd);//不就绪就切换
}
async_Send(fd,buffer,length){ret=poll(fd);//是否就绪epoll_ctl(add);switch(next_fd);//不就绪就切换
}while(1){epoll_wait();for(){async_Recv(fd,buffer,length);parse(buffer);async_Send(fd,buffer,length);}
}

就是处理的时候,如果没有就绪就切换到下一个,然后将当前这个加入到epoll中,如果这个就绪了,方便下次处理这个。
这里的切出用yield,回来用resume.

协程的原语操作

协程的核心原语操作:create, resume, yield。
两个,一个让出,一个切换回来

yield(from,to);//这个是切出
resume(to,from);//这个是回来

create:创建一个协程。

  1. 调度器是否存在,不存在也创建。调度器作为全局的单例。将调度
    器的实例存储在线程的私有空间 pthread_setspecific。
  2. 分配一个 coroutine 的内存空间,分别设置 coroutine 的数据
    项,栈空间,栈大小,初始状态,创建时间,子过程回调函数,子
    过程的调用参数。
  3. 将新分配协程添加到就绪队列 ready_queue 中

yield: 让出 CPU。

void nty_cor

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

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

相关文章

信息技术课堂纪律管理:从混乱到秩序的智慧转型

引言: 在信息爆炸的时代,信息技术课程如同一把开启未来世界大门的钥匙,为学生们搭建起探索科技奥秘的桥梁。然而,面对着屏幕背后的无限诱惑,维持课堂纪律,确保学生们专注于学习,成为了每位信息…

C/C++内存分布

1.内存分布简略图 2.全局变量和静态变量的区别 (1)局部静态变量:存储在数据段中,局部静态变量的作用域在当前函数中,出了函数就不能使用该变量,但局部静态变量的生命周期是在整个程序间,局部静态变量要运行到这一行才…

【Java14】构造器

Java中的构造器在创建对象(实例)的时候执行初始化。Java类必须包含一个或一个以上的构造器。 Java中的构造器类似C中的构造函数。 Java中对象(object)的默认初始化规则是: 数值型变量初始化为0;布尔型变量…

【CSAPP】-cachelab实验

目录 实验目的与要求 实验设备与软件环境 实验过程与结果(可贴图) 操作异常问题与解决方案 实验总结 实验目的与要求 1、掌握应用程序性能的优化方法; 2、理解存储器层次结构在程序运行过程中所起的重要作用; 3、让学生更好…

高考志愿填报的六个不要

在高考志愿填报这个关键时刻,确实需要谨慎行事,避免一些常见的错误。以下是高考志愿填报的六个“不要”,希望能为你提供一些有用的建议: 1、不要盲目跟风 每个人的兴趣、能力和未来规划都不同,不要仅仅因为某个专业或…

Gradle基础:从入门到掌握

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 在现代软件开发中,自动化构建工具是提高效率和管理依赖的重要手段。而Gradle作为一种灵活且强大的构…

python基础篇(9):模块

1 模块简介 Python 模块(Module),是一个 Python 文件,以 .py 结尾. 模块能定义函数,类和变量,模块里也能包含可执行的代码. 模块的作用: python中有很多各种不同的模块, 每一个模块都可以帮助我们快速的实现一些功能, 比如实现…

工业4.0视角下:PLC转OPC UA网关的作用

在工业自动化领域,PLC(可编程逻辑控制器)是常见的控制设备,而OPC UA(开放型工业自动化统一架构)协议则是一种现代化的通信协议,用在工厂自动化系统中实现设备之间的数据交换和通信。PLC转OPC U…

TensorRT动态形状(Dynamic Shape)出错,官方demo+自己模型运行时出错

(2024.7.2) 使用TensorRT处理动态输入形状推理时出现的错误,本案基于官方demo文件,已解决: TensorRT版本10.0,官方例子使用的是这个https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/01-SimpleDem…

贝叶斯估计(1):期末大乱炖

写在前面! 1 先验分布和后验分布 三种信息:总体信息、样本信息、先验信息 总体信息:“总体是正态分布”;样本信息:总体抽取的样本提供的信息,是最新鲜的信息;先验信息:在抽样之前就…

Excel数据截取及合并多行多列数据

公式一:RIGHT(A2,LEN(A2)-FINDB(")",A2)) 公式二:PHONETIC(C2:D19) 详情可以看附件。

AJAX快速入门(一) express框架的安装和使用范例

主打一个有用 首先保证安装了nodejs环境 打开终端 初始化npm npm init安装express npm i express测试样例 目录结构 样例代码 express.js //引入express const express require(express);//创建应用对象 const app express();//创建路由规则 //req是请求对象&#x…

一文清晰了解HTML——简单实例

想要仿照该页面编写HTML代码&#xff1a; 在vscode中输入&#xff01;自动生成默认模板&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…

第二证券股市资讯:深夜!突然暴涨75%!

一则重磅收买引发医药圈轰动。 北京时间7月8日晚间&#xff0c;美股开盘后&#xff0c;美国生物制药公司Morphic股价一度暴升超75%。音讯面上&#xff0c;生物医药巨子礼来公司官宣&#xff0c;将以57美元/股的价格现金收买Morphic&#xff0c;较上星期五的收盘价溢价79%&…

19_谷歌GoogLeNet(InceptionV1)深度学习图像分类算法

1.1 简介 GoogLeNet&#xff08;有时也称为GoogleNet或Inception Net&#xff09;是一种深度学习架构&#xff0c;由Google的研究团队在2014年提出&#xff0c;主要设计者为Christian Szegedy等人。这个模型是在当年的ImageNet大规模视觉识别挑战赛&#xff08;ILSVRC&#xf…

什么是T0策略?有没有可以持仓自动做T的策略软件?

​​行情低迷&#xff0c;持仓被套&#xff0c;不想被动等待&#xff1f;长期持股&#xff0c;想要增厚持仓收益&#xff1f;有没有可以自动做T的工具或者策略&#xff1f;日内T0交易&#xff0c;做到降低持仓成本&#xff0c;优化收益预期。 什么是T0策略&#xff1f; 可以提…

韦东山嵌入式linux系列-LED驱动程序

之前学习STM32F103C8T6的时候&#xff0c;学习过对应GPIO的输出&#xff1a; 操作STM32的GPIO需要3个步骤&#xff1a; 使用RCC开启GPIO的时钟、使用GPIO_Init函数初始化GPIO、使用输入/输出函数控制GPIO口。 【STM32】GPIO输出-CSDN博客 这里再看看STM32MP157的GPIO引脚使用…

jmeter-beanshell学习5-beanshell加减乘除运算

我用到的场景是计算金额&#xff0c;所以主要以金额为主&#xff0c;感觉这部分有点麻烦&#xff0c;直接写遇到的几个坑&#xff0c;就不演示解决的过程了。 1.最早写了个两数相减&#xff0c;但是小数精度容易出现问题。比如1-0.010.989999997这种情况&#xff0c;随便写的几…

初学SpringMVC之执行原理

Spring MVC 是基于 Java 实现 MVC 的轻量级 Web 框架 导入 jar 包 pom.xml 文件导入依赖&#xff1a; <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency><dep…

YOLOv9:一个关注信息丢失问题的目标检测

本文来自公众号“AI大道理” 当前的深度学习方法关注的是如何设计最合适的目标函数&#xff0c;使模型的预测结果最接近地面的真实情况。同时&#xff0c;必须设计一个适当的体系结构&#xff0c;以方便获取足够的预测信息。 现有方法忽略了一个事实&#xff0c;即输入数据在逐…