繁体   English   中英

io_uring: io_uring_wait_cqe_nr, io_uring_peek_batch_cqe

[英]io_uring: io_uring_wait_cqe_nr, io_uring_peek_batch_cqe

我想在github项目上试验io_uring: https ://github.com/alexhultman/io_uring_epoll_benchmark

参考: https ://unixism.net/loti/ref-liburing/completion.html

但是我偶然发现了两个功能:

  1. 无符号 io_uring_peek_batch_cqe(结构 io_uring *ring,结构 io_uring_cqe **cqes,无符号计数)

  2. int io_uring_wait_cqe_nr(结构 io_uring *ring,结构 io_uring_cqe **cqe_ptr,无符号 wait_nr)

我知道第一个函数将填充一个 I/O 完成数组,直到 cqes 计数,并且无论有多少 cqes 完成都会返回

然而,即使我等待 wait_nr 完成,第二个函数也只向 cqes 填充一个 I/O 完成,为什么会这样,如果它等待特定数量的 cqes 完成,为什么我没有填写 I/O 数组像第一个功能一样吗?

比如我创建的例子:#define MAX_BATCH 2000

结构 io_uring_cqe **cqes = malloc(sizeof(struct io_uring_cqe *) * MAX_BATCH);

如果我在第一个函数上运行,我可以访问 cqes[i] i = (0 to completions)

如果我在第二个函数上运行,我只能访问 cqes[i] i = 0

我需要了解为什么第二个函数永远不会像第一个函数那样更新 cqes 数组

我已经解决了,作为第二个功能:

int io_uring_wait_cqe_nr(结构 io_uring *ring,结构 io_uring_cqe **cqe_ptr,无符号 wait_nr)

将等到 wait_nr 完成 cqe 完成后再继续,它将返回 cqe I/O 完成并仅更新 cqes 的第一个数组,即 cqes[0],

但是对于第一个功能:

无符号 io_uring_peek_batch_cqe(结构 io_uring *ring,结构 io_uring_cqe **cqes,无符号计数)

无论是否有 cqe 都将返回,并将返回 cqes 的数量和 cqes I/O 的数组

在检查 cqes 的 struct 是否正确完成异步后,用函数标记它:

void io_uring_cq_advance(struct io_uring *ring, struct io_uring_cqe *cqe, unsigned count) 释放 cqes 条目,以便下一个 cqes 指向 cqes[0]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM