BIO、NIO、AIO以及Netty的简单记录

  BIO(Blocking IO - 同步阻塞IO):顾名思义就是阻塞IO,阻塞的原因有两个方面:

  1. 客户端连接服务端时阻塞  主要表现在ServerSocket的accept()方法,该方法会一直等待客户端的连接
  2. 当客户端连接上服务端时,服务端和客户端的读写操作也是阻塞的,比如inputStream.read()、outputStream.write()

  NIO(New/Non-blocking IO 同步非阻塞IO):非阻塞IO,该IO使用ServerSocketChannel进行注册绑定端口,然后设置configureBlocking(false)就是非阻塞IO

     这个IO的非阻塞体现在使用了selector,selector相当与一个管家,开启这个管家并注册SelectionKey的OP_READ、OP_WRITE、OP_CONNECT、OP_ACCEPT事件,selector就会管

   理相关操作,不断的轮询查看是否有这些操作,如果出现了就对其进行处理。

  • NIO-reactor模式:因为数据的读写操作可能会非常耗时,所以如果使用selector对所有事件进行处理的话容错性不好,就有了reactor模式,selector负责客户端的连接过程,然后连接上之后

   将相关连接通道的读写操作分发给其他线程进行处理,这时可以使用线程池专门处理这些读写事件

  AIO(Asynchronous IO 异步非阻塞IO):异步非阻塞IO,该IO使用AsynchronousServerSocketChannel进行注册绑定端口,因为NIO需要一直不停的轮询查看,可以进一步省略这些过程,通

   过使用操作系统OS,在有客户端连接服务端时,让OS通知我们并运行预先设置好的处理方法(此处使用了观察者模式),这样就可以做到异步,只需要预先设置好连接成功后调用的方法以

   及读写操作后调用的方法就可以了。

  Netty : 底层其实就是NIO,并没有使用AIO,因为AIO其实就是对NIO多进行了一次封装,而且在linux环境下调用AIO并没有更方便,但是服务器一般都部署在linux上。

   netty就是采用EventLoopGroup,类似selector的管家,新建两个NioEventLoopGroup()对象,一个负责客户端的连接,一个负责数据的读取,最后注册上去就行了。

  

  如果文章有错的地方欢迎指正,大家互相交流

  参考项目:https://github.com/bjmashibing/NettyStudy

 

BIO、NIO、AIO以及Netty的简单记录

上一篇:LSM设计一个数据库引擎


下一篇:「译」JavaScript 的怪癖 1:隐式类型转换