【网络编程实践】2.3.5.4 IO复用配合阻塞IO使用,可能会阻塞整个程序

本文通过实例分析了chargen服务与不同nc实现之间的交互,揭示了在网络通信中,当服务端不读取数据时,客户端可能会因缓冲区满而阻塞在write操作上。对比了系统nc、python实现nc以及多线程nc的情况,指出阻塞IO在未配合IO复用时可能影响其他IO事件的处理。
摘要由CSDN通过智能技术生成

下面进行一个测试:

  • server:chargen.cc,,只发数据不收数据
  • client: nc, nc < /dev/zero

chargen 程序只发送数据而不读取,如果使用 nc 时有标准输入,即 nc 会向 chargen 发送数据,将最终导致 chargen 的接收缓冲区被填满,而 nc 无法再发送数据。

因此,nc 的实现方式就显得尤为重要了。如果 nc 这边是网络读写没有分离开,那么由于对端缓冲区满将会导致本端写动作阻塞,进而阻塞整个程序。

示例一:使用系统 nc 与 chargen 测试。可以看到,nc 单向接收时,吞吐量可以达到 1300MiB/s ,而 nc 端有输入时,引起了阻塞。
在这里插入图片描述
使用 strace 调试一下程序,发现 nc 阻塞在write上
在这里插入图片描述
查看连接上的缓冲区可以发现,由于 chargen 没有读数据,它的输入缓冲区被填满了,导致 nc 阻塞在 write 上,同时由于 write 的阻塞,nc 也不会再读取输入缓冲区的数据。
在这里插入图片描述

示例二:使用python实现的 nc 与 chargen 测试。同样的,当 nc 有输入的时候,整个程序就会阻塞。
在这里插入图片描述

示例三:使用多线程实现的 nc 与 chargen 测试。可以看到这次即使 nc 有数据输入,程序依然正常运行。
在这里插入图片描述
因此,阻塞IO 如果和 IO复用 配合使用,一旦发生阻塞就会影响到同一事件循环下的其他IO事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫RT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值