linux内核的一个实现:
socket sendmsg MSG_ZEROCOPY [LWN.net]https://lwn.net/Articles/726353/
对于用户编程来说,需要做一些改动,即调用了send操作后,会很快返回,但是其sendbuf不能立即释放,需要等待通知后,才能释放。
要实现零拷贝,那么sendbuf需要在实际发出去之后,才能释放,这会有很大延迟,尤其是tcp这种需要等待确认,且有可能重传的情况。但如果send操作一直阻塞住,会很大程度影响用户发送数据的吞吐量。
在send数据小的情况下,零拷贝其实会有很大的内核开销:
“on modern CPUs, mapping one page has even higher cost than copying it, because of kernel crossing and TLB flush costs”
16KB的数据,才值得去做零拷贝:
“To amortize page remapping cost, we only use zero copy for send or recv with at least 16 KiB payload size. Smaller messages are copied instead.”