为什么 io_uring 对提交队列有一个间接层?

为什么 io_uring 对提交队列有一个间接层?

来自关于 io_uring 的论文,提交环包含提交数组的索引,其中存储提交事件本身。文档对该间接层的解释如下:

一个重要的区别是,虽然 CQ 环直接索引 cqes 的共享数组,但提交方在它们之间有一个间接数组。因此,提交端环形缓冲区是该数组的索引,该数组又包含 sqes 的索引。乍一看,这可能看起来很奇怪和令人困惑,但背后有一些原因。某些应用程序可能会将请求单元嵌入内部数据结构中,这使它们能够灵活地执行此操作,同时保留在一次操作中提交多个 sqes 的能力。这反过来又允许更轻松地将所述应用程序转换为 io_uring 接口。

但是我不明白“应用程序可以在内部数据结构中嵌入请求单元”的含义,也没有理解间接层因此而实现的功能的直觉。

有人可以换句话解释一下这一层间接的好处是什么吗?

答案1

我联系了该论文的作者并得到了一些澄清。

存在间接层的原因是因为某些应用程序可能希望将提交事件数据保存在其应用程序特定的数据结构中。通过让数组保存事件,应用程序可以有效地获得该数组中槽的长期所有权,并从应用程序本身引用它。随着时间的推移填充它。当准备好提交IO时,它可以将事件的索引放入环中。

然而,如果数组不存在,而是环保存事件,则必须在 IO 提交期间将事件从应用程序的结构复制到环,因为环是按事件插入时间排序的,因此应用程序无法提前“保留”一个插槽供其使用。这是一系列可以通过数组避免的额外复制。

相关内容