io_uring笔记

这篇具有很好参考价值的文章主要介绍了io_uring笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

io_uring 异步

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

方式 磁盘iops
io_uring 11.6k
libaio 10.7k
psync 5k
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笔记,C++开发后端基础知识,笔记
猜测运行机制:
io_uring笔记,C++开发后端基础知识,笔记
io _uring. _setup();
做两件事
1)注册两个队列
2)使用mmap映射内核的队列和用户态的队列:
io_uring笔记,C++开发后端基础知识,笔记
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		4096



enum {

	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;
// listenfd
    struct 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的效果

io_uring笔记,C++开发后端基础知识,笔记
io_uring笔记,C++开发后端基础知识,笔记
都采用echo_websever:
epoll: 60w
io_uring: 65w

io_uring效果好在哪?

epoll是把io放入了红黑树
io_uring共享内存:存储空间、修改变量文章来源地址https://www.toymoban.com/news/detail-636548.html

到了这里,关于io_uring笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Flask后端开发(一)-基础知识和前期准备

    目录 1.背景介绍 1.1. 项目背景 1.2. 项目难点 1.3. 项目环境 2. flask后端开发实现的功能 3. flask部署和前后端对接 3.1. flask运行配置和服务器部署 3.2. flask前后端传参 4. 后端测试工具 4.1. 工具介绍 4.2. 工具使用 后记 就是前几个月临时接手了一个后端项目,使用python flask框架进行后

    2024年02月08日
    浏览(11)
  • JAVA后端开发面试基础知识(一)——JVM

    Class loader(类装载) 根据给定的全限定名类名(如: java.lang.Object)来装载class文件到 Runtime data area中的method area。 Execution engine(执行引擎) 执行classes中的指令。 Native Interface(本地接口) 与native libraries交互,是其它编程语言交互的接口。 Runtime data area(运行时数据区域) 这就是我们常说

    2024年03月10日
    浏览(13)
  • JAVA后端开发面试基础知识(八)——Spring

    JAVA后端开发面试基础知识(八)——Spring

    Spring是一个轻量级Java开发框架 我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说 Spring 支持 IoC(Inverse of Control:控制反转) 和 AOP(Aspect-Oriented Programming:面向切面编程)、可以很方便地对数据库进行访问、

    2024年03月10日
    浏览(10)
  • web开发学习笔记(10.postman请求响应,后端接口基础知识)

    web开发学习笔记(10.postman请求响应,后端接口基础知识)

    1.springboot使用get请求接受简单参数 上述写法不去别get或者post请求 2.postman各种提交方式的区别 1、form-data:                     就是http请求中的 multipart/form-data ,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传

    2024年01月20日
    浏览(13)
  • Nodejs后端架构基础知识和案例展示

    Nodejs后端架构基础知识和案例展示

    入门笔记,大神请绕路!!! 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。 优点: 1.高并发 (高并发的

    2023年04月11日
    浏览(9)
  • 后端必会的前端vue基础知识

    build ------前端工程webpack构建设置 config ------ 前端工程构建参数设置(index.js 打包) src ---- 项目代码         api ---- 服务端口请求         assets ---- 项目静态文件、图片         coponents ---- 项目自定义组件         mock ----- 模拟数据         router ----- 项目路由配置      

    2024年01月20日
    浏览(11)
  • Unity2D RPG开发笔记 P1 - Unity界面基础操作和知识

    Unity2D RPG开发笔记 P1 - Unity界面基础操作和知识

    按下 QWERTY 可以选择不同的工具进行 旋转、定位、缩放 按下 Ctrl + D 可以复制物体 16:9 为最常见的分辨率 Transform 组件 物体在空间中的位置、缩放、旋转 点击这里可以进行 reset 操作,位置将会被重置 不知道算不算冷知识的冷知识:鼠标拖动这里可以移动该数值 Sprite Renderer

    2024年02月13日
    浏览(8)
  • IO + File 详细基础知识

    IO + File 详细基础知识

    全面解析Java-IO流 File: 表示系统中的文件或者文件夹的路径。 利用File我们可以获取文件信息(大小,文件名,修改时间)、判断文件的类型、创建文件/文件夹、删除文件/文件夹等 File类只能对文件本身进行操作,不能读写文件里面存储的数据。 存储和读取数据的解决方案

    2024年02月04日
    浏览(12)
  • iOS设备和蓝牙模块连接基础知识

    iOS设备和蓝牙模块连接基础知识

    iOS设备和蓝牙模块连接基础知识 一:iOS连接外设的几种方式 如图下面几种方式: CoreBluetooth和ExternalAccessory,两个框架,基本上是蓝牙设备与iOS设备连接的方式 有图可知,EAP要MFi认证,要求设备的设计理念符合苹果的要求,不仅可以进行无线蓝牙通信,还可以进行有线通信(

    2023年04月20日
    浏览(16)
  • Java-IO流基础知识

    Java-IO流基础知识

    目录 1.File类与路径知识 1.File类 2.Java中的路径知识 3.创建File类的实例 4.File类的方法使用 5.File类使用的注意点 2.IO流知识 1.IO流原理 2.文件的读入 3.read()的重载方法:难点 4.文件的写出 1.写出的说明 2.写出操作的具体步骤 5.文件的复制:先读出在写入 6.字节流FileInputStream和Fi

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包