io_uring笔记

目录

  • io_uring 异步
  • io_uring 使用
  • 对比于epoll的效果
  • io_uring效果好在哪?

io_uring 异步

要求内核linux 5.10
异步四元组:1、init(create)2、commit 3、callback 4、destory
fio : 测iops一秒钟读写磁盘的次数

方式磁盘iops
io_uring11.6k
libaio10.7k
psync5k
spdk(内存操作 , 尽可能都放到用户态)157k

io_uring 使用

io_uring内核api:
io uring. setup();
io
uring
register();
io_ uring_ enter();

liburing接口:

  1. io_uring. _queue. init. params
  2. io_uring_prep_accept
  3. io_ uring. prep_recv
  4. io_uring_prep_send(uring, )
  5. io_ uring_submit0;
  6. io_uring wait_cqe
  7. io_uring_ peek_ batch_ cqe
  8. io_uring_cq_advance//取消事件

在这里插入图片描述
猜测运行机制:
在这里插入图片描述
io _uring. _setup();
做两件事
1)注册两个队列
2)使用mmap映射内核的队列和用户态的队列:
在这里插入图片描述
echo_websever:

// io_uring, tcp server// multhread, select/poll, epoll, coroutine, iouring
// reactor// io #include <liburing.h>#include <stdio.h>
#include <string.h>#include <sys/socket.h>
#include <netinet/in.h>#include <unistd.h>#define ENTRIES_LENGTH		4096enum {READ,WRITE,ACCEPT,};struct conninfo {int connfd;int type;
};void set_read_event(struct io_uring *ring, int fd, void *buf, size_t len, int flags) {struct io_uring_sqe *sqe = io_uring_get_sqe(ring);io_uring_prep_recv(sqe, fd, buf, len, flags);struct conninfo ci = {.connfd = fd,.type = READ};memcpy(&sqe->user_data, &ci, sizeof(struct conninfo));}void set_write_event(struct io_uring *ring, int fd, const void *buf, size_t len, int flags) {struct io_uring_sqe *sqe = io_uring_get_sqe(ring);io_uring_prep_send(sqe, fd, buf, len, flags);struct conninfo ci = {.connfd = fd,.type = WRITE};memcpy(&sqe->user_data, &ci, sizeof(struct conninfo));}void set_accept_event(struct io_uring *ring, int fd,struct sockaddr *cliaddr, socklen_t *clilen, unsigned flags) {struct io_uring_sqe *sqe = io_uring_get_sqe(ring);io_uring_prep_accept(sqe, fd, cliaddr, clilen, flags);struct conninfo ci = {.connfd = fd,.type = ACCEPT};memcpy(&sqe->user_data, &ci, sizeof(struct conninfo));}int main() {int listenfd = socket(AF_INET, SOCK_STREAM, 0);  // if (listenfd == -1) return -1;
// listenfdstruct sockaddr_in servaddr, clientaddr;servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(9999);if (-1 == bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) {return -2;}listen(listenfd, 10);struct io_uring_params params;memset(&params, 0, sizeof(params));// epoll --> struct io_uring ring;io_uring_queue_init_params(ENTRIES_LENGTH, &ring, &params);socklen_t clilen = sizeof(clientaddr);set_accept_event(&ring, listenfd, (struct sockaddr*)&clientaddr, &clilen, 0);char buffer[1024] = {0};
//while (1) {struct io_uring_cqe *cqe;//从sqe地址复制地址io_uring_submit(&ring) ; //提交,在这个阶段进行accpet和recv、write等int ret = io_uring_wait_cqe(&ring, &cqe); //回调struct io_uring_cqe *cqes[10];int cqecount = io_uring_peek_batch_cqe(&ring, cqes, 10);// 10是每次最多返回10个队列元素int i = 0;unsigned count = 0;for (i = 0;i < cqecount;i ++) {cqe = cqes[i];count ++;struct conninfo ci;memcpy(&ci, &cqe->user_data, sizeof(ci));if (ci.type == ACCEPT) {int connfd = cqe->res;set_read_event(&ring, connfd, buffer, 1024, 0);} else if (ci.type == READ) {int bytes_read = cqe->res;if (bytes_read == 0) {close(ci.connfd);} else if (bytes_read < 0) {} else {printf("buffer : %s\n", buffer);set_write_event(&ring, ci.connfd, buffer, bytes_read, 0);}} else if (ci.type == WRITE) {set_read_event(&ring, ci.connfd, buffer, 1024, 0);}}io_uring_cq_advance(&ring, count);}}

对比于epoll的效果

在这里插入图片描述
在这里插入图片描述
都采用echo_websever:
epoll: 60w
io_uring: 65w

io_uring效果好在哪?

epoll是把io放入了红黑树
io_uring共享内存:存储空间、修改变量

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

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

相关文章

【Java并发】什么是AQS?

文章目录 什么是AQS?AQS与Synchronized的区别AQS-基本工作机制AQS是公平锁与非公平锁 什么是AQS? 全称是 AbstractQueuedSynchronizer&#xff0c;即抽象队列同步器。它是构建锁或者其他同步组件的基础框架 所谓抽象&#xff0c;其实目的就是把具体的逻辑交给子类去实现&…

clion run qt 问题汇总

一、Error copying file “D:/soft/QT/5.15.2/mingw81_64/bin/Qt5Cored.dll” to “D:/work/Ccode/qtproject/cmake-build-debug-qtmingw”.报错 查看路径下确实没有Qt5Cored.dll&#xff0c;只有Qt5Core.dll 注释掉cmakelist中的这三行 重新执行后成功 二、使用CLion编辑u…

macbook有哪些好用的软件

最近有朋友留言说让小编推荐一些macbook必备应用软件&#xff0c;这不&#xff0c;macdown小编就精心整理了20多款有着不同用途的软件&#xff0c;自己用着还不错&#xff0c;现在分享给大家&#xff0c;整理不易&#xff0c;希望大家点赞收藏&#xff01; 最近有朋友留言说让小…

数据结构链表——单链表

数据结构链表——单链表 概念及结构单链表的实现结构体类型的定义和头文件接口函数打印链表创建新节点尾插头插尾删头删查找任意插入指定位置之前插入指定位置之后插入 指定位置删除指定位置后删除单链表空间的销毁 概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续…

MNIST数据集知识合集

MNIST数据集知识合集 认识MNIST数据集通过本地文件加载MNIST数据集torchvision.datasets加载MNIST数据集可视化&#xff08;即转换成.jpg/.png之类的文件&#xff09;疑惑—datasets.mnist和datasets.MNIST问题—downloadFalse运行报错 搭建CNN用于数字识别 认识MNIST数据集 M…

web前端之CSS

文章目录 一、CSS简介1.1 CSS语法规则 二、CSS的引用方法2.1 定义行内样式表2.2定义内部样式表2.3链入外部样式表2.4导入外部样式表 三、CSS选择符3.1 基本选择符3.1.1 标签选择符3.1.2 class类选择符3.1.3 id选择符 3.2 复合选择符3.2.1 交集选择符&#xff08;合并选择器&…

Linux MQTT智能家居项目(智能家居界面布局)

文章目录 前言一、创建工程项目二、界面布局准备工作三、正式界面布局总结 前言 一、创建工程项目 1.选择工程名称和项目保存路径 2.选择QWidget 3.添加保存图片的资源文件&#xff1a; 在工程目录下添加Icon文件夹保存图片&#xff1a; 将文件放入目录中&#xff1a; …

AIGC 浪潮下,鹅厂新一代前端人的真实工作感受

点击链接了解详情 原创作者&#xff1a;张波 腾小云导读 AIGC 这一时代潮流已然不可阻挡&#xff0c;我们要做的不是慌乱&#xff0c;而是把握住这个时代的机会。本文就和大家一起来探索在 AIGC 下&#xff0c;前端工程师即将面临的挑战和机遇。聊聊从以前到现在&#xff0c;A…

浅谈AI浪潮下的视频大数据发展趋势与应用

视频大数据的发展趋势是多样化和个性化的。随着科技的不断进步&#xff0c;人们对于视频内容的需求也在不断变化。从传统的电视节目到现在的短视频、直播、VR等多种形式&#xff0c;视频内容已经不再是单一的娱乐方式&#xff0c;更是涉及到教育、医疗、商业等各个领域。 为了满…

云原生Kubernetes:阿里云托管k8s集群ACK创建和使用

目录 一、理论 1.容器服务Kubernetes版 2.ACK Pro版集群概述 3.ACK版本说明 二、实验 1.创建专有版Kubernetes集群 三、问题 1.依赖检查未通过 一、理论 1.容器服务Kubernetes版 &#xff08;1&#xff09;概念 阿里云容器服务Kubernetes版&#xff08;Alibaba Cloud…

react-virtualized可视化区域渲染的使用

介绍 github地址&#xff1a;https://github.com/bvaughn/react-virtualized 实例网址&#xff1a;react-virtualized如果体积太大&#xff0c;可以参考用react-window。 使用 安装&#xff1a; yarn add react-virtualized。在项目入口文件index.js中导入样式文件&#xff…

进阶:Docker容器管理工具——Docker-Compose使用

文章目录 前言Compose大杀器编排服务 1、docker-compose安装curl方式安装增加可执行权限查看版本 2、Docker-compose.yaml命令3、 docker-compose实战4、Docker网络路由docker的跨主机网络路由**问题由来**:方案两台机分别配置路由表ip_forward配置 总结 前言 容器的管理工具&…