美文网首页
2018-06-19 NIO

2018-06-19 NIO

作者: 江江江123 | 来源:发表于2019-11-18 19:03 被阅读0次

    是 New IO 的简称 jdk1.4提供的新api
    新特性:

    1. Buffer缓存
      2.字符集编码
      3.Channel 新原始I/O
      4.支持锁和内存映射文件的文件访问接口
      5提供多路非阻塞式的网络I/O

    BIO与NIO的区别
    BIO的服务端accept是阻塞的,会一直等待客户端访问,同步阻塞
    NIO新增一个selector,客户端先访问seletor注册业务,服务端在selector监听自己需要处理的业务,监听业务需要同步轮询(非阻塞)
    NIO与NIO的区别
    New IO是jdk1.4提供的多路非阻塞IO
    No-block IO 是Block IO非阻塞 ,另起线程处理问,需要不断轮询主线程去查看子流程是否完成
    new IO即select 在no block io的基础上添加一个管家select ,主线程依然需要不断轮询,但是只监听select ,select 会指派channel去完成任务,完成任务后,会在select上标识,主线程根据select查看完成情况,只获取完成任务的数据,获取后channel等待下次任务使用
    select 类似线程池,channel 就是里面的核心线程

    同步和异步
    同步:APP要直接参与IO事件的操作;在同步处理IO事件,必须阻塞完成事件
    异步:所有的IO读写事件交给操作系统取处理,因为是操作系统完成,APP还可以处理其它事务,当操作系统完成操作后返回完成信息

    同步的实现模式:
    1.阻塞IO事件,阻塞到read或write方法上
    2.IO事件轮询,使用多路复用模式(select模式);读写事件交给专门的线程处理,该线程除了完成IO注册事件,还有不断的轮询操作系统的读写缓存区,如果数据准备好,则通知系统处理相应的业务。在这种模式下,阻塞的只有select线程,而不是所有IO线程

    AIO:异步 IO java1.7支持
    与多路复用的区别,多路复用本质还是异步阻塞式编程 因为在查询select 和从 channel读取数据还是阻塞的,而aio是异步非阻塞的 ,如何做到不阻塞,
    这需要了解socket本质:调用linux内核传输数据,而阻塞也主要发生在这,线程需要等待数据完全读写完成后才会做别的事。所以要做到非阻塞,需要系统内核可以注册事件,到事件处理完成后,内核去中断主线程并告诉这件事处理完成了
    存在问题:由于linux内核对该模式支持不佳,所以主流还是select模式

    阻塞和非阻塞:
    阻塞:如果目标没有达成,则一直等待
    非阻塞:如果目标没有达成,仍然向下做其它处理,当目标达成后,再处理

    适用场景:服务端一个线程可以对服务多个客户端,多线程下,可以连接更多客户端。
    客户端依然可以用传统I/O

    由于NIO编程太过复杂,所有常用第三方封装的mina,Netty

    netty具体应用见自定义Rpc

    相关文章

      网友评论

          本文标题:2018-06-19 NIO

          本文链接:https://www.haomeiwen.com/subject/cvxzeftx.html