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个办公室;这个时候我们只需要一个门卫,每个人都给门卫打个招呼,说来快递了帮忙打个电话即可;然后大家自己做自己的事情去了。

当外卖到达时,此时给到门卫,然后门卫根据之前登记的门派、电话等信息联系对应的人来拿即可。

在这样的模式中,每个人可以自己做自己的事情,不用等着,自己要做事情需要依赖内核“门卫”的通知;这样可以用较少的线程来完成大量的调度,因为一台电脑的吞吐量是固定的,所以有些时候加大线程只会带来负担,并不能带来性能的提升;反而在合理的线程数量内进行高密度的调度是更好的资源利用。

0
0

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2314 学习 · 476 问题

查看课程