使用`splice` for Linux ...其他系统还有什么?

时间:2012-04-26 08:10:30

标签: c windows macos operating-system bsd

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

现在,我有兴趣为其他系统找到类似的东西,特别是Windows和BSD / MacOS X(我愿意在不太可能的情况下使用无法访问的API获取一些用Obj-C编写的代码来自原始C)。

由于

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

注意我正在开发兼容性能的代码,应该可以在各种大容量存储设备上运行(例如从Android智能手机到NFS挂载)。当然,我愿意为不同的操作系统编写不同的实现。

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

1 个答案:

答案 0 :(得分:5)

在BSD中sendfile()填充此角色,只要目标文件描述符是套接字。

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

几乎无处不在,read()/write()组合效果很好,速度非常快。零拷贝很酷,但是使用页面大小的缓冲区~4096,你会非常接近相同的速度,但每个人都能理解代码。