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

news2024/9/19 10:53:27

协程的问题

  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.coloradmin.cn/o/1922491.html

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

相关文章

什么是STM32?嵌入式和STM32简单介绍

1、嵌入式和STM32 1.1.什么是嵌入式 除了桌面PC之外,所有的控制类设备都是嵌入式 嵌入式系统的定义:“用于控制、监视或者辅助操作机器和设备的装置”。 嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板,是一种专用的计算机系统。…

iPhone删除所有照片的高效三部曲

苹果手机用久了,系统缓存包括自己使用手机留下的内存肯定会越来越多。其中,相册中的照片数量可能会急剧增加,占据大量的存储空间。当用户们想要对相册进行彻底清理,实现iPhone删除所有照片时,不妨跟随以下详细的三部曲…

k8s核心操作_k8s中的存储抽象_基本概念与NFS搭建_Deployment使用NFS进行挂载---分布式云原生部署架构搭建028

然后我们继续开始看 如果我们使用容器部署,比如我们有三个节点,一个是master,一个node1 一个是node2 那么pod 中我们可以看到,容器中的 /data 等各个目录都映射了出来了,但是 如果比如上面红色的部分,有个pod,原来在node2上,最右边那个,但是这个pod宕机了 那么,k8s会在node…

【数据结构】--- 堆的应用

​ 个人主页:星纭-CSDN博客 系列文章专栏 :数据结构 踏上取经路,比抵达灵山更重要!一起努力一起进步! 一.堆排序 在前一个文章的学习中,我们使用数组的物理结构构造出了逻辑结构上的堆。那么堆到底有什么用呢&…

数据结构——考研笔记(一)绪论

目录 数据结构一、绪论1.1 数据结构的基本概念1.1.1 什么是数据?1.1.2 数据元素——描述一个个体1.1.3 什么是数据对象1.1.4 什么是数据机构 1.2 数据结构的三要素1.2.1 逻辑结构1.2.2 数据的运算1.2.3 物理结构1.2.4 数据类型、抽象数据类型1.2.5 知识回顾与重要考…

【C++】开源:paho-mqtt-cpp库配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍paho-mqtt-cpp库配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&#xff…

echarts解决数据差异过大的问题

问题描述 使用echarts折线图和柱状图展示数据时,如果数据差异值较大,会导致显示图形差异过大,图表不美观。 如这一组数据[2000000, 200, 0.1, 20, 0, -10, -3000],渲染出来的效果如下图: 可以看到由于最大值和最小值差…

【经验总结】将markdown文档转换为word(swagger导出word)

工具准备: 任意markdown编辑器,以typora为例pandoc,官方下载地址 思路整理: 从swagger提取离线md文档将md文档转换为word格式 操作步骤: 一、安装pandoc (markdown编辑器安装略) 前往官网…

【学术会议征稿】第三届能源互联网及电力系统国际学术会议(ICEIPS 2024)

第三届能源互联网及电力系统国际学术会议(ICEIPS 2024) 2024 3rd International Conference on Energy Internet and Power Systems 能源互联网是实现新一代电力系统智能互动、开放共享的重要支撑技术之一,也是提升能源调度效率&#xff0…

大模型最新黑书:基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理 PDF

今天给大家推荐一本丹尼斯罗斯曼(Denis Rothman)编写的关于大语言模型&#xff08;LLM&#xff09;权威教程<<大模型应用解决方案> 基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理>&#xff01;Google工程总监Antonio Gulli作序&#xff0c;这含金量不…

常见的网络安全设备

一、防火墙 防火墙的核心任务&#xff1a;防护和控制&#xff0c;防火墙通过安全策略识别流量并做出相应的动作。 防火墙的安全策略在进行匹配时&#xff0c;自上而下逐一匹配&#xff0c;匹配成功则不向下进行匹配&#xff0c;末尾隐含拒绝所有规则。 1.包过滤防火墙 工作范围…

ChatGPT Mac App 发布!

2024 年 6 月&#xff0c;OpenAI 的大语言模型 ChatGPT 的 Mac 客户端与 ChatGPT-4o 一起发布了。ChatGPT Mac 户端可以让用户直接在 Mac 电脑上使用 ChatGPT 进行对话。它提供了一个简单易用的用户界面&#xff0c;用户可以在其中输入文本或语音指令&#xff0c;并接收模型生成…

(视频演示)基于OpenCV的实时视频跟踪火焰识别软件V1.0源码及exe下载

本文介绍了基于OpenCV的实时视频跟踪火焰识别软件&#xff0c;该软件通过先进的图像处理技术实现对实时视频中火焰的检测与跟踪&#xff0c;同时支持导入图片进行火焰识别。主要功能包括相机选择、实时跟踪和图片模式。软件适用于多种场合&#xff0c;用于保障人民生命财产安全…

VMWare 下给Centos扩容

目录 参考文档背景介绍扩容查看当前文件磁盘信息增加一个存储分区创建物理卷把物理卷添加到卷组查看卷组名把物理卷并入卷组 对文件系统进行扩容搞定 参考文档 1、百度经验 2、CSDN 3、掘金 背景介绍 测试环境用VMWare 安装centos7&#xff0c;几年下来磁盘空间不够用了&…

【全面介绍Photoshop,什么是Photoshop?】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 目录 🏆前言🏆界面熟悉🏆基础工具🏆图层🏆调整与修饰🏆颜…

【postgresql】权限(Privileges)

权限&#xff08;privileges&#xff09;是决定用户或角色可以对数据库对象&#xff08;如表、视图、序列和函数&#xff09;执行哪些操作的许可。权限对于维护安全性和控制对数据的访问至关重要。 权限分类 在 PostgreSQL 中&#xff0c;权限分为以下几种&#xff1a; SELEC…

ESP32CAM物联网教学12

ESP32CAM物联网教学12 MicroPython 视频服务 小智希望能在MicroPython中实现摄像头的视频服务&#xff0c;就像官方示例程序CameraWebServer那样。 下载视频服务驱动库 小智通过上网搜索&#xff0c;发现相关的教学材料还不少&#xff0c;并且知道有人已经写出了视频服务的驱…

【微信小程序知识点】手机号验证组件

手机验证组件&#xff0c;用于帮助开发者向用户发起手机号申请&#xff0c;必须经过用户同意后&#xff0c;才能获得由平台验证后的手机号&#xff0c;进而为用户提供相应的服务。 手机号验证组件分为两种&#xff1a;手机号快速验证组件以及手机号实时验证组件。 1.手机号快速…

StarRocks部署高可用 FE 集群

一、准备工作 1.1 部署规划 这里我打算部署存算一体模式&#xff0c;三节点。即三个FE节点&#xff0c;三个BE节点。假设三台IP分别为&#xff1a;10.10.10.50、10.10.10.51、10.10.10.52 我将采用三台centos7.9进行部署&#xff0c;单台配置为128C 256G 3T。 1.2 服务器检查…

web前端开发——标签一(注释、标题、段落、换行、格式、图片)

今天我来针对web前端开发讲解标签一 目录 html标签_标题&段落&换行 注释标签&#xff1a;Ctrl/ 标题标签&#xff1a; h1-h6 段落标签&#xff1a; 换行标签: 格式标签 图片标签_src属性 html标签_标题&段落&换行 注释标签&#xff1a;Ctrl/ Ctrl/ &…