单缓冲区;多个插座; Linux 下的单个系统调用

Single buffer; multiple sockets; single syscall under Linux

Linux 是否有任何本机内核工具可以将提供的缓冲区发送()到一组套接字?一种向量化 I/O,除了套接字句柄而不是缓冲区。

objective 是为了减少在某些情况下涉及的 u/k 转换的数量,例如,您需要向 n 个客户端广播一些状态更新,这需要遍历每个套接字并发送.

一个限制是必须支持TCP套接字(不受我控制)

答案是否定的,linux 和 posix 系统都没有您想要的电话。我担心你没有得到任何好处,因为每个数据流都将遵循不同的路径,这使得在内核中复制缓冲区比在用户 space 中复制缓冲区。不在用户到内核中制作副本并不一定意味着在内核模式下制作更好。

无论哪种方式,在 linux 中您都可以实现这种 mwrite(或 msend)系统调用,因为您拥有源代码。但恐怕你除了头痛之外什么也得不到。此实现的唯一方法是某种转移时复制方法,但我认为您不会获得任何优势。

最后,一旦您完成了第一个 write(2) 调用,下一次必须再次交换用户缓冲区的可能性就太低了,使得缓冲区的第二个和下一个副本的开销非常低,因为页面都在核心内存中。您需要一个负载非常高的系统才能在系统调用之间换出用户缓冲区。