BIO vs NIO——概念杂谈

本文深入探讨了阻塞与非阻塞、同步与异步的概念,并以此为基础解析了BIO、NIO和AIO三种IO模型。BIO是同步阻塞的,NIO是同步非阻塞,而AIO则是异步非阻塞,允许发起IO操作的进程在等待期间继续执行其他任务。通过对这些概念的理解,有助于更好地掌握网络编程中的IO模型选择。
摘要由CSDN通过智能技术生成

前言

今天在学习Netty的过程中再一次的领会到了一些概念更清晰的轮廓,遂记。

一、阻塞与非阻塞、同步与异步

这一对概念,我应该是最早在操作系统的进程中接触到的,在我的理解里面,同步与异步这一对概念放在操作系统的进程的语境下理解可能更为深刻和恰当。

  • 用户态与内核态

我们知道对于操作系统而言,为了保证不同进程间的相互独立,即起到保护某些关键操作,我们将内存空间分成了用户空间内核空间,将操作系统的状态分为用户态内核态

对于内核空间来说,其中保存的代码逻辑和数据往往更为核心以及需要更高的权限,一些和操作系统自己核心功能和关键进程都会在内核空间中进行,而用户空间恰好相反,大多数应用级别的进程都是运行在用户态下,当需要进行一些只有内核态才能完成的操作时会通过一种方式切换到内核态,这种方式的具体体现就是进行一次系统调用(当然导致状态切换的还有可能时异常和中断),我们通过一个已经封装好的系统调用去向操作系统表达我们想要干的事情并由操作系统内核来做出相应操作并返回。

  • 进程的阻塞与非阻塞

因此此时对于一个进行系统调用后的进程就存在着一种可能的状态,即如果我进行的这次系统调用需要花费一段时间才能完成,那么该线程就会暂时被操作系统挂起,进入Waiting状态,此时我们就说这个线程阻塞住了,阻塞这个概念由此可以引入。

我们发现,在操作系统的进程的概念下,阻塞指的是在发起系统调用后由于不能马上拿到结果而进入等待状态的概念,对应到IO操作下,是不是可以理解成一次IO操作时,发起IO操作的进程在操作系统进入内核态进行真正的读写操作时(文件IO或者网络IO都一样)由于读写操作需要时间,故而发起调用的线程被挂起时,这样的一个流程就被称作为一个阻塞的IO;而如果这样理解的话,那么他的反面应该是存在着这样一种情形,叫做我发起IO操作后立即返回,进程不再需要被挂起,等待IO操作完成取得结果,可以继续去干其他事情,这就叫做非阻塞

  • 同步与异步

经过上述探讨,阻塞与非阻塞已经有所轮廓,此时我们再来看看同步与异步。其实,在我的理解里面,异步与同步是另一种维度上的探讨,只不过出于某种原因使得这一对概念与阻塞非阻塞有着很大的关联才让我们天然的存在一些共识。
我们跳出来看,在同步与异步的维度下,与阻塞与非阻塞更强调状态相比,其更强调的是我完成一个操作所选择的操作方式,比如今天双11我想得到一个最低价的键盘,此时我有两种选择,一种是盯着价格的波动曲线,直到出现令我满意的价格;另一种是我告诉我的京东app我要买的东西和需求,它会在符合条件的时候帮我买入并弹窗通知我;而其实对于前者这里我有可能存在两种状态,一种是整个人在开始盯住价格曲线这一任务后,就直接什么其他事情都不干,另一种是我在干其他事情的时候不间断的看着手机上的价格曲线
而现在谈到这里,其实就发现一个事情,(当然这也是我自己的理解,如有异议欢迎讨论)我是否有这两种状态的区别,是不是只有在我选择第一种操作方式的时候才有意义啊?很显然,当我选择第二种操作方式的时候,我就没必要进入等待状态挂起。
因此,通过上述举例,我们发现,换句话说,异步的操作方式本身就是一个非阻塞的操作,回到IO本身就是异步IO发起后,发起进程不会被挂起进入等待状态,而是当IO设备完成IO操作后通过外部设备的中断告诉CPU通知这个进程IO操作完成,再大胆点得出结论就是异步操作对立于同步操作,没有阻塞非阻塞状态的区别,但是硬要套结论的话其也算是一个使得发起进程出于非阻塞状态的操作。

二、BIO、NIO、AIO

有了上述对于阻塞与非阻塞,以及异步的概念的理解推导,再来理解这三种IO方式就会发现其实很简单

BIO,Blocking IO,一个同步阻塞的IO,我们选择同步的方式完成IO操作,此操作会导致发起者进入等待状态即阻塞
NIO,New IO(不是non-blocking io的缩写,虽然nio是一种non-blocking的IO,表达的意思也许是指在JDK1.4以后出现的一种新的IO),我们同样选择同步的方式完成IO操作,只不过不同于BIO,此操作不会导致发起者进入等待状态,是一种非阻塞的IO
AIO,Asynchronous IO,意为异步IO,选择异步的操作方式,由于异步方式的操作特点,不会使得发起者进入等待状态,具有天然的非阻塞的特点,直接将AIO称为异步IO即可,称其为异步非阻塞IO或许欠妥。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值