【问题标题】:Single buffer; multiple sockets; single syscall under Linux单缓冲区;多个插座; Linux下的单一系统调用
【发布时间】:2015-11-17 12:09:11
【问题描述】:

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

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

一个限制是必须支持 TCP 套接字(不在我的控制之下)

【问题讨论】:

    标签: linux performance sockets io kernel


    【解决方案1】:

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

    无论哪种方式,在 linux 中您都可以实现这种 mwrite(或 msend)系统调用,因为您有源代码。但我担心你只会头疼。这种实现的唯一方法是某种转移时复制方法,但我认为您不会获得任何优势。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      相关资源
      最近更新 更多