1.1)阻塞和非阻塞:阻塞和非阻塞是进程在访问数据的时候,数据内是否准备就绪的种处理方式当数据没有准备的时候阻塞: 往往需要等待缓冲区中的数据准备好过后才处理其他的事情否则直等待在那里
非阻塞当我们的进程访问我们的数据缓冲区的时候数据没有准备好的时候直接返回 不需要等待数据有的时候也直接返回
2)同步和异步的方式
同步和异步都是基于应用程序和操作系统处理IO时间锁采用的方式比如同步应用程序要直接参与IO读写的操作,异步:所有的IO读写交给操作系统去处理同步的方式在处理IO事件的时候必须阻塞在某个方法上面等待我们的IO时间完成(阻塞IO事件或则通过轮询IO事件的方式,对于异步来说,所有的I0读写都交给了操作系统这个时候我们可以去做其他的事情并不需要去完成真正的IO操作,当操作完成IO后给我们的应用程序一个通知就可以的。
同步:1)阻塞到IO事件阻塞到 read或则write.这个时 候我们就完全不能做自己的事情让读写方法加入到线程里面然后阻塞线程来实现对线程的性能开销比较大
2)IO事件的轮询-多路复用技术(setect模式)
读写事件交给一个单独的线程来处理,这个完成IO事件的注册供,还有就是不断的去轮询我们的读写缓冲区看是否有数据准备好。通知我们通知相应读写线程这样的话以前的读写 线程就可以做其他的事情这个时 候阻塞的不是所有的IO线程阻塞的select这个线程
Client Select管家 BOSS当客人来的时候,就给管家说我来了,管家得到这个注册信息后,给BOSS说我这里有一个或则多个客人, BOSS你去给某人A这件东西,给另外人B这样东西。这个时候客人是可以去做自己的事情的,比如看看花园等等,当管家知道 boss给他任务后他就是去找对应的某人告诉他 boss给他某样东西。(根据我们的注册信息)
Java IO模型
BIO:JDK1.4以前我们使用都是BIO阻塞IO
阻塞到我们的读写方法阻塞到线程来提供性能对于线程的开销本来就是性能的浪费
NIO:jdk1.4 linux 多路复用技术(setlet模式实现 IO事件的轮询方式同步非阻塞的模式这个种方式目前是主流的网络通信模式
Mina, netty mina2.0 netty5.0--网络通信框架比我直接写NIO要容易些并且代码可读性更好
AIO:jdk1.7 NIO2)才是实现真正的异步aio,学习linux epoll模式AIO使用的比较少,大家可以认真的学习- -些思想
小结:1)BIO阻塞的IO
2) NIO select+非阻塞 同步非阻塞I3)异步非阻塞IO
3.NIOAIO原理的解读
对于网络通信而言NO, AIO并没有改变网通通信的基本步骤,只是在其原来的基础ELserverscoket,socke)做了一个改进
Socket <-建立连接需要三次握手>
serversocket
对于三次握手的方式建立稳定的连接性能开销比较大解决方案从思想上来说比较容易就是减少连接的次数.对我们的读写通 信管道进行一个抽象
对于读和写采用抽象的管道的概念:
Channel: Channe 是在一个TCP连接之间抽象,一个TCP连接可以对应多个管道,而不是以前的方式只有一一个通信信道,减少了TCP连接的次数
UDP:采用相同方式,也是抽象成管道。
4.NO原理
通过selctor (选择器)就相当管家,管理所有的IO事件Connction accept 客服端和服务端的读写___ Io 事件
selctor (选择器)如何进行管理IO事件
当IO事件注册给我们的选择器的时候选择器 会给他们分配一个
key(可以简单的理解成一个时间的标签)当IO事件完成过通过key值来找到相应的管道然后通过管道发送数据和接收数据等操作
数据缓冲区:
通过bytebuffer,提供很多读写的方法put ()| get ()
服务端: ServerSocketChannel
客服端: SocketChannel
选择器: Selector selector=Select.open0;这样 就打开了我们的选择器
4.Selection key:可以通过它来判断IO事件是否已经就绪
key.isAccptable:是否可以接受客户端的连接
Key.isconnctionable:是否可以连接服务端
Key.isreadable():缓冲区是否可读
Keyiswriteable():缓冲区是否可写
5.如何获得事件的keys
Selectionkey keys= Selector.selectedkeyso;
6.如何注册
channel.regist(Selector,Selectionkey.OP_ Write);
channlLreitselector,Selectionkey.OP_Read);
channelregist(selector,Selectionkey.OP_Conct);
channel.regist(Selector,Selectionkey.OP_Accepo);
6.AIO:
服务端:AsynchronousServerSocketChannel客服端:AsynchronousSocketChannel
用户处理器:CompletionHandler接口,这个接口实现应用程序向操作系统发起IO请求当完成后处理具体逻辑,否则做自己该做的事情|