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:请求当完成后处理具体逻辑,否则做自己该做的事情。

  

原文地址:https://www.cnblogs.com/huaxueyihao/p/9158374.html