2

如何正确创建写缓冲区?目前,我正在使用已分配缓冲区的链接列表,但大多数写入只有几个字节。您对创建高效的写缓冲区有什么建议?

4

1 回答 1

3

链表可能不是这里的最佳选择。它的遍历不是缓存友好的,因此很昂贵。

您可以使用环形缓冲区 [1],一些消费者会将原始字节放入其中,一些生产者稍后将获取整个可用内容并在一个系统调用中发送。

如果不希望写入连续的内存区域(例如,您不能以零拷贝方式进行),您可以将引用您的内存的 struct iovec 放入环形缓冲区。然后,消费者将获取所有 iovec 并将它们传递给 writev [2]。

说到生产者和消费者,它们可能是操作系统级别的线程,您必须在缓冲区周围同步它们,或者它们可能是纤程 [3]。如果您正在执行事件驱动的应用程序,则后者更可取。我有一个专门用于 libev 的纤维实现 [4],您可以查看。它还包括高效的虚拟环形缓冲区实现。

参考:

  1. http://en.wikipedia.org/wiki/Circular_buffer
  2. http://man7.org/linux/man-pages/man2/readv.2.html
  3. http://en.wikipedia.org/wiki/Fiber_(computer_science)
  4. https://github.com/Lupus/libevfibers
于 2014-03-27T20:41:06.390 回答