[英]Why the Linux command cp is not zero-copy?
我使用 strace 來跟蹤命令cp a.txt b.txt
。
它表明它使用讀寫系統調用復制了文件。
但是有一些零拷貝系統調用,如 sendfile、splice。 雖然 splice 不支持文件到文件的數據復制。
為什么命令 cp 不使用那些系統調用(所以我們不必將數據復制到用戶空間)?
您回答了自己的問題: sendfile()
不支持文件到文件的操作。
為什么 Linux kernel 不提供一個系統調用來執行零拷貝的文件到文件數據拷貝?
可能是因為沒有人有一個用例可以將性能提高這么多或以一種沒有糟糕權衡的方式。 您真正能做的就是讓一個系統調用將 DMA 從磁盤安排到 RAM 以及從 RAM 到磁盤,而不是像現在這樣安排兩個系統調用。 If this reduction is syscalls matters to you, look at io_uring: https://vorner.github.io/2019/11/03/io-uring-mental-experiments.html (a very new feature, so you can't expect看到它在cp
中使用過)。
非常關心文件復制性能的人通常使用寫時復制來避免首先進行復制,和/或將他們的文件分成多個部分,因此他們只需要復制或修改一個部分而不是一個巨大的文件。
https://man7.org/linux/man-pages/man2/sendfile.2.html
在 2.6.33 之前的 Linux 內核中,out_fd 必須引用套接字。 由於 Linux 2.6.33 它可以是任何文件。 如果它是一個常規文件,那么 sendfile() 會適當地更改文件偏移量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.