面试问你了解BIO、NIO、AIO吗?这样回答就够了

BIO、NIO、AIO的区别

1.同步和异步

**同步:**同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。

**异步:**就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,在等待返回结果的过程我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。

同步和异步的区别最大在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。

同步和异步其实指的是:请求发起方对消息结果的获取是主动发起的,还是等被动通知的。如果是请求方主动发起的,一直在等待应答结果同步阻塞),或者可以先去处理其他的事情,但要不断轮询查看发起的请求是否有应答结果(同步非阻塞),因为不管如何都要发起方主动获取消息结果。,所以形式上还是同步操作。如果是由服务器方通知的,也就是请求方发出请求后,要么在一直等待通知(异步阻塞),要么就先去干自己的事了(异步非阻塞),当事情处理完成之后,服务方会主动通知请求方,它的请求已经完成,这就是异步。异步通知的方式一般是通过状态该表、消息通知,或者回调函数来完成,大多数时候采用的都是回调函数。

总结下:同步是等待应答结果,是主动去获取消息结果,而异步是等待通知,等别人给他通知。

2.阻塞和非阻塞

**阻塞:**阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。

**非阻塞:**非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。

举个例子:拿烧开水来说,你去烧水,然后在那干等水烧开,这就是同步阻塞。你去烧水,你会在每次烧水的空隙去干别的事,比如扫地,然后时不时看看水烧开了没有,这个就是同步非阻塞。你去烧水,你家烧水器上有报警器,水烧开了会发出声音,所以在水烧开这段期间你可以随便干自己的事,听到响声后就知道水开了,这就是异步非阻塞

阻塞I/O模型

​ 阻塞I/O迷行是常见的I/O模型,在留些数据是客户端会发生阻塞。阻塞I/O模型的工作流程是:在用户线程发出I/O请求之后,内核会检查数据是否就绪,此时用户线程一致阻塞等待内存数据;在内存数据就绪后,内核将数据复制到用户线程中,并返回I/O执行结果到用户线程,此时用户线程将解除阻塞状态并开始处理数据。

非阻塞I/O模型

​ 非阻塞I/O模型指用户线程在发起一个I/O操作后,无需阻塞便可以马上得到内核返回的一个结果。如果内核返回的结果为false,则表示内核数据还没有准备好,需要稍后再发起I/O操作。一旦内核中的数据准备好了,并且再次收到用户线程的请求,内核就会立刻将数据复制到用户线程中并将复制的结果通知用户线程。

​ 在非阻塞I/O模型中,用户线程需要不断询问(轮询)内核数据是否就绪,在内存数据还未就绪时,用户线程可以处理其他任务,在内核数据就绪后可立即获取数据并进行响应的操作。

3.BIO(同步阻塞)

BIO:线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成。

在用户线程发出I/O请求之后,内核会检查数据是否就绪,此时用户线程一致阻塞等待内存数据;在内存数据就绪后,内核将数据复制到用户线程中,并返回I/O执行结果到用户线程,此时用户线程将解除阻塞状态并开始处理数据。

典型的阻塞I/O的例子为 data = socket.read(); 如果呢哦和数据没有就绪,Socket线程就会一直阻塞在read()中等待内核数据就绪。

4.NIO(同步非阻塞)

NIO:线程发起IO请求,立即返回;内核在做好IO操作的准备之后,通过调用注册的回调函数通知线程做IO操作,线程开始阻塞,直到操作完成。

NIO是基于多路复用I/O模型实现的。在多路复用I/O模型中会有一个被称为Selector 的线程不断轮询多个Socket 的状态,只有在Socket有读写事件时,才会通知用户线程进行I/O读写操作。

客户端发出请求时,服务端用一个线程来处理多个请求,采用了多路复用技术,客户端发送的请求会注册到多路复用器(Selector选择器)上,有I/O请求的客户端分配线程处理。

5.AIO(异步非阻塞)

AIO:线程发起IO情趣,立即返回;内存做好IO操作的准备之后,做IO操作,直到操作完成或者失败,通过调用注册的回调函数通知线程做IO操作完成或者失败。

具体例子可以参考烧开水:你去烧水,你家烧水器上有报警器,水烧开了会发出声音,所以在水烧开这段期间你可以随便干自己的事,听到响声后就知道水开了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白居不易.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值