Linux中结构体iov_iter的用途是什么?

问题描述 投票:0回答:1

struct iov_iter 的用途是什么? Linux 内核中使用该结构代替 struct iovec。 iter 接口没有任何好的文档。我在 LWN 上找到了一份文档,但我无法理解。谁能帮我理解 Linux 内核中使用的 iter 接口吗?

linux linux-kernel linux-device-driver embedded-linux
1个回答
3
投票

iovec
LWN 文章前面所述)的一个目的是处理多个块中的数据。

如果您有许多用指针链接的离散缓冲区,并且想要一次性读/写它们,则可以通过多个读/写操作来实现。但是,在某些情况下,语义与读/写边界相关联,因此在不更改操作语义的情况下无法拆分操作(一个简单且假设的示例:涉及超过 1 次写入的原子操作)。另一种方法是将所有数据复制到连续缓冲区中或从连续缓冲区复制出,但这很浪费,您可能希望避免这种情况。

使用 POSIX

readv
/
writev
,或者在本例中使用
iov_iter
API,可以减少系统调用的数量,从而减少涉及的开销。虽然仅在内核代码的上下文中,这不会转化为像上下文切换这样昂贵的操作,但它仍然是一个问题。当驱动程序无法知道不久的将来是否会出现更多数据时,它们也可能比处理大量小数据块更有效地处理大数据块 - 对于网络驱动程序尤其如此,尽管我不知道
 iov_iter
此时正在那里使用。

相同情况的另一个实例是原始磁盘的 I/O 设备,只允许 I/O 开始和结束块 边界。用户有时可能想要执行随机访问或在块的开头覆盖一小部分缓冲区和/或将其余部分清零。 类似的场景正是

iovec
旨在解决的问题;您可以构造一个
iovec
,它使您能够执行分布在多个离散缓冲区上的整个块操作,其中甚至可能包括一个“临时”缓冲区,用于转储您读取的块的部分且不关心处理,以及预清零缓冲区,用于在
writev
末尾进行链接,以将块的其余部分清零。再次,我应该指出,您可以使用带有关联复制和/或归零的连续缓冲区,但是
iov_iter
API提供了另一种抽象,它涉及更少的开销,并且在阅读代码时可以说更容易推理。

矢量处理或并行计算中此类操作的术语是“分散/聚集处理”。

© www.soinside.com 2019 - 2024. All rights reserved.