linux - 2个并行连接中socket write()的公平性?

标签 linux multithreading sockets io network-protocols

假设我有一个多线程程序,其中 2 个线程中的每一个:

  • 在默认(阻塞)模式下有自己的套接字socket_fd
  • 使用write(socket_fd, data, data_len) 反复发送数据,导致网络成为瓶颈
  • 传递给 write 的数据大小(即 data_len)总是等于 MSS;为简单起见,假设 data_len = 500

我想知道在假设单个网络接口(interface)卡的情况下写入的公平性,即:如果线程 2 调用写入的频率降低 9 倍,线程 2 发送的数据是否大致为 1/(1 + 9)合理时间内发送的总数据(即线程 2 最终将发送其数据,即使线程 1 通过不断发送过量数据使底层媒体非常忙碌) )?

我主要对线程 1(发送更多数据)使用 TCP 而线程 2 使用 DCCP 的情况感兴趣。尽管如此,也欢迎回答线程 2 使用 UDP 和 TCP 的场景。

最佳答案

这取决于 queuing discipline它在网络接口(interface)上调度传出数据包。默认 pfifo_fast, the default Linux qdisc将传出数据包组织到由 ToS 字段索引的 fifo 队列中。具有相同 ToS 的传出数据包按照内核从应用程序接收数据包的顺序发送。

关于linux - 2个并行连接中socket write()的公平性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20304610/

相关文章:

c++ - 通过 QTimer 和 QTcpSocket 正确使用 QThread 和 moveToThread

c++ - 用户运行时环境中的并行进程

c# - .NET 应用程序中用于协作工作的套接字、多线程

c# - 在 Linux Docker 中使用 .Net Standard 库运行 .Net Core 应用程序

c - 我应该将哪个文件作为 ftok() 的路径名参数传递

android - 所有线程完成后如何正确停止服务

PHP fork 进程接受连接

c++ - 当服务器速度慢时,写入客户端返回 EWOULDBLOCK

linux - Docker 容器立即退出

c - 如何利用Linux的虚拟串口让C程序与Python程序通信?