Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C LibEV如何正确缓冲?_C_Libev - Fatal编程技术网

C LibEV如何正确缓冲?

C LibEV如何正确缓冲?,c,libev,C,Libev,如何正确创建写入缓冲区?目前,我使用的是已分配缓冲区的链接列表,但大多数的by写入只有几个字节。您对创建高效写缓冲区有何建议?链表可能不是最佳选择。它的遍历不是缓存友好的,因此代价很高 您可以使用一个环形缓冲区[1],一些使用者将原始字节放入其中,而一些生产者稍后将获取整个可用内容并在一个系统调用中发送 如果不希望写入连续内存区域(例如,不能以零拷贝方式写入),可以将引用内存的struct iovec放入环形缓冲区。然后,消费者将获取所有iovec并将其传递给writev[2] 说到生产者和消费

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

链表可能不是最佳选择。它的遍历不是缓存友好的,因此代价很高

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

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

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

参考资料:


  • 谢谢,我最终还是用了“环形缓冲区”这个主意。