NIO、BIO、AIO、同步异步、阻塞非阻塞傻傻分不清楚?
来源:     阅读:561
织梦模板店
发布于 2021-03-20 06:30
查看主页

阻塞与非阻塞

阻塞和非阻塞操作是针对发起的IO请求操作后能否立刻返回一个标志信息而不让请求线程等待,当数据准备未完成时,请求线程的状态:

阻塞:往往需要等待缓冲区中的数据准备好过后才解决其余的事情,否则一直等待在那里。

非阻塞:无论数据能否准备好,都会直接返回。

阻塞IO

非阻塞IO

同步与异步

同步与异步是基于应用程序和操作系统解决IO事件所采用的方式:

同步:应用程序要直接参加IO读写的操作。

异步:所有的IO操作交给操作系统去解决,应用程序只要要等待通知。

异步相比较于同步带来的直接好处就是在我们解决IO数据的时候,异步的方式我们可以把这部分等待所消耗的资源用于解决其余事务,提升我们服务自身的性能。

同步IO

异步IO

NIO与BIO的区别总结

NIOBIO基于缓冲区( Buffer )基于流( Stream )非阻塞 IO阻塞 IO选择器( Selector )无

BIO

Blocking IO,是同步阻塞的IO模型,传统的IO【java.io包】就是这种模型。

BIO面向字节流或者字符流,以流的方式顺序地解决一个或者多个字节。

BIO的IO操作是阻塞式的:当一个线程调用read()或者write()时,该线程被阻塞,直到有少量数据被读取,或者数据完全写入。该线程在此期间不能再干任何事情了。

采用BIO形式的网络通信,服务器端启动一个ServerSocket,用户端需要启动Socket来进行一对一连接,假如用户端有多个用户端请求,当其中一个用户端线程连接成功后,其余的将会阻塞。假如需要实现服务端同时解决多个用户端线程,必然需要服务器端开启多线程与之对应,这样就会导致假如用户端请求过多,服务器线程开拓过多导致系统崩溃。

NIO

NIO是Java1.4引入的,相对于传统的IO来说,N可以代表New的意思,表示新IO,但更为具体的了解是Non-blocking的意思,是一种同步非阻塞的IO模型。它提供了Buffer,Channel,Selector三大组件。

同步与非阻塞怎样了解,能否矛盾?

非阻塞表现在:客户程序发起IO操作请求后不等待数据,而是调用会立即返回一个标志信息告知条件不满足,数据未准备好,客户请求程序继续执行其余任务。执行完其余任务,客户程序会主动轮询查看IO操作条件能否满足,假如满足,则客户程序亲身参加拷贝数据动作,这是同步的过程。

NIO支持面向Buffer,基于Channel的IO操作,任何数据在Buffer中进行解决,且能够任意改变操作位置,解决灵活。

NIO的IO操作可以是非阻塞的:当一个线程执行从Channel读取数据的IO操作时,假如有数据,则返回数据;假如没数据,不需要阻塞,而是可以直接返回。

NIO实现非阻塞IO的其中关键组件之一就是Selector,可以注册多个Channel到一个Selector中。Selector可以不断执行select操作,判断这些注册的Channel能否有已就绪的IO事件,如可读,可写,网络连接已完成等。一个线程通过使用一个Selector管理多个Channel。

NIO就是一个线程负责所有请求连接但不解决IO操作,该线程只负责把连接注册到多路复用器上,多用复用器轮询到连接有IO请求时候再启动其它线程解决IO请求操作,实现一个线程或者一些线程即可以对应众多的用户端线程。

AIO是啥?

JDK1.7中,java.nio.channels包下添加了多个异步通道,是NIO的更新版本,实现AIO AsynchronousIO的异步非阻塞IO模型。

非阻塞前面已经解释过了,异步指的就是数据拷贝阶段完全由操作系统解决,而应用程序只要要等待通知就可。

总结

原文链接:https://www.cnblogs.com/summerday152/p/14223272.html

假如觉得本文对你有帮助,可以转发关注支持一下

免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 软件环境
相关推荐
qs-日常实用篇
JAVA程序员已成为最疯狂的加班行业,没有之一?
SpringBoot系列之学习教程汇总
Nginx 负载均衡-HTTP 负载均衡
一张图解析nginx架构
首页
搜索
订单
购物车
我的