@
codehz 1.这不是 Unix socket 传统模型。在超算上我还用过类似的 mpi send/recv,也是发送接收完成之前不能使用 buffer 。还比你说的这个多个 recv 的能力。
但这不是标准的 bsd socket 。
2. 说白了就是让应用层来分配和维护 buffer
使用 splice,效果如下
A 有 user space 的数据 X0
写到 pipe 里,拷贝一次得 X1
B 从 pipe buffer splice 到 socket buffer
内核处理完 TCP 发送后释放
拷贝次数和 A 直接 send 一样
使用 shm,效果如下
A 处理数据的时候直接放到 shm 里
B 调用 send,从 shm 拷贝到 socket buffer
结果还是一次拷贝,但好处是 B 可以看到数据而且能进行一定的操作。splice 则必须直通
使用你说的 zero copy send,效果如下
A 有要发送的数据 X0
zero copy send,没有拷贝到 send buffer
B 从 socket 里接收,一次拷贝 X1
B 再 zero copy send,没有拷贝
总的来看拷贝次数也是一样,但是缺点是 A 和 B 都必须有一套逻辑来维护发送未完成的 buffer
A 这边比较简单,因为 B 大概率立刻接收。其实加起来和 shm 也差不多。但是 B 这边是出网络,情况就复杂得多。而维护 buffer 的逻辑内核里早就有了,何必重新发明轮子?
把 shm 和 zero copy send 结合,确实可以做到 zero copy 。缺点就是跨进程协调 buffer 的释放会非常非常蛋疼。
考虑到各种开销,实际哪个好还真未必