BIO,NIO和AIO的区别

BIO也就是同步阻塞的I/O,由JAVA程序自己处理I/O流操作;一个线程启用I/O请求后,必须等I/O处理完毕才能进行下一步;


NIO是同步非阻塞的I/O,还是由JAVA处理应用操作,不过单独开启一个线程去做I/O处理,而且会将数据读写到一个Buffer缓冲区中,之后交由OS去进行处理,缺点是需要多路复用器不断去轮询,在触发I/O操作后,用户线程也会需要时不时的去访问查看是否已经完成(jdk7后已经使用了epoll进行了改善)


AIO也就是NIO2.0,只需要发起一个I/O请求,之后具体的I/O操作都交由系统完成,系统在完成后会自行通知程序;

 

不管是NIO还是AIO都是避免了传统BIO使用TCP连接创建输出和输入流通道进行通信的弊端,它们使用的是http长连接建立了一个可读写的通道(channel);

channel:

Channel 管道(这里只说网络读写的Channel (SelecttableChannel 它有两个子类SocketChannel和ServerSockerChannel)避免了传统BIO的三次握手模型建立的OutputStream,InputStream连接通道),既可以读也可以写,也可以读写同时进行,并且channel上有四种状态位,分别是(Connect 连接状态,Accept 阻塞状态,Read 可读状态,Write 可写状态)不管是读写数据都是要先进入一个Buffer中,
而Buffer其实也是一个对象,有对应JAVA八种基本数据类型的八种缓存区,但我们一般使用ByteBuffer对象进行读写的存储就够了;

selector:
Selector 多路复用器,管理着一个注册的通道集合的信息和它们的就绪状态(使用轮询),如果某个通道发生了读写操作,会被它轮询出来,并通过SelectionKey可以取得就绪的Channel集合,从而进行后续的I/O操作;
一个Selector可以管理成千上万个Channel通道,如果使用传统的轮询机制就会使得性能很底下,所以JDK使用了epoll(内部对于通道的节点位置使用红黑树存储,对于每个通道都添加了一个事件,只有当进程调用了一定的方法后,扫描才会被触发,而且可以并利用红黑树快速找到通道的节点位置)
Selector模式: 当管道注册到选择器以后,selector会分配给每个管道一个key值,相当于标签.selector选择器是以轮询的方式方式进行查找注册的所有IO事件(管道),当我们的IO事件(管道准备就绪后),selector会识别,并通过对应的key值找到对应的管道,进行相关的数据处理操作(从管道中读获写数据,读的话就是写到我们的数据缓冲区中).

每个管道都有不同的事件状态,以便选择器查找;
SelectionKey.OP_CONNECT
SelectionKey.OP_ACCEPT
SelectionKey.OP_READ
SelectionKey.OP_WRITE

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值