struct iov_iter的目的是什么?在Linux内核中使用此结构,而不是struct iovec。关于iter接口,没有任何好的文档。我在LWN上找到了一份文档,但我无法理解。任何人都可以帮助我了解Linux内核中使用的iter接口吗? 最佳答案 LWN article预先声明的iovec的目的之一是处理多个块中的数据。如果您有许多离散的缓冲区,并与指针链接在一起,并且想一次性读取/写入它们,则可以简单地用几个读取/写入操作替换它,但是在某些情况下,语义与读取/写入边界相关联-因此在不改变含义的情况下不能简单地拆分操作。另一种选择是将所有数据复制进出连续缓冲区,这很浪费,我们希望不惜一切代价避免。使用POSIX readv / writev或我们的示例iov_iter API,可以减少系统调用的次数,从而减少开销。尽管在内核中这并不能转化为上下文切换之类的昂贵操作,但仍然是个小问题。当驱动程序无法知道在不久的将来还会出现更多驱动程序时,它们可能比许多较小的数据块更有效地处理更大的数据块-对于网络驱动程序尤其如此,尽管我不知道在那里使用atm。相同情况的另一个实例是对原始磁盘的I / O设备,仅允许I / O开始和结束块边界。用户有时可能希望执行随机访问或在块的开始处覆盖一小部分缓冲区,并且/或者将其余部分归零。iov_iter旨在解决这类情况。您可以构造一个iovec,使您可以在多个离散缓冲区中进行整个块操作,该缓冲区甚至可能包括一个“暂存”缓冲区,用于转储读取的块的各个部分,而不必关心它们的处理,以及预先清零的缓冲区,用于在iovec的末尾链接以将块的其余部分清零。同样,我应该指出,您可以使用具有关联的复制和/或归零功能的连续缓冲区,但是writev API提供了一种具有更少开销的替代抽象,并且在读取代码时可能更容易推理。在矢量处理或并行计算中用于此类操作的术语是“分散/聚集处理”。
08-26 17:23