io_uring介绍(4)library使用与高级特性

​对 https://kernel.dk/io_uring.pdf  的翻译:

内核异步IO  io_uring 介绍的第7章,第8章 ——library使用与高级特性

目录

7.0 liburing library

8.0 高级用例和特性

8.1 预注册文件集和缓冲区

8.2 轮询io

8.3 内核侧轮询


7.0 liburing library

初始化:io_uring_queue_init 包含了所有 setup SQ and CQ ring信息的逻辑;

struct io_uring ring;
io_uring_queue_init(ENTRIES, &ring, 0);

一旦执行完 ,要调用:

io_uring_queue_exit(&ring);

基本提交场景

提交一个请求然后等待他完成,使用 liburing 就是下边这个样子

struct io_uring_sqe sqe;
struct io_uring_sqe cqe;

// sqe并填充 READV operation
sqe = io_uring_get_sqe(&ring);
io_uring_prep_readv(sqe, fd, &iovec, 1, offset);

// 告知kernel 我们有一个请求已经准备好被消费
io_uring_submit(&ri
`io_uring_prep_writev`是Linux内核提供的异步I/O(Asynchronous I/O)框架io_uring中的一个系统调用准备函数。它用于在用户空间通过环形队列(Ring Buffer,简称ringbuf)发起一次或多次writev操作,而无需直接阻塞进程。这个接口允许一次性提交多个缓冲区到一个套接字,提高了并发性能。 以下是`io_uring_prep_writev`的基本使用方法: 1. **初始化**: 首先,需要创建一个`io_uring`结构体,以及一个对应的控制环形队列。 2. **分配描述符**: 使用`io_uring_queue_init`分配描述符,这是提交请求的基础。 3. **填充描述符**: 对于每个写入操作,创建一个`io_uring_cqe`描述符,并使用`io_uring_prep_writev`进行准备: - `cqe->flags`:标志位,比如设置`IOURING_F_DONTCOPY`表示数据不需要复制到内核空间。 - `cqe->u64.flags`:可能包含其他选项,如`IOURING_COPY_USER`用于数据复制等。 - `cqe->u.writev.buf`:指向`iovec`数组,存储了要写入的数据。 - `cqe->u.writev.len`:数组元素的数量。 4. **提交任务**: 将描述符添加到`io_uring`的队列中,通常使用`io_uring_submit`函数。 5. **等待完成**: 当所有操作完成后,可以调用`io_uring_get_event()`检查是否有已完成的任务,然后使用`io_uring_cqe_seen`、`io_uring_cqe_status`获取结果。 ```cpp struct iovec iov[] = { ... }; // 数据缓冲区 int ret; ret = io_uring_queue_entry(ring, cqe, IOURING_CMD_WRITEV, sizeof(iov), (uintptr_t)iov); if (ret < 0) // 处理错误 ret = io_uring_submit(ring); // 提交队列 while (io_uring_wait_cqe(ring, &cqe, -1 /* 没有特定超时 */)) { if (cqe->res == 0) // 操作成功 else { int status = cqe->res; // 处理错误 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值