高性能IO设计模式之阻塞/非阻塞,同步/异步解析

做任何事最重要的第一步就是要把概念弄的清晰无误不是么?在这里就是:阻塞,非阻塞,同步,异步。

1. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值error,进程得到这个状态值就知道IO还没有准备好,那么就去忙其他的事情,但是要不断的来询问IO是否已经准备好

2. 同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知)。

一般I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞(不常用),异步非阻塞IO。


同步阻塞IO: 
在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式!

同步非阻塞IO: 
在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。

异步阻塞IO:
此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄(如果从UNP的角度看,select属于同步操作。因为select之后,进程还需要读写数据),从而提高系统的并发性!

异步非阻塞IO:
在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。 

阻塞和非阻塞是指当进程访问的数据如果尚未就绪,进程是否需要等待,简单说这相当于函数内部的实现区别,也就是未就绪时是直接返回还是等待就绪;
同步和异步是相对于应用和内核的交互方式而言的,同步需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序

 

BIO是传统的网络连接模式,由serverSocket绑定服务端ip和监听端口,使用accept方法等待客户端发起连接,客户端Socket建立连接后,服务端一般会为每一个连接新建一个线程进行后续处理,双方使用输入和输出流进行同步阻塞式通信,当发起一个IO操作以后,必须等待IO操作的完成,双方都陷入阻塞,服务端的线程个数和客户端并发访问数呈1:1的关系,当客户端连接比较多时,系统性能就会急剧下降。

NIO是java 1.4之后引入的,一般叫它非阻塞IO,NIO提供了与BIO模型中的Socket和ServerSocket相对应的SocketChannel和ServerSocketChannel两种不同的套接字通道,数据的读取和写入要通过Channel,channel与流的不同在于channel是双向的,可以同时应用于读写;NIO中使用了buffer缓存区,任何数据访问都是通过缓冲区,读是从缓冲区中读取数据,写是向缓冲区中写入数据;此外它还使用了多路复用的select,Selector是NIO 编程的基础,Selector提供选择已经就绪的任务的能力:Selector会不断轮询注册在其上的Channel,如果某个Channel上面发生读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。但其IO操作本身还是同步的。

AIO 就是异步非阻塞IO  应该是在NIO 2.0的时候引入的,不再需要select轮询注册通道即可实现异步读写,用户进程只需要发起一个IO操作然后立即返回继续执行其他操作,等IO操作真正的完成以后,应用程序会得到IO事件完成的回调通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。AsynchronousSocketChannel、AsynchronousServerSocketChannel 获取通道,也利用了buffer缓存区,不过在java中好像应用的不是很广泛。

https://www.jianshu.com/p/2d33ad3e89a6

https://blog.csdn.net/m0_38109046/article/details/89449305?utm_source=blogxgwz4

https://blog.csdn.net/anxpp/article/details/51512200

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值