从IO到NIO的过程

1.在JDK1.3之前,只用到普通的IO方式进行数据的传输;

2.在JDK1.3出现之后, 采用阻塞的BIO替代了普通的IO传输方式;

                                  

单线程的情况下,如果读或者写操作没有完成,那么它的当前线程是不能进行其它操作 ,其它的连接的读只能出现在当前线程写入完成或者出现异常之后;可以利用多线程来处理多个请求。

在JDK1.4之前就是这么做的。这样的话一个客户端浏览需要一个线程, 太耗费资源了,会不断的加大服务器的负担。

最后,改进利用线程池,进行处理连接问题,当一个连接处理完成之后,它将线程归还给线程池;

当客户端连接数量大多之后,可以通过线程池和队列的方式有效地控制线程的数量;那么核心的操作应该在IO上面,而不是在线程,那么对于连接上的改进,Socket连接时候不创建线程,那对连接进行登记,需要IO操作时再进行创建,用完之后再归还给线程池;

非阻塞方式:在单线程情况下,当IO操作没有完成,当前线程也可以做其他的事情;

JDK 1.4源码也意识到这个问题,改进NIO(non-Blocking IO),双向Channel,支持全双工通信,selector,同时进行读和写,再也不用等到数据全部整理完再进行其他操作。

               

Acceptor:Acceptor接受client连接,建立对应client的Handler,并向Reactor注册此Handler。

Reactor:Reactor是IO事件的派发者。

Handler:和一个client通讯的实体,按这样的过程实现业务的处理。

Nio的一个reacter模型:

                                                      

其实IO的底层都是调用操作系统,FileDiscriptor(文件描述服务) ,Nio的核心,channel,selector,buffer;

同步非阻塞,区别Epoll可以单线程处理很多客户端的请求,本质上就是Unix的select/poll模型----》epoll模型

多线程中使用selector.select使用epoll模型处理多个客户端请求。在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel传输到另外一个channel。

而netty框架就是封装了Nio的细节,一个简单易使用的框架;

作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。

                                               

Selector的作用:

                                                

        Netty无疑是NIO的老大,它的健壮性、功能、性能、可定制性和可扩展性在同类框架都是首屈一指的。它已经得到成百上千的商业/商用项目验证,如Hadoop的RPC框架Avro、RocketMQ以及主流的分布式通信框架Dubbo等等。
为什么这么火,是有原因的。

Netty的优点可以总结如下:

  • API使用简单,开发门槛低;
  • 功能强大,预置了多种编解码功能,支持多种主流协议;
  • 定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展;
  • 性能高,通过与其他业界主流的NIO框架对比,Netty的综合性能最优;
  • 成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼;
  • 社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会加入;
  • 经历了大规模的商业应用考验,质量得到验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业得到成功商用,证明了它已经完全能够满足不同行业的商业应用了。

    对于BIO,NIO,AIO解释的例子:

1.BIO,比如:你有一个快递,快递员跟你约好,在什么地方,你去等着他把快递送过来;

2.NIO,比如:你有一个快递,快递员送到前台,你时不时过去看一下,快递员是否把快递送到了前台;

3.AIO,比如:你有一个快递,快递员把它送到前台,快递员送到了之后,前台再通知你去取;

了解Unix网络编程5种I/O模型

1.1 阻塞

1.2 非阻塞

1.3 I/o 复用

1.4 信号驱动的IO

1.5  异步I/O


同步IO和异步IO的区别就在于:数据访问的时候进程是否阻塞!

阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值