
通过专门的检测机构,在站点准备发送前先侦听一下总线上是否有数据正在传送(线路是否忙)?
若“忙”则进入后述的“退避”处理程序,进而进一步反复进行侦听工作。
若“闲”,则一定算法原则(“X坚持”算法)决定如何发送。
(2)发送:
当确定要发送后,通过发送机构,向总线发送数据。
(3)检测:
数据发送后,也可能发生数据碰撞。因此,要对数据边发送,边接收,以判断是否冲突了。(参5P127图)
(4)冲突处理:
当确认发生冲突扰态裂后,进入冲突处理程序。有两种冲突情况:
a 侦听中发现线路忙
b 发送过程中发现数据碰撞
c 若在侦听中发现线闭岩路忙,则等待一个延时后再次侦听,若仍然忙,则继续延迟等待,一直到可以发送为止。每次延时的时间不一致,由退避算法确定延时值。
d 若发送过程中发现数据碰撞,先发送阻塞信息,强化冲突,再进行侦听工作,以待下次重新发送(方法同a)
32位的Windows系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量达到2000左右时,2000*1024K=2G(大约),内存资源就相当于耗尽(而不管你的物理内存是否实际上耗尽)。当然,我们也可以通过减少线程栈空间的方式来减少线程消耗,不过这依然不能从根本上解决问题;
从程序的角度来看,“每建立一个TCP连接时启动一个线程去处理一些业务”,这种方法是不完全可取的,这将带来非常穗冲余严重的资源消耗,大量的线程建立后处于等待状态判镇,事实上无法运行,并不能带来效率的提高。
对于你的问题,如果你的连接建立后持续的时间比较短,建议你使用线程池,虽然线程池的线程数量依然受此数字的限制,不过可以帮助减少建立和销毁线程、以及部分无用等待线程的消耗;
如猜滚果大量的连接都需要长时间的通信,可以使用非阻塞及异步I/O。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)