BIO,NIO,netty

今天来说说几种IO的进化史吧。


BIO:

问题: accept()和read()都是阻塞的,假想,客户端一进来了,在read方法阻塞,客户端二是连不进来的。第二种情况,客户端一连进来了,第一次发送消息完毕之后,第二次要重新从accept方法开始。

多线程版本:

解决了第一个客户端连进来了读的时候,其他客户端无法进来的问题,显然当客户端的数量增大的时候,线程的开销是吃不消的。

低配版的NIO:

使用一个list来储存客户端,并且将accept和read方法都设置为非阻塞。问题:虽然是单线程的,但是每次都要循环客户端所组成的list,如果只有个别的客户端有数据进来,就是存在着很多的空轮训。

有没有一种办法,我每次不去轮训,让操作系统告诉我有哪些有数据。答案是有的

多路复用器版本:

这里有个selector;也就是我们常常说的多路复用器,我们只需要把连进来的客户端注册到selector里面,它会告诉我们那些客户端有数据过来,而不用我们一个一个的去轮询,selector的实现有三种方式:select,poll,epoll

select容纳客户端的个数有限制,默认是1024可以设置

poll容纳客户端的个数没有限制,底层是基于链表来实现的

epoll比较特殊,上面说的select和poll 每次都需要将客户端从用户空间传递到内核空间,但是epoll是自己在内核中开辟了一块儿空间,不需要每次都传递过去,系统通过中断的机制来实现。

 


在netty中,是从通过多个selector来实现的,三种模式,单线程模式,混杂模式(一个selector既绑定连接,也处理读请求),主从模式(一个selector只处理连接请求,剩下的一个或者多个selector处理读请求)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值