nio bio aio的区别面试

作者&投稿:贰骂 (若有异议请与网页底部的电邮联系)
~

nio bio aio的区别如下:

BIO全称是Blocking IO,是JDK1.4之前的传统IO模型,本身是同步阻塞模式。

线程发起IO请求后,一直阻塞IO,直到缓冲区数据就绪后,再进入下一步操作。针对网络通信都是一请求一应答的方式,虽然简化了上层的应用开发,但在性能和可靠性方面存在着巨大瓶颈,试想一下如果每个请求都需要新建一个线程来专门处理,那么在高并发的场景下,机器资源很快就会被耗尽。

NIO也叫Non-Blocking IO 是同步非阻塞的IO模型。

线程发起io请求后,立即返回(非阻塞io)。同步指的是必须等待IO缓冲区内的数据就绪,而非阻塞指的是,用户线程不原地等待IO缓冲区,可以先做一些其他操作,但是要定时轮询检查IO缓冲区数据是否就绪。Java中的NIO 是new IO的意思。其实是NIO加上IO多路复用技术。

普通的NIO是线程轮询查看一个IO缓冲区是否就绪,而Java中的new IO指的是线程轮询地去查看一堆IO缓冲区中哪些就绪,这是一种IO多路复用的思想。IO多路复用模型中,将检查IO数据是否就绪的任务,交给系统级别的select或epoll模型,由系统进行监控,减轻用户线程负担。

NIO主要有buffer、channel、selector三种技术的整合,通过零拷贝的buffer取得数据,每一个客户端通过channel在selector(多路复用器)上进行注册。

服务端不断轮询channel来获取客户端的信息。channel上有connect,accept(阻塞)、read(可读)、write(可写)四种状态标识。根据标识来进行后续操作。所以一个服务端可接收无限多的channel。不需要新开一个线程。大大提升了性能。

AIO是真正意义上的异步非阻塞IO模型。

上述NIO实现中,需要用户线程定时轮询,去检查IO缓冲区数据是否就绪,占用应用程序线程资源,其实轮询相当于还是阻塞的,并非真正解放当前线程,因为它还是需要去查询哪些IO就绪。

而真正的理想的异步非阻塞IO应该让内核系统完成,用户线程只需要告诉内核,当缓冲区就绪后,通知我或者执行我交给你的回调函数。

AIO可以做到真正的异步的操作,但实现起来比较复杂,支持纯异步IO的操作系统非常少,目前也就windows是IOCP技术实现了,而在Linux上,底层还是是使用的epoll实现的。




商州区19224934487: java aio和nio的区别 知乎 -
居柱罗汉: AIO 是彻底的异步通信. NIO 是同步非阻塞通信. 有一个经典的举例.烧开水. 假设有这么一个场景,有一排水壶(客户)在烧水.AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理. NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理. BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶.可以看出AIO是最聪明省力,NIO相对省力,叫一个人就能看所有的壶,BIO最愚蠢,劳动力低下.

商州区19224934487: JAVA NIO 和 AIO 的区别 -
居柱罗汉: Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理.Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求...

商州区19224934487: BIO、NIO、AIO 有什么区别? -
居柱罗汉: IO的方式通常分为几种:同步阻塞的BIO同步非阻e68a84e8a2ad62616964757a686964616f31333433633362塞的NIO异步非阻塞的AIO.Java对BIO、NIO、AIO的支持:Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即...

商州区19224934487: java中bio nio aio的区别和联系 -
居柱罗汉: BIO是一个连接一个线程.NIO是一个请求一个线程.AIO是一个有效请求一个线程.先来个例子理解一下概念,以银行取款为例: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写);异步 : 委托一小弟拿银行卡...

商州区19224934487: java面试nio和io的区别 -
居柱罗汉: 面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方.此外,它不能前后移动流中的数据.如果需...

商州区19224934487: 为什么nio效率会比bio高 -
居柱罗汉: 假如有10000个连接,4核CPU ,那么bio 就需要一万个线程,而nio大概就需要5个线程(一个接收请求,四个处理请求).如果这10000个连接同时请求,那么bio就有10000个线程抢四个CPU ,几乎每个CPU 平均执行2500次上下文切换,而nio 四个处理线程,几乎每个线程都对应一个CPU ,也就是几乎没有上下文切换.效率就体现出来了.

商州区19224934487: java中IO和NIO的区别和适用场景 -
居柱罗汉: 以前在远标学过nio是new io的简称,从jdk1.4就被引入了,可以说不是什么新东西了.nio的主要作用就是用来解决速度差异的.举个例子:计算机处理的速度,和用户按键盘的速度.这两者的速度相差悬殊.如果按照经典的方法:一个用户设定一个线程,专门等待用户的输入,无形中就造成了严重的资源浪费:每一个线程都需要珍贵的cpu时间片,由于速度差异造成了在这个交互线程中的cpu都用来等待. 在以前的 Java IO 中,都是阻塞式 IO,NIO 引入了非阻塞式 IO.

商州区19224934487: 为什么说JAVA nio是非阻塞的 -
居柱罗汉: OIO是读写阻塞, NIO是读写非阻塞,就是说服务器等待客户端连接这块都是阻塞的, 一旦建立连接了, OIO下, 我读取客户端发来的信息会因网络延时问题又一次阻塞, 你发消息时也是一样 而NIO下, 你的selector.select()如果注册了read...

商州区19224934487: Java中IO与NIO的区别和使用场景 -
居柱罗汉: java.NIO包里包括三个基本的组件 l buffer:因为NIO是基于缓冲的,所以buffer是最底层的必要类,这也是IO和NIO的根本不同,虽然stream等有buffer开头的扩展类,但只是流的包装类,还是从流读到缓冲区,而NIO却是直接读到buffer中进行操作...

商州区19224934487: Java NIO与IO的区别和比较 -
居柱罗汉: nio是new io的简称,从jdk1.4就被引入了,可以说不是什么新东西了.nio的主要作用就是用来解决速度差异的.举个例子:计算机处理的速度,和用户按键盘的速度.这两者的速度相差悬殊.如果按...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网