我使用strace跟踪命令cp a.txt b.txt
。
它显示它使用读写系统调用复制了该文件。
但也有一些零拷贝系统调用,比如sendfile、splice。尽管拼接不支持文件到文件的数据复制。
为什么命令cp不使用那些系统调用(这样我们就不必将数据复制到用户空间(?
您回答了自己的问题:sendfile()
不支持文件对文件操作。
为什么Linux内核不提供一个系统调用来执行零拷贝的文件到文件数据拷贝?
可能是因为没有一个用例可以将性能提高那么多,或者以一种没有糟糕权衡的方式提高性能。您真正能做的就是使用一个系统调用来安排从磁盘到RAM和从RAM到磁盘的DMA,而不是像现在这样使用两个系统调用。如果系统调用的减少对您来说很重要,请查看io_uring:https://vorner.github.io/2019/11/03/io-uring-mental-experiments.html(这是一个非常新的功能,所以您还不能期望在cp
中使用它(。
非常关心文件复制性能的人通常使用写时复制来避免首先进行复制,和/或将文件分解为多个部分,这样他们只需要复制或修改一个部分,而不需要修改一个巨大的文件。
https://man7.org/linux/man-pages/man2/sendfile.2.html
在2.6.33之前的Linux内核中,out_fd必须引用套接字。从Linux 2.6.33开始,它可以是任何文件。如果是常规文件,然后sendfile((适当地更改文件偏移量。