1.同步与异步
同步:是指发出一个请求,在没有得到结果之前该请求就不会 返回结果,直到请求返回时;
比如烧水,一直在看,直到水烧好之后,才去干别的事。
异步:发出一个请求后,立刻得到了回应,但没有返回结果,在此阶段可以去处理别的事情
比如烧水时,你可以设置一个定时,期间你可以去做别的事情
2.阻塞与非阻塞
阻塞: 是指请求结果返回之前当前的线程会被挂起,此时的线程什么也不会去做
非阻塞:是指请求结果返回之前,当前线程没有被阻塞,期间可以去做其他的事情
Java IO模型
java中的io操作是JVM陪着OS来完成的,对于一次IO读操作来说,数据会先从磁盘拷贝到OS内核的缓冲区,然后从OS内核的缓冲区加载到应用程序的地址中去,此过程可以分为两个阶段,等待I/O数据准备和数据从内核缓冲区拷贝到用户应用空间进程
之内。
java中的IO体系结构图:
大体可分为字符流(Reader和Writer)和字节流(InputStream和OutPutStream);
IO分类之BIO(阻塞IO模型)
此时在内核准备好数据之前此线程都是被挂起的,所以在等待数据从磁盘返回和OS内核缓冲区和从OS内核缓冲区加载到用户空间 的这个过程都是出于阻塞的状态。
NIO(非阻塞I/O模型)
NIO与BIO的明显区别是,发起第一次请求后,线程并没有阻塞,而是多次检查数据是否准备好,就是把一个大的阻塞窃取进行多次小的阻塞,所有进程不断有机会执行,可以说为轮询
NIO是基于Selector复用器实现的,这也其实就是jdk的基于I/O多路复用技术
多路I/O复用模型:多路(多个tcp连接,多个channel),复用是指复用一个或少量线程,也可以说为一个或少量的线程去处理多个tcp连接。
它是基于os的select函数实现的,该函数会等待多个i/o事件(读就绪或写就绪)的任何一个事件发生,select线程就会去执行
常用的多路I/O复用模型:
select:注册事件由数组管理,数组时有长度的,32b:1026,64b:2048,,轮询查找时需要遍历数组。
poll:把select的数组采用链表去实现,因此无最大数量的限制
epoll:基于事件回调机制,回调时直接通知进程。无须使用某种方式来查看状态。
基于多路I/O复用的NIO,重点在于Selector复用器
大致可分为三步:
①:向Selector注册连接,读、写IO事件
②:轮询Selector复用器中的selectKey集合
③:通过key找到对应的channel,通过绑定的Buffer来进行读写
//打开一个为绑定的serverSocketChannel
ServerSocketChannel serverChannel =ServerSocketChannel.open();
//创阿金一个Selector复用器
Selector selector = Selector.open();
//把这个serverSocketChannel设置为非阻塞模式
serverChannel .configureBlocking(false);
//将serverSocketChannal注册到Selector中去
serverChannel.register(selector,SelectionKey.OP_READ);
while(true)
{
int readyChannels = selector.select();
if(readyChannels==0)
continue;
//获取对应的selector中的selectkey集合
Set selectedKeys = selector.selectedKeys();
//对该集合进行遍历
Iterator keyIterator= selectedKeys.iterator();
while(keyIterator.hasNext())
{
SelectionKey key = keyIterator.next();
if
(key.isAcceptable())
{
// a connection was accepted by a ServerSocketChannel.
}else if(key.isConnectable())
{
//连接就绪
// a connection was established with a remote server.
}else if(key.isReadable())
{
//读就绪
// a channel is ready for reading
}else if(key.isWritable())
{
//写就绪
// a channel is ready for writing
}
keyIterator.remove();
}
}
AIO模型
AIO即异步IO模型,是jdk1.7中引入的NIO 2.0中用到的,整个过程中,用户发起一个系统调用之后无须等待,由OS等待结构数据,然后将接收的数据拷贝到用户进程中,最后通知用户已经可以使用数据了两个阶段都是非阻塞的
主要是基于“回调”,实现的。