如何正确创建写缓冲区?目前,我正在使用已分配缓冲区的链接列表,但大多数写入只有几个字节。您对创建高效的写缓冲区有什么建议?
问问题
454 次
1 回答
3
链表可能不是这里的最佳选择。它的遍历不是缓存友好的,因此很昂贵。
您可以使用环形缓冲区 [1],一些消费者会将原始字节放入其中,一些生产者稍后将获取整个可用内容并在一个系统调用中发送。
如果不希望写入连续的内存区域(例如,您不能以零拷贝方式进行),您可以将引用您的内存的 struct iovec 放入环形缓冲区。然后,消费者将获取所有 iovec 并将它们传递给 writev [2]。
说到生产者和消费者,它们可能是操作系统级别的线程,您必须在缓冲区周围同步它们,或者它们可能是纤程 [3]。如果您正在执行事件驱动的应用程序,则后者更可取。我有一个专门用于 libev 的纤维实现 [4],您可以查看。它还包括高效的虚拟环形缓冲区实现。
参考:
于 2014-03-27T20:41:06.390 回答