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.rhkb.cn/news/375735.html

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

相关文章

14-47 剑和诗人21 - 2024年如何打造AI创业公司

​​​​​ 2024 年,随着人工智能继续快速发展并融入几乎所有行业,创建一家人工智能初创公司将带来巨大的机遇。然而,在吸引资金、招聘人才、开发专有技术以及将产品推向市场方面,人工智能初创公司也面临着相当大的挑战。 让我来…

ant design form动态增减表单项Form.List如何进行动态校验规则

项目需求: 在使用ant design form动态增减表单项Form.List时,Form.List中有多组表单项,一组中的最后一个表单项的校验规则是动态的,该组为最后一组时,最后一个表单项是非必填项,其他时候为必填项。假设动态…

SQL,python,knime将数据混合的文字数字拆出来,合并计算实战

将下面将数据混合的文字数字拆出来,合并计算 一、SQL解决: ---创建表插入数据 CREATE TABLE original_data (id INT AUTO_INCREMENT PRIMARY KEY,city VARCHAR(255),value DECIMAL(10, 2) );INSERT INTO original_data (city, value) VALUES (上海0.5…

对照ui图进行大屏幕适配,echerts适配

1.先找到ui图,我这边是1920*1080的屏幕进行的设计 2.在界面找到跟样式的字体大小,进行设置,一般ui设置字体大小便可 3.在js中写入原生js代码 function adapter() {//获取布局视口宽度,布局视口设备横向独立像素值const dpWidth…

Stable Diffusion 深度探索:从入门到精通的全方位教程

在人工智能艺术创作的浪潮中,Stable Diffusion 作为一股不可忽视的力量,正以其独特的魅力吸引着无数创作者和科技爱好者的目光。本文旨在为大家提供一份详尽的 Stable Diffusion 教程,从基础概念到高级应用,带领你一步步走进这个充…

paddla模型转gguf

在使用ollama配置本地模型时,只支持gguf格式的模型,所以我们首先需要把自己的模型转化为bin格式,本文为paddle,onnx,pytorch格式的模型提供说明,safetensors格式比较简单请参考官方文档,或其它教…

【eNSP模拟实验】单臂路由实现VLAN间通信

实验需求 如下图所示,辅导员办公室需要访问处在不同vlan的学生管理服务器的文件,那么如何实现两台终端相互通信呢?我们可以使用单臂路由的方式来实现。 单臂路由(router-on-a-stick)是指在路由器的一个接口上通过配置…

数据结构:链表详解 (c++实现)

前言 对于数据结构的线性表,其元素在逻辑结构上都是序列关系,即数据元素之间有前驱和后继关系。 但在物理结构上有两种存储方式: 顺序存储结构: 使用此结构的线性表也叫 顺序表物理存储上是连续的,因此可以随机访问…

CAS详解

文章目录 CAS使用示例Unsafe类实现原理CAS问题 CAS CAS全称为Compare and Swap被译为比较并交换,是一种无锁算法。用于实现并发编程中的原子操作。CAS操作检查某个变量是否与预期的值相同,如果相同则将其更新为新值。CAS操作是原子的,这意味…

美团收银Android一面凉经(2024)

美团收银Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《美团收银Android一面凉经(2024)》。 应聘岗位: 美团餐饮PaaS平台Android开发工程师…

使用offset explorer 3.0连接单机版kafka

一、目标 使用kafka图形化工具offset explorer 3.0连接单机版的kafka 二、windows下载安装offset explorer 3.0 1、kafka tool工具官方下载页面 Offset Explorer https://www.kafkatool.com/download.html 2、安装offset explorer 3.0 下一步,下一步&#xff0…

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

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

3D工艺大师快速生成装配动画,驱动汽车工业装配流程革新

在现代制造业的一般生产流程中,车间装配环节是产品由蓝图迈向市场前至关重要的一道工序。随着产品结构的日益复杂化和个性化需求的不断增长,车间装配工作面临着前所未有的挑战。高精密度的装配要求、错综复杂的组件关系以及频繁变更的生产计划&#xff0…

羧基聚乙二醇生物素的制备方法;COOH-PEG-Biotin

羧基聚乙二醇生物素(COOH-PEG-Biotin)是一种常见的生物分子聚合物,具有多种应用,特别是在生物实验、药物研发和生物技术等领域。以下是对该化合物的详细解析: 一、基本信息 名称:羧基聚乙二醇生物素&#x…

小程序创建与项目初始化(构建 npm + 集成 Sass)

一、打开微信开发者工具 确认 左侧导航栏是否选中的 小程序点击 【】创建小程序 二、创建小程序 三、初始化 清空 app.wxss、app.js 去掉 rendererOptions 和 componentFramework 不需要最新的搜索引擎 留下以下文件 四、自定义构建 npm 集成 Sass 首先 先把小程序源…

Mysql的语句执行很慢,如何分析排查?

1、检查服务器性能是否存在瓶颈 如果系统资源使用率比较高,比如CPU,硬盘,那访问肯定会慢,如果你发现是Mysl占比比较高,说明Mysql的读写频率高,如果本身网站访问量不大,说明你的sql参数,sql语句查…

WIN10开机突然,过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL

环境: Win10 专业版 DELL7080 问题描述: WIN10开机突然,过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL 事件日志 解决方案: 1.找到MEMORY.DMP文件内容,分析一下 Microsoft (R) Windows Debugger Version 10…

.Net Core 微服务之Consul(二)-集群搭建

引言: 集合上一期.Net Core 微服务之Consul(一)(.Net Core 微服务之Consul(一)-CSDN博客) 。 目录 一、 Consul集群搭建 1. 高可用 1.1 高可用性概念 1.2 高可用集群的基本原理 1.3 高可用集群的架构设计 1.3.1 主从复制架构 1.3.2 共享存储架构 1.3.3 负载均衡…

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

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

【开源 Mac 工具推荐之 1】gibMacOS:方便快捷的 macOS 完整包下载 Shell 工具

简介 gibMacOS 是由 GitHub 开发者 corpnewt 编写的一款 Shell 工具。它采用 Python 编程语言,可以让用户打开后在纯文本页面中轻松选择并下载来源于 Apple 官方的 macOS 完整安装包。 Repo 地址:https://github.com/corpnewt/gibMacOS (其…