io的异步处理io_uring,实现io_uring_tcp_server - 详解

news/2025/10/1 22:13:57/文章来源:https://www.cnblogs.com/yxysuanfa/p/19122958

一、什么是异步?有哪些场景是异步?如何做到异步?

异步是对于两个事物的关系

io的检测 与 读写信息

读写数据 与 素材解析

比如:

客户端只管发送请求,这样许可并发多条请求,哪条请求有了响应再返回结果,这样客户端界面就不至于等一个请求有了响应再发起另一个请求(串行),界面不卡顿,提高用户体验

服务端对IO的处理往往比较耗时,行把数据读写 与 数据处理做成异步,比如主线程只负责数据的读写,置于数据如何解析、响应可以抛到线程池处理,等有了结果再返回。这就大大减少了读完数据,还要等待数据解析、处理的时间。

read() write() recv() send()这些函数都是同步

比如read() 读取请求 --- 返回数据

那如何把a_read做成异步?

通过调用a_read,只发起读取请求,能够把请求放到一个任务队列(sqe)

work负责从任务队列取数据,执行,把结果放到结果队列(cqe) (线程池)

while(1)不断从cqe取结果(子线程)

注:

1.把task加到sqe会涉及频繁copy,可以利用mmap,把用户空间与内核空间做映射,避免copy

2.如何做到线程安全?

效率不高就是加锁是一种方案,但

可以用无锁队列(环形队列),如:不断对100取模

环形的就是内存是连续的,逻辑上

io_uring?和epoll有什么区别?就是二、什么

io_uring 也是linux内核献出的,不过实现的是IO的异步处理

主要包含三个系统调用:

io_uring_setup ---- 创建环形队列(含mmap),sqe、cqe是一块内存、节点共享

io_uring_register --- 往sqe添加节点

io_uring_entry --- 把sqe所有节点交由内核

内核处理请求,返回结果到cqe

这三个系统调用被封装到了liburing的库中

区别在于:

epoll 需要管理的event只要放到总集,就不用再重复添加

io_uring 把请求放到sqe,内核对请求的操作是消耗性的,处理完,请求就不在sqe了;若想重复监控,就需要重复set

io_uring 中 EVENT_READ --- 数据已经读完了

epoll 中 EPOLLIN --- 数据可读

三、如何是实现一个io_uring_tcp_server?

1.初始化socket(create、bind、listen)

2.把accept、recv、send做成异步:

io_uring_setup --- io_uring_queue_init_params --- 创建sqe、cqe环形队列(含mmap)

io_uring_register --- io_uring_prep_accept等 --- 请求放到sqe

io_uring_entry --- io_uring_submit --- 把sqe中所有请求交由内核

内核接受到请求,立即处理,结果放到cqe

io_uring_peek_batch_cqe ---- 从cqe取结果

3.set_event_accept等对io_uring_prep_accept二次封装,添加event fd、sttatus控制。

后续根据不同的status,进行不同的处理,如,往sqe添加节点(set_event_rev等)

注:逻辑上而言:EVENT_READ --- 数据已经读完了。

因为EVENT_READ 定位在 set_event_recv 中,它实现了数据接收,并设置event状态。

具体代码完成如下:

set_event_accept、set_event_recv、set_event_send的封装

初始化socket(create、bind、listen)

setup环形队列(sqe、cqe)、register添加节点、entry交由内核处理

根据event状态,不同处理

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

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

相关文章

网络舆情应对措施seo推广教程seo推广技巧

1、什么是多态性?什么是虚拟方法调用? 对象的多态性: Person p new xx(); 此时new的对象可以为多种形态,但需要是person类的子类。即父类的引用指向子类的对象。 虚拟方法调用: p.eat(); 该语句在编译时会认为时调用Person类中的…

VMware NSX 4.2.3.1 发布,新增功能概览

VMware NSX 4.2.3.1 - 网络安全虚拟化平台VMware NSX 4.2.3.1 发布,新增功能概览 VMware NSX 4.2.3.1 - 网络安全虚拟化平台 构建具有网络连接和安全性的云智能网络,跨多种云环境支持一致的策略、运维和自动化。 请访…

Claude Code V2集成KAT-Coder

Claude Code V2集成KAT-CoderClaude Code V2安装Anthropic于2025年9月29日正式发布了Claude Code的重大版本更新(v2.0),并推出了Claude Sonnet 4.5模型。Anthropic是一家人工智能公司,由OpenAI前员工创立,致力于开…

用wordpress做微站企业网站 jquery

多重继承派生类 除去一个类从一个基类派生,C还支持一个派生类同时继承多个基类 MI:有多个直接基类的类 1.多重继承派生类的定义 如果已经定义了多个基类,那么定义多重继承的派生类的形式为: class 派生类名:访问标号1 基类名…

Ceph 分布式存储学习笔记(一):介绍、部署与集群设置(上)

Ceph 分布式存储学习笔记(一):介绍、部署与集群设置(上)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

不让在建设门户网站wordpress 无法将上传的文件移动至

DP——动态规划 动态规划算法动态规划的一般步骤特殊DP——背包0-1背包问题完全背包问题 总结 动态规划算法 当涉及到解决具有重叠子问题的优化问题时,动态规划是一种常用的算法技术。它通过将问题分解为一系列重叠子问题,并使用递归或迭代的方式来解决…

VMware Aria Suite Lifecycle 8.18 Patch 5 发布,新增功能概览

VMware Aria Suite Lifecycle 8.18 Patch 5 发布,新增功能概览VMware Aria Suite Lifecycle 8.18 Patch 5 发布,新增功能概览 VMware Aria Suite Lifecycle 8.18 - 应用生命周期管理 请访问原文链接:https://sysin.…

阿里云的国际网站建设中山市企业网站seo哪家好

更新: 在上一篇文章中,我们介绍了如何聚合SDK的基本原理,介绍了聚合SDK的接口设计,那么当CP接入了我们的聚合SDK,给了我们游戏apk包时,这时我们又当如何分发渠道包呢? 分发渠道包:…

P3977 [TJOI2015] 棋盘题解

题目描述 有个 \(n\) 行 \(m\) 列的棋盘,棋盘上可以放许多棋子。每个棋子的攻击范围是 \(3\) 行 \(p\) 列。输入数据用一个 \(3\times p\) 的矩阵给出了棋子攻击范围的模板,棋子被默认为模板中的第 \(2\) 行,第 \(k…

申请建设门户网站的申请电子商务网站建设 试卷

前言 中篇讲了进程为什么要有优先级,以及环境变量和通过代码获得环境变量 本篇主要讲解什么是地址空间 , 地址空间是怎么设计的?为什么要有地址空间? 程序地址空间 先看下图 验证上图的正文代码至堆的地址是不是从低地址向高地…

VMware vCenter Server 7.0U3w 发布 - 集中管理 vSphere 环境

VMware vCenter Server 7.0U3w 发布 - 集中管理 vSphere 环境VMware vCenter Server 7.0U3w 发布 - 集中管理 vSphere 环境 Server Management Software | vCenter 请访问原文链接:https://sysin.org/blog/vmware-vce…

VMware Aria Operations 8.18.5 发布,新增功能概览

VMware Aria Operations 8.18.5 发布,新增功能概览VMware Aria Operations 8.18.5 发布,新增功能概览 VMware Aria Operations 8.18.5 - 多云 IT 运维管理 通过统一的高性能平台,实现跨私有云、混合云和多云环境的 …

03. 基本元素

一、基本元素元素可以被分为 可视化元素 与 非可视化元素。一个 可视化元素(例如矩形框 Rectangle)有着几何形状并且可以在屏幕上显示。一个 非可视化元素(例如计时器 Timer)提供了常用的功能,通常用于操作可视化…

VMware Aria Operations for Logs 8.18.5 发布,新增功能概览

VMware Aria Operations for Logs 8.18.5 发布,新增功能概览VMware Aria Operations for Logs 8.18.5 发布,新增功能概览 VMware Aria Operations for Logs 8.18.5 - 集中式日志管理 请访问原文链接:https://sysin.…

学做川菜的网站黑龙省建设厅网站首页

文章目录 1、DES中的S-盒输入输出问题 (不需要记住S-盒)2、Kerberos认证系统3、简答题(三题每题8分):课后习题第一章、第三章、第四章第一章:重点关注安全模型内容,有几种,有几个分级…

喵之勇者败北录

⚡毕竟😣D/N/A🧬😱无法诉说😍⚡⚡这颗心🥰😭在我心中🧬浸染成红❤️浸染成红🖤⚡⚡睡不着啊😱没有迷路的东西🧬😍不是请求😭💧⚡这个细胞是🧬🥰愛憎😣被刻上了⚡⚡还没找到😭🧬还…

中南路网站建设公司代理财务记账公司

一、什么是Sass Sass (Syntactically Awesome StyleSheets)是css的一个扩展开发工具,它允许你使用变量、条件语句等,使开发更简单可维护。这里是官方文档。 二、基本语法 1)变量 sass的变量名必须是一个$符号开头,后面紧跟变量名…

岳西县建设局网站电子书制作公司网站

本文为大家揭示 NebulaGraph 率先提出的 Graph RAG 方法,这种结合知识图谱、图数据库作为大模型结合私有知识系统的最新技术栈,是 LLM 系列的第三篇,加上之前的图上下文学习、Text2Cypher 这两篇文章,目前 NebulaGraph LLM 相关的…

【完整源码+素材集+部署教程】鱼类部位分割系统: yolov8-seg-goldyolo

【完整源码+素材集+部署教程】鱼类部位分割系统: yolov8-seg-goldyolopre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

Windows 作为 Ansible 节点的完整部署流程(含 Docker 部署 Ansible) - 实践

Windows 作为 Ansible 节点的完整部署流程(含 Docker 部署 Ansible) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…