在 Linux 上使用 `splice`... 其他系统还有啥?

Posted

技术标签:

【中文标题】在 Linux 上使用 `splice`... 其他系统还有啥?【英文标题】:Using `splice` for Linux... what else for other systems?在 Linux 上使用 `splice`... 其他系统还有什么? 【发布时间】:2012-05-06 22:54:43 【问题描述】:

在最近的 Linux 内核中,将文件或文件子集复制到另一个文件的最快方法是使用非常好的 splice 系统调用。该系统让内核(几乎)直接管理传输,而无需将数据复制到用户级内存。

现在,我有兴趣为其他系统找到类似的东西,特别是 Windows 和 BSD/MacOS X(我愿意获得一些用 Obj-C 编写的代码,以防万一存在无法访问的 API来自原始 C)。

谢谢

注意我假设 Windows 下最快的完整文件副本是CopyFile。但是只复制一个文件的范围呢?

注意我正在编写对性能敏感的代码,并且应该适用于各种大容量存储设备(即从 android 智能手机到 NFS 安装)。当然,我愿意为不同的操作系统编写不同的实现。

注意 目前我在Linux/Android下使用splice,在BSD/Mac OS X下使用copyfile,在Windows下使用CopyFile,回退到read/@987654327 @ 用于文件中的范围。

【问题讨论】:

【参考方案1】:

在 BSD 中 sendfile() 担任这个角色,只要目标文件描述符是一个套接字。

在所有 POSIX 操作系统中,memmap() 可用于实现此目的,方法是映射整个文件,然后在映射的数据上调用 write()。由于您在进程中从不访问此内存,因此它仍然可以具有零拷贝性能。

几乎在任何地方,read()/write() 组合都运行良好,而且速度非常快。零拷贝很酷,但是使用页面大小的缓冲区 ~4096,您将相当接近相同的速度,但代码每个人都可以理解。

【讨论】:

以上是关于在 Linux 上使用 `splice`... 其他系统还有啥?的主要内容,如果未能解决你的问题,请参考以下文章

linux网络编程九:splice函数,高效的零拷贝

JS中splice方法的使用

Linux网络编程——sendfile和splice零拷贝

js splice()方法

JavaScript splice() 方法

Vue JS:使用基于提供的索引的 splice() 方法删除数组中动态渲染的组件,不起作用