当前位置: 首页 > news >正文

C++20协程

目录

协程原理:

进程、线程和协程的区别和联系​编辑

协程在IO多路复用中

协程的目的:        

协程的优势: ​


协程原理:

        (学习来源:幼麟实验室)

        线程是进程中的执行体,拥有一个执行入口,以及从进程虚拟地址空间中分配的栈,包括用户栈和内核栈。

操作系统会记录线程控制信息,而线程获得CPU时间片以后才可以执行,此时CPU中的栈指针、指令指针等寄存器都要切换到对应的线程。

如果线程有创建几个执行体,给他们指定各自的执行入口,申请一些内存给他们用作执行栈,那么线程就可以按需调度这几个执行体了,为了实现这几个执行体的切换,线程也需要记录他们的控制信息(id、栈的位置、执行入口地址、执行现场)线程可以选择一个执行体来执行,此时CPU中指令指针就会指向这个执行体的执行入口,栈基和栈指针寄存器也会指向线程给它分配的执行栈。

要切换执行体时, 需要保存当前执行体的执行现场,然后切换到另外一个执行体,通过一样的方式也可以恢复到之前的执行体,这样就可以从上次中断的地方继续执行。

 这些由线程创建的执行体就是协程。因为用户程序不能操作内核空间,所以只能给协程分配用户栈,而操作系统对协程一无所知,所以协程又被称为用户态线程

        创建协程时,都要指定执行入口,底层都会分配协程执行栈和控制信息,用于实现用户态的调度,让出执行权时也要保存执行现场,用于从中断处恢复执行。协程思想的关键在于控制流的主动让出和恢复。

        每个协程拥有自己的执行栈,可以保存自己的执行现场。可以由用户程序按需要创建协程,协程主动让出执行权时,会保存执行现场,然后切换到其他协程,协程恢复执行时,会根据之前保存的执行现场恢复到中断前的状态继续执行,这样就通过协程实现了即轻量级灵活的,由用户态进行调度的多任务模型。

进程、线程和协程的区别和联系

协程在IO多路复用中

        通过操作系统记录的进程控制信息,打开文件描述符表,进程打开的文件、创建的socket等等都在这个表里。socket的所有操作都由操作系统来提供,通过系统调用来完成,每创建一个socket都会在对应打开的文件描述符表中添加一个记录,而返回给应用程序的只有一个socket描述符,用于识别不同的socket。

        每个TCP socket在创建时,操作系统都会给他分匹配一个读缓冲区和一个写缓冲区,要获得响应数据就需要从内核的读缓冲区拷贝到用户空间的接收数据,同样的要通过socket发送数据也要先放到写缓冲区中。

       问题:用户程序想要接收数据时,读缓冲区不一定有数据,发送数据时,写缓冲区不一定有空间?

①:阻塞式IO:让出CPU进到等待队列中,等socket就绪后再次获得时间片才可继续执行,处理一个socket就要占用一个线程。

②:非阻塞式IO:不需要让出CPU,但是需要频繁的检查socket是否就绪了,这是一种忙等待的方式,很难把握轮询的间隔时间,容易造成空耗CPU,加剧响应延迟

③:IO多路复用:操作系统提供支持,把需要等待的socket加入到监听集合,这样就可以通过一次系统调用,同时监听多个socket,有socket就绪了就可以逐个处理了,既不为等待某个socket而阻塞也不会陷入忙等待之中。 


select:支持可读、可写、异常三类事件

可以设置要监听的描述符,也可以设置等待时间,当有准备好的fd或者超过等待时间select就会返回,最多可以监听1024(fs_Set是个unsigned long型的数据,16个元素),

等待有事件就绪或超时:每次调用select都要传递所有的监听集合,需要频繁的从用户态到内核态拷贝数据

判断那个fd就绪:每次需要遍历所有集合


poll: 相比于select没有文件描述符数量限制,fd数目等于最多可打开的文件描述符个数

 任然有每次调用poll都要从用户态到内核态拷贝,遍历集合找就绪fd


epoll:没有这些问题

epoll_create :创建epoll 获取句柄 创建一个白板 存放fd_events。

epoll_ctl :添加或者删除fd对应的事件信息,用于向内核注册新的描述符或者是改变某个文件描述符的状态。已注册的描述符在内核中会被维护在一棵红黑树上

        除了指定fd和要监听的事件类型(EPOLLIN、EPOLLOUT等)还可以传入event_data:按需要定义一个数据结构用于处理对应的fd,每次只需要传入要操作的一个fd,无需传入所有监听集合,而且只需要注册一次。

epoll_wait:通过该函数得到的fd都是已经就绪的,不需要再遍历监听集合了 通过回调函数内核会将 I/O 准备好的描述符加入到一个链表中管理,

两种触发模式:
LT:水平触发
        当 epoll_wait() 检测到描述符事件到达时,将此事件通知进程,进程可以不立即处理该事件,下次调用 epoll_wait() 会再次通知进程。是默认的一种模式,并且同时支持 Blocking 和 No-Blocking。
ET:边缘触发
        和 LT 模式不同的是,通知之后进程必须立即处理事件。
下次再调用 epoll_wait() 时不会再得到事件到达的通知。很大程度上减少了 epoll 事件被重复触发的次数,因此效率要比 LT 模式高。只支持 No-Blocking,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。

         在ET模式下,当进程没有及时处理时,只有再下次该文件描述符上再发生事件时才会得到事件通知。

 

问题:假如一个socket可读了,但是只读到了半条请求,也就是说需要再次等待这个socket可读,再继续处理下一个socket之前,需要记录下这个socket的处理状态,下一次这个socket可读时,也需要恢复上次保存的现场。也就是说再IO复用中是实现业务逻辑时,我们需要随着事件的等待和就绪而平凡的保存和恢复现场。适合使用协程

        在IO多路复用这里, 事件循环依然存在,依然要在循环中逐个处理就绪的fd,但处理过程却不是围绕具体业务而是面向协程调度。

        如果是用于监听端口的fd就绪了,就建立连接创建一个新的fd,交给一个协程来处理,协程执行入口就指向业务处理函数入口,业务处理过程中需要等待时就注册IO事件,然后让出,这样执行权就会切换到该协程的地方继续执行。

        如果是其他等待IO事件的fd就绪了,只需要恢复关联的协程即可,协程拥有自己的栈,要保存和恢复现场都很容易实现。

        IO多路复用这一层的事件循环就和具体的业务逻辑解耦了,可以把res,write,connect等可能要等待的函数包装一下,在其中实现IO事件的注册与主动让出,这样就可以在业务逻辑层面使用这些包装函数按照常规的顺序来实现业务逻辑了

这写包装函数在需要等待时会注册IO事件,然后让出协程,这样在我们实现业务逻辑时完全不用关心保存与恢复现场的问题了,协程与IO多路复用的结合保存了IO多路复用的高并发性能还解放了业务逻辑的实现。

协程的目的:        

协程主要是用来编写异步逻辑的,在有协程之前想要异步做并发要么要开多线程、要么要写函数回调非阻塞的代码。

协程的优势: 

协程切换开销比线程开销小百倍,协程可以在单线程上轻松实现并发任务。

 

         

相关文章:

C++20协程

目录 协程原理: 进程、线程和协程的区别和联系​编辑 协程在IO多路复用中 协程的目的: 协程的优势: ​ 协程原理: (学习来源:幼麟实验室) 线程是进程中的执行体,拥有一个…...

Zabbix 6.0 监控其他

文章目录 一、Zabbix 监控 Windows 系统1)下载 Windows 客户端 Zabbix agent 22)安装客户端,配置3)在服务端 Web 页面添加主机,关联模板 二、Zabbix 监控 java 应用1)客户端开启 java jmxremote 远程监控功…...

Django rest_framework Serializer中的create、Views中的create/perform_create的区别

Django rest_framework Serializer中的create、Views中的create/perform_create的区别 对于后端来说,前后端分离的方式能让前后端的开发都爽。和所有的爽一样,每爽一次都要付出一定的代价。而前后端分离的代价,就是后端要面对巨量的模块化的功…...

差异性分析傻瓜版

path1输入你的第一个Excel path2输入你的第二个Excel DEG.dig <- function(path1,path2) { require(xlsx) require(tidyverse) require(limma) require(edgeR) E<- read.xlsx (path1,sheetIndex 1,header 1) %>% column_to_rownames(var &…...

Keystone Automotive EDI 需求分析

Keystone Automotive 是一家知名的汽车零部件销售卖场&#xff0c;自创立以来&#xff0c;在汽车行业取得了卓越的成就。作为一家专业的汽车零部件供应商&#xff0c;Keystone Automotive 致力于为客户提供优质的产品和卓越的服务。公司的经营范围涵盖广泛&#xff0c;涉及多个…...

jmeter创建一个压测项目

1.jemeter新建一个项目&#xff1a; 2.接下来对Thread进行描述&#xff0c;也可以先使用默认的Thread进行操作。 3.添加http请求头的信息。按照如图所示操作 4.在请求头里面添加必要的字段&#xff0c;可以只填必要字段就可以 5.添加Http请求信息&#xff0c;如下图&#xff…...

CEC2013(MATLAB):淘金优化算法GRO求解CEC2013的28个函数

一、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;提…...

AI Deep Reinforcement Learning Autonomous Driving(深度强化学习自动驾驶)

AI Deep Reinforcement Learning Autonomous Driving&#xff08;深度强化学习自动驾驶&#xff09; 背景介绍研究背景研究目的及意义项目设计内容算法介绍马尔可夫链及马尔可夫决策过程强化学习神经网络 仿真平台OpenAI gymTorcs配置GTA5 参数选择行动空间奖励函数 环境及软件…...

Java super

在Java中&#xff0c;关键字"super"用于引用一个类的父类。它可以有以下几种用法&#xff1a; 1. 访问父类成员&#xff1a;通过使用"super"后跟一个点&#xff0c;你可以从子类中访问父类的成员&#xff08;方法或字段&#xff09;。当子类重写一个方法或…...

【人工智能前沿弄潮】——生成式AI系列:Diffusers学习(1)了解Pipeline 、模型和scheduler

Diffusers旨在成为一个用户友好且灵活的工具箱&#xff0c;用于构建针对您的用例量身定制的扩散系统。工具箱的核心是模型和scheduler。虽然DiffusionPipeline为了方便起见将这些组件捆绑在一起&#xff0c;但您也可以拆分管道并单独使用模型和scheduler来创建新的扩散系统。 …...

TypeScript 非空断言

TypeScript 非空断言 发布于 2020-04-08 15:20:15 17.5K0 举报 一、非空断言有啥用 介绍非空断言前&#xff0c;先来看个示例&#xff1a; function sayHello(name: string | undefined) {let sname: string name; // Error } 对于以上代码&#xff0c;TypeScript 编译器…...

Python编程——谈谈函数的定义、调用与传入参数

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、理解函数 二、函数的定义 1、语法 2、定义一个…...

在Ubuntu中使用Docker启动MySQL8的天坑

写在前面 简介&#xff1a; lower_case_table_names 是mysql设置大小写是否敏感的一个参数。 1.参数说明&#xff1a; lower_case_table_names0 表名存储为给定的大小和比较是区分大小写的 lower_case_table_names 1 表名存储在磁盘是小写的&#xff0c;但是比较的时候是不区…...

Python3.x String内置函数大全

文章目录 总结一下Python3.x字符串的常用系统函数&#xff0c;总共分为8类1. 大小写字母转换类的函数str.capitalize()str.title()str.lower()str.upper()str.swapcase() 2. 统计类的函数str.count(str1, beg 0,endlen(string)) 3. 匹配类的函数str.endswith(suffix, beg0, end…...

Go异常处理机制panic和recover

recover 使用panic抛出异常后, 将立即停止当前函数的执行并运行所有被defer的函数&#xff0c;然后将panic抛向上一层&#xff0c;直至程序crash。但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃&#xff0c;recover只有被defer后才是有意义的。 func main() { p…...

QMainwindow窗口

QMainwindow窗口 菜单栏在二级菜单中输入中文的方法给菜单栏添加相应的动作使用QMenu类的API方法添加菜单项分隔符也是QAction类 工具栏状态栏停靠窗口 菜单栏 只能有一个, 位于窗口的最上方 关于顶级菜单可以直接在UI窗口中双击, 直接输入文本信息即可, 对应子菜单项也可以通…...

P5735 【深基7.例1】距离函数

题目描述 给出平面坐标上不在一条直线上三个点坐标 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) (x_1,y_1),(x_2,y_2),(x_3,y_3) (x1​,y1​),(x2​,y2​),(x3​,y3​)&#xff0c;坐标值是实数&#xff0c;且绝对值不超过 100.00&#xff0c;求围成的三角形周长。保留两…...

prometheus告警发送组件部署

一、前言 要实现Prometheus的告警发送需要通过alertmanager组件&#xff0c;当prometheus触发告警策略时&#xff0c;会将告警信息发送给alertmanager&#xff0c;然后alertmanager根据配置的策略发送到邮件或者钉钉中&#xff0c;发送到钉钉需要安装额外的prometheus-webhook…...

CAPL - XML和TestModule结合实现测试项可选

目录 目的:是否想实现如下面的功能呢? 一、.can和.cin文件中函数开发...

Latex安装与环境配置(TeXlive、TeXstudio与VS code的安装)编译器+编辑器与学习应用

TeXlive 配置Tex排版系统需要安装编译器+编辑器。TeX 的源代码是后缀为 .tex 的纯文本文件。使用任意纯文本编辑器,都可以修改 .tex 文件:包括 Windows 自带的记事本程序,也包括专为 TeX 设计的编辑器(TeXworks, TeXmaker, TeXstudio, WinEdt 等),还包括一些通用的文本编…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...