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