【Java】---BIO、NIO、AIO

1 篇文章 0 订阅

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等待结构数据,然后将接收的数据拷贝到用户进程中,最后通知用户已经可以使用数据了两个阶段都是非阻塞的

主要是基于“回调”,实现的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值