zoukankan      html  css  js  c++  java
  • Nio笔记(一)

    (1)阻塞和非阻塞

    阻塞:数据内容是否准备就绪的一种处理方式。当数据没有准备的时候,阻塞往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里,

    非阻塞:当进程访问数据缓冲区时,数据没有猪呢比好的时,直接返回,不需要等待,数据有的时候,也直接返回。

    (2)同步和异步

    同步和异步都是基于应用程序和操作系统处理IO时间锁采用的方式,比如同步应用程序直接要参与IO读写的操作,异步:所有的IO读写交给操作系统去处理。同步的方式在处理IO事件的时候,必须阻塞在某个方法上等待IO事件完成(阻塞IO事件,轮询IO事件的方式),对于异步,所有的IO读写都交给了操作系统,此时,可以去处理其他的事情,不需要等待真正的IO操作,当操作完成IO后,给应用程序一个通知。

    同步:(1)阻塞到IO事件 , 没数据可读的时候,阻塞到read或者write,这时不能做其他事情,让读写方法加入到线程里面,然后阻塞线程来实现,对线程的性能开销比较大。

    (2)IO事件的轮询:多路复用技术(select 模式) 所有读写都阻塞时,读写事件交给一个单独的线程来处理。这个线程完成IO事件的注册功能,还有就是不断的去轮询我们的读写缓冲区,看是否有数据准备好。通知我们通知相应读写线程 这样的话 以前对读写线程可以做其他事情,这个时候阻塞的不是所有的IO线程,阻塞的select这个线程。

    javaIO模型:

    BIO:jdk 1.4前都是BIO,阻塞IO

    阻塞方法我们的读写,优化阻塞到线程,

    NIO:jdk1.4 linux多路复用技术(select模式),实现IO事件轮询的方式,同步非阻塞的模式,这种方式时主流的网络通信模式,

    Mina,netty mina2.0 netty5.0 网络通信框架。

    AIO:jdk1.7 (NIO2)才是实现真正的异步AIO,学习linux epoll模式,AIO使用的比较少。

    (3)NIO、AIO原理

    对于网络通信而言NIO,AIO并没有改变网络同信的基本步骤,只是在其原来的基础上(serversocket,socket)做里改进。

    Socket  建立连接需要三次握手 serversocket

    三次握手开销较大,解决方式:就是减少连接的次数,对读写通信管道进行一个抽象。对于读和写采用抽象的管道概念:Channel是一个TCP连接之间的抽象,一个TCP连接可以对应多个管道,而不是以前的方式,只有一个通信信道,减少了TCP连接的次数,

    UDP:采用相同的方式,也是抽象成管道。

    (4)NIO原理

    通过selector(选择器,多用复用技术),相当管家,管理所有的IO事件,Connection accept  客户端和服务端的读写

    selector(选择器)如何进行管理IO事件:

    当IO事件注册给选择器时候,选择器会给他们分配一个key(可以简单的理解成一个时间标签),当IO事件完成通过key值来找到相应的管道,然后通过管道发送数据和接收数据等操作,

    数据缓冲区:通过bytebuffer实现,提供很多读写的方法 put( ) get(),

    服务端:ServeSocketChannel

    客户端:SocketChannel

    选择器:Selector selector=Select.open();这样就打开了选择器

    SelectionKey:可以通过它来判断IO事件是否已经就绪。

      key.Acceptable:是否可以接受客户端的连接,

      key.connctionable:是否可以连接服务端

      key.isreadable():是否可读

      key.iswriteable():是否可写

    (5)如何获得事件的keys

      Selectionkey keys = selector.selectdKeys()

    (6)如何注册

      channel.regist(Selector.OP_WRITE);

       channel.regist(Selector.OP_Read);

      channel.regist(Selector.OP_Coonct);

      channel.regist(Selector.OP_Accept);

     (7)AIO

      服务端:AsynchronousServerSocketChannel

      客户端:AsychronousSocketChannel

      用户处理器:CompletionHandler接口,这个接口实现引用程序操作

      系统发起IO:请求当完成后处理具体逻辑,否则做自己该做的事情。

      

  • 相关阅读:
    一些你可能用到的代码
    iOS 键盘下去的方法
    iOS设计模式汇总
    随笔
    Spring cloud config 分布式配置中心 (三) 总结
    Spring cloud config 分布式配置中心(二) 客户端
    Spring cloud config 分布式配置中心(一) 服务端
    jdbcUrl is required with driverClassName spring boot 2.0版本
    JpaRepository接口找不到 spring boot 项目
    解决IntelliJ “Initialization failed for 'https://start.spring.io'
  • 原文地址:https://www.cnblogs.com/huaxueyihao/p/9158374.html
Copyright © 2011-2022 走看看