C#TCP通信时,当我建立一个端口监听时,每建立一个TCP连接时启动一个线程去处理一些业务。
我以上面这种形式来写一个服务程序,如果用户连接量在万级,这样的系统开销大吗?如果一直运行,会导致内存和CPU耗尽吗?...
我以上面这种形式来写一个服务程序,如果用户连接量在万级,这样的系统开销大吗?如果一直运行,会导致内存和CPU耗尽吗?
展开
1个回答
展开全部
32位的Windows系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量达到2000左右时,2000*1024K=2G(大约),内存资源就相当于耗尽(而不管你的物理内存是否实际上耗尽)。
当然,我们也可以通过减少线程栈空间的方式来减少线程消耗,不过这依然不能从根本上解决问题;
从程序的角度来看,“每建立一个TCP连接时启动一个线程去处理一些业务”,这种方法是不完全可取的,这将带来非常严重的资源消耗,大量的线程建立后处于等待状态,事实上无法运行,并不能带来效率的提高。
对于你的问题,如果你的连接建立后持续的时间比较短,建议你使用线程池,虽然线程池的线程数量依然受此数字的限制,不过可以帮助减少建立和销毁线程、以及部分无用等待线程的消耗;
如果大量的连接都需要长时间的通信,可以使用非阻塞及异步I/O。
当然,我们也可以通过减少线程栈空间的方式来减少线程消耗,不过这依然不能从根本上解决问题;
从程序的角度来看,“每建立一个TCP连接时启动一个线程去处理一些业务”,这种方法是不完全可取的,这将带来非常严重的资源消耗,大量的线程建立后处于等待状态,事实上无法运行,并不能带来效率的提高。
对于你的问题,如果你的连接建立后持续的时间比较短,建议你使用线程池,虽然线程池的线程数量依然受此数字的限制,不过可以帮助减少建立和销毁线程、以及部分无用等待线程的消耗;
如果大量的连接都需要长时间的通信,可以使用非阻塞及异步I/O。
追问
我第一次写通信方面的程序,有许多地方不懂,请问下阻塞模式和非阻塞模式分别用于哪些情况下呢?
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询