Sockets阻塞和非阻塞疑问
来源:7-4 NIO重写服务器-1
慕函数7443966
2023-12-15
这里为什么要设置成非阻塞,它和阻塞读写的区别是杀
写回答
1回答
-
Qiujuer
2023-12-28
非阻塞与阻塞的最大区别在于你的线程的消耗;一般来说阻塞模型是最为简单的模型,对于链接数量不多的情况是非常建议使用这样的模型的。
倘若你是服务的环境,那么你面临链接成千上万个节点,如果全部使用阻塞模型,那么你得开启N*2的线程才能顺利的处理收发数据,一个收,一个发,两个可以同时进行,所以需要N*2。
相当于你现在点了10份外卖,来自10个商家,此时你需要有10个人来门口帮你等着这10个商家送过来的外卖。一个人处理一个商家,当这个人在等待这个商家快递的时候其他事情都干不了,只能干等;这就是线程阻塞模式下的状态,虽然可能没有数据传输,但是线程就得在哪里等着。
这样看来你得话费大量的人力资源(线程、内存)
为了解决这样的问题,所以引入了非阻塞模型;这个模型的做法就很简单,只需要一个守着就好了;同样是点10份外卖,同样来自10个商家,并送到10个办公室;这个时候我们只需要一个门卫,每个人都给门卫打个招呼,说来快递了帮忙打个电话即可;然后大家自己做自己的事情去了。
当外卖到达时,此时给到门卫,然后门卫根据之前登记的门派、电话等信息联系对应的人来拿即可。
在这样的模式中,每个人可以自己做自己的事情,不用等着,自己要做事情需要依赖内核“门卫”的通知;这样可以用较少的线程来完成大量的调度,因为一台电脑的吞吐量是固定的,所以有些时候加大线程只会带来负担,并不能带来性能的提升;反而在合理的线程数量内进行高密度的调度是更好的资源利用。
00
相似问题