其他操作系统是不是实现了Linux系统调用splice?

Posted

技术标签:

【中文标题】其他操作系统是不是实现了Linux系统调用splice?【英文标题】:Do other operating systems implement the Linux system call splice?其他操作系统是否实现了Linux系统调用splice? 【发布时间】:2012-08-27 03:43:39 【问题描述】:

在我正在开发的应用程序中,我在 Linux 上使用 splice 进行套接字到套接字的数据传输。

    其他操作系统(至少是 Windows、OS X 和 FreeBSD)是否实现 splice 或等效解决方案? 是否可以在 Windows 上使用 sendfile¹ + memmap¹ 模拟套接字到套接字的数据 spliceing?

¹ 两者都以不同的名称存在于 Windows 上,我不记得了。


更新

您可以看到splice 与 Linux 上的用户空间缓冲区相比的性能改进。

DF, DR, F, MF, MR 是我在不同隧道模式下的应用程序,NXnginx Web 服务器 -p+t 使用 Linux 系统调用 splice +p-t 使用带有用户空间缓冲区的可移植实现 +p+t 使用带有用户空间缓冲区和多个操作系统线程的可移植实现 条形代表每秒千兆字节秒的吞吐量 一个 1 GB(1048576000 字节)的文件被 4 个并发客户端请求了 4 次

【问题讨论】:

对此我有一些想法。但在我回答之前,让我问一下,“你真正想做什么?”您是否试图将数据流或数据包从一个套接字回显到另一个套接字?发送前是否需要检查数据? 仅回声回声。我正在开发一个名为PortFusion 的简单隧道解决方案,它不需要检查数据流(但如果需要,我可以切换到将数据带到用户空间的便携式实现)。 @selbie 我刚刚添加了一个图表来说明为什么我对其他操作系统中的splice-equivalents 感兴趣。 【参考方案1】:

TransmitFile 想到了 winsock 中从一个文件句柄流式传输到套接字的一种方式,但我不确定这是否会对您有所帮助,因为它用于从文件-> 磁盘流式传输。您也许可以将它与 memory mapped file 句柄一起使用。

过去我听一些人说“内核模式”是加速某些回显和简单服务器操作的方法,但我从来没有这样做过。

内核模式winsock的一些链接:

http://blogs.msdn.com/b/wndp/archive/2006/02/24/introduction-to-winsock-kernel-wsk.aspx

http://msdn.microsoft.com/en-us/library/windows/hardware/ff571084(v=vs.85).aspx

【讨论】:

TransmitFile 对我来说似乎相当 File -> Socket :) 我完全愿意尝试内存映射文件,但是直接从套接字接收数据到内存映射文件而不在用户空间中接触它的部分是缺少,Socket -> File 类型的零拷贝函数。【参考方案2】:

OpenBSD 有sosplicesomove:http://www.openbsd.org/cgi-bin/man.cgi?query=sosplice

【讨论】:

以上是关于其他操作系统是不是实现了Linux系统调用splice?的主要内容,如果未能解决你的问题,请参考以下文章

Linux(内核剖析):13---系统调用的实现与解析

linux0.11源码内核——系统调用,int80的实现细节

Linux内核设计与实现 第五章

《Linux内核设计与实现》Chapter 5 读书笔记

《Linux设计与实现》笔记——系统调用工作原理添加系统调用的过程

《Linux内核分析与实现》 第四周 读书笔记