在原始的
基于此,我有以下问题:
vmsplice()
实现中,建议如果你有一个用户空间缓冲区,其大小是管道中可容纳页面数量的两倍,则对缓冲区的后半部分成功执行vmsplice()将确保内核完成使用缓冲区的前半部分。但事实并非如此,特别是对于TCP,内核页面将一直保留,直到从另一侧收到ACK。修复这个问题留作未来的工作,因此对于TCP,内核仍然必须从管道中复制页面。
vmsplice()
具有SPLICE_F_GIFT
选项,可以解决这个问题,但问题在于这会暴露出另外两个问题——如何高效地从内核获取新页面以及如何减少缓存崩溃。第一个问题是mmap需要内核清除页面,第二个问题是虽然mmap可能使用内核中的fancy kscrubd功能,但这会增加进程的工作集(缓存崩溃)。基于此,我有以下问题:
- 关于页面的安全重用,目前通知用户空间的状态如何?我特别关心在套接字(TCP)上 splice() 的页面。在过去的五年里有什么变化吗?
mmap
/vmsplice
/splice
/munmap
是在 TCP 服务器中进行零拷贝的最佳实践,还是我们今天有更好的选择?