5

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

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

谢谢

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

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

注意目前,我splice在 Linux/Android、copyfileBSD/Mac OS X、CopyFileWindows 下使用,并回退到read/write用于文件范围。

4

1 回答 1

5

在 BSDssendfile()中扮演这个角色,只要目标文件描述符是一个套接字。

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

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

于 2012-04-26T08:55:16.967 回答