如何TCP多路侦听

如何TCP多路侦听,第1张

基本原理:当一个节点要发送数据时,首先监听信道;如果信道空闲就发送数据,并继续监听;如果在数据发送过程中监听到了冲突,则立刻停止数据发送,等待一段随机的时间后,重新开始尝试发缓闭送数据。(1)侦听:

通过专门的检测机构,在站点准备发送前先侦听一下总线上是否有数据正在传送(线路是否忙)?

若“忙”则进入后述的“退避”处理程序,进而进一步反复进行侦听工作。

若“闲”,则一定算法原则(“X坚持”算法)决定如何发送。

(2)发送:

当确定要发送后,通过发送机构,向总线发送数据。

(3)检测:

数据发送后,也可能发生数据碰撞。因此,要对数据边发送,边接收,以判断是否冲突了。(参5P127图)

(4)冲突处理:

当确认发生冲突扰态裂后,进入冲突处理程序。有两种冲突情况:

a 侦听中发现线路忙

b 发送过程中发现数据碰撞

c 若在侦听中发现线闭岩路忙,则等待一个延时后再次侦听,若仍然忙,则继续延迟等待,一直到可以发送为止。每次延时的时间不一致,由退避算法确定延时值。

d 若发送过程中发现数据碰撞,先发送阻塞信息,强化冲突,再进行侦听工作,以待下次重新发送(方法同a)

32位的Windows系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量达到2000左右时,2000*1024K=2G(大约),内存资源就相当于耗尽(而不管你的物理内存是否实际上耗尽)。

当然,我们也可以通过减少线程栈空间的方式来减少线程消耗,不过这依然不能从根本上解决问题;

从程序的角度来看,“每建立一个TCP连接时启动一个线程去处理一些业务”,这种方法是不完全可取的,这将带来非常穗冲余严重的资源消耗,大量的线程建立后处于等待状态判镇,事实上无法运行,并不能带来效率的提高。

对于你的问题,如果你的连接建立后持续的时间比较短,建议你使用线程池,虽然线程池的线程数量依然受此数字的限制,不过可以帮助减少建立和销毁线程、以及部分无用等待线程的消耗;

如猜滚果大量的连接都需要长时间的通信,可以使用非阻塞及异步I/O。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12229413.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存