BIO和NIO 我们平常使用的IO是BIO(Blocking-IO),即阻塞IO、而NIO(No-blocking-IO)则是非阻塞IO,二者有什么区别呢?...主要体现在网络IO中,所以下面就围绕网络IO来说明,这里会涉及到传统的BIO、网络编程、反应器设计模式,如果不了解的童鞋这里有各自的传送门 BIO ,[未完善] 二者区别 BIO NIO 类型 同步阻塞...同步非阻塞 面向 面向流 面向缓冲区 组件 无 选择器 若没有了解过NIO,那么列出的区别只需有个印象即可,后面会逐步说明 2.BIO 2.1 传统BIO 传统的IO其读写操作都阻塞在同一个线程之中...,即在读写期间不能再接收其他请求 那么我们就来看看传统BIO是怎么实现的,后面都以网络编程的Socket为例,因其与后面的NIO有关 public class BIO { public...划重点:传统BIO在事件还没到达时该线程会被阻塞而等待,一次只能处理一个请求(可以使用多线程来提高处理能力)。而NIO在事件还没到达是非阻塞轮询监听的,一次可以处理多个事件。
16.BIO、NIO、AIO 有什么区别? BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。...NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。...AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
以上的两组概念可以两两组合,就组合了我们熟悉的BIO、NIO、AIO。 3....BIO方式适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,并发局限于应用中,在jdk1.4以前是唯一的io现在,但程序直观简单易理解。 4....NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,jdk1,4开始支持。...接下来用一个有味道的例子来描述一下以上的IO模型 BIO:去上厕所,坑位全满,此时我光等着,什么都不能做。主动观察哪个坑位好了,只要有坑位释放了,我就去占坑。...NIO:厕所的坑全满了,此时我可以去做点别的事情,然后再时不时的 主动去看 (Selector主动轮询)有没有坑位释放,如果有坑了就去占坑。
Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。...在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。 同步与异步 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。...BIO (Blocking I/O) 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。 传统 BIO BIO通信(一请求一应答)模型图如下(图源网络,原出处不明): ?...尤其在 Linux 这样的操作系统中,线程本质上就是一个进程,创建和销毁线程都是重量级的系统函数。...不过因为它的底层仍然是同步阻塞的BIO模型,因此无法从根本上解决问题。 代码示例 下面代码中演示了BIO通信(一请求一应答)模型。
1.linux系统中一切皆文件当有文件 当有一个请求过来的時候就通过3次握手就会和内核创建连接关系,此时Tomcat中的启动的的端口监控就会检测到内核中的文件标识符 fd 此时由linux提供的API...应用程序读根据文件标识符去读取文件流的过程也就是IO BIO BIO 也就是这个就是在当有一个client创的时候就会启动一个线程 因为是阻塞的IO,我们的accept方法时如果他没有消息过来这个线程会一直去监听这个...NIO 1.正是遇到了上述问题,所以我们就得解决问题,聪明的人就提出了BIO的概念,NIO也叫Non-Blocking IO 是同步非阻塞的IO模型。线程发起io请求后,立即返回(非阻塞io)。...Java中的NIO 是new IO的意思。 ?...普通的NIO是线程轮询查看一个IO缓冲区是否就绪,而Java中的new IO指的是线程轮询地去查看一堆IO缓冲区中哪些就绪,这是一种IO多路复用的思想。
NIO:同步非阻塞IO,客户端请求服务端,在服务端处理过程中,客户端可以去干其他的东西,也可以隔一段时间去询问服务端,是否已处理完成。...下面就来看一下BIO和NIO的使用方法。...因为传统的BIO在每当有一个客户端连接时,服务端就会创建一个线程去处理新的客户端链路,还有一个是伪异步,就是服务端用线程池去处理客户端的连接。 ?...二、同步非阻塞IO:NIO 与BIO的SocketServer、Socket对应的是,NIO提供了ServerSocketChannel和SocketChannel,这两种套接字支持阻塞和非阻塞,需要使用者进行配置阻塞...NIO有几个重要的关键点: (1)缓冲区Buffer:在NIO中,所有数据的读写都是需要通过缓冲区处理。
01 — 分析 BIO 过程 Socket 是什么呢,其实就是一个 有 IP地址+端口,并且持有文件描述符的对象,操作系统通过 ip + port 建立 TCP 连接;通过文件描述符来读取传输的数据。...socket.close(); } catch (IOException e) { e.printStackTrace(); } } } 02 — 分析 NIO
createExecutor(); } initializeConnectionLatch(); //启动poller 线程,nio...sc.run(); } catch (RejectedExecutionException rx) { ... } return true; } 3.4 总结 NIO...是可以多个线程来接受客户端的链接,这个和bio是一样的,不一样在于是NIO会把接受到的链接放入事件队列,然后多个poll线程会从事件队列获取事件,并且NIO可以每个poll线程去监听多个链接socket...的事件,然后交给线程池去处理,也就说一个poll 线程可以监听多个socket的读写事件,然后交给线程池去处理,这相比于bio节省了很多线程资源。...); } catch (RejectedExecutionException x) ... } return true; } 4.3 总结 可知BIO
模型 BIO 和 NIO 的区别 BIO 好比是通道传输,一来一回 NIO 好比是管道传输,一堆来一堆回。...BIO 模型 ________ _________ | |-----------------------| | | |-...面向流,通道传输的是流 NIO 模型 _________ _________ | |-----------------------|...| | | |-----------------------| | |-------| |-------| NIO
BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 ...NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 ...AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
---- IO 概述 IO 的操作方式通常分为几种:同步阻塞 BIO、同步非阻塞 NIO、异步非阻塞 AIO。 (1)在 JDK1.4 之前,我们建立网络连接的时候采用的是 BIO 模式。...BIO 与 NIO 一个比较重要的不同是, 我们使用 BIO 的时候往往会引入多线程,每个连接对应一个单独的线程;而 NIO 则是 使用单线程或者只使用少量的多线程,让连接共用一个线程。...(3)AIO 也就是 NIO 2,在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO 模型。...下面我们来详细介绍这几种 IO 方式 阻塞 IO (BIO) 基本理解 阻塞 IO(BIO)是最传统的一种 IO 模型,即在读写数据过程中会发生阻塞现象,直至 有可供读取的数据或者数据能够写入。...传统的 BIO 模式如下 图所示: 非阻塞 IO(NIO) 基于 BIO 的各种弊端,在 JDK1.4 开始出现了高性能 IO 设计模式非阻塞 IO(NIO)。
可以看到中间环节较多,java 的 IO 实际不是物理设备级别的读写,而是缓存的复制,底层的真正读写是操作系统来完成的 用户态与内核态的切换发生了 3 次,这个操作比较重量级 数据拷贝了共 4 次 NIO...DirectByteBuf 对象被垃圾回收,将虚引用加入引用队列 通过专门线程访问引用队列,根据虚引用释放堆外内存 减少了一次数据拷贝,用户态与内核态的切换次数没有减少 进一步优化(底层采用了 linux...数据从内核缓冲区传输到 socket 缓冲区,cpu 会参与拷贝 最后使用 DMA 将 socket 缓冲区的数据写入网卡,不会使用 cpu 只发生了一次用户态与内核态的切换 数据拷贝了 3 次 进一步优化(linux
BIO 和 NIO 的区别 BIO 好比是通道传输,一来一回 NIO 好比是管道传输,一堆来一堆回。...BIO 模型 ________ _________ | |-----------------------| | | |...面向流,通道传输的是流 NIO 模型 _________ _________ | |-----------------------|...| | | |-----------------------| | |-------| |-------| NIO
BIO, NIO, AIO,本身的描述都是在Java语言的基础上的。...而描述IO,我们需要从三个层面: 编程语言 实现原理 底层基础 从编程语言层面 BIO, NIO, AIO以Java的角度理解: BIO,同步阻塞式IO,简单理解:一个连接一个线程 NIO,同步非阻塞IO...NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题:在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。...可以理解的说明是:在Linux 2.6以后,java NIO的实现,是通过epoll来实现的,这点可以通过jdk的源代码发现。...Linux上还没有真正实现网络方式的AIO。
BIO属于同步阻塞式IO 服务端 网络编程的基本模型是从Client/Server模型,就是让两个进城之间进行通信,其中服务端提供服务地址跟端口,客户端根据ip,port进行连接 首先我们先进行服务端代码的编写工作
传统 BIO 编程是什么样的?...BIO 通信模型 对于每个客户端,服务端都要新建一个线程。 当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数量呈1:1的关系,当线程数膨胀后,系统的性能将急剧下降。...NIO 编程 首先问自己一个问题,什么才是NIO编程?对于NIO,官方的说法是:New I/O;但是更多的人喜欢称之为Non-block I/O(非阻塞I/O)。...BIO中的Socket类和ServerSocket类,对应于NIO中的SocketChannel和ServerSocketChannel两种不同的套接字通道实现,这两种套接字都支持阻塞和非阻塞两种模式。...NIO 类库简介 缓冲区 Buffer 在面向流的I/O中,可以直接读取或写入数据至Stream对象中;在NIO中,所有数据都是通过缓冲区处理的:读取数据时,直接读到缓冲区;写入数据时,写入到缓冲区。
Linux下实际使用比较多的是Linux AIO。 Linux AIO Linux中的另外一套AIO接口被称为Linux AIO,是Linux在内核实现的一套AIO接口。这套是"真・AIO"。...Linux提供了eventfd解决这个问题。 使用eventfd协调epoll和Linux AIO 如果在Linux下编写一个高性能文件服务器,就需要同时用到epoll和Linux AIO。...基于以上的这些问题,一般上层(nodejs,Java NIO)都会选择用线程池+BIO来模拟文件AIO。...好处是: BIO这一套接口非常完备,文件IO除了read,write,还有stat,fsync,rename等接口在现实中也是经常需要”异步“的; 编程容易。看看上面的例子,是不是非常容易晕。...BIO天然可以利用Page Cache来提高性能; 容易跨平台。不同操作系统的线程实现和BIO的实现基本上完备一致,不会像AIO那样细节差异相当巨大。
这也就引来一个很大的问题,当请求越多,服务器端的启用线程也要越多,我们都知道linux(window)的文件句柄数有是限的,默认是1024,当然可以修改,上限好像是65536 (一个柄也相当于一个socket...也相当于一个thread,linux查看文件句柄Unlimit -a)。...比如说政府一些网站,访问量比较少,可以使用基于BIO的web服务器实现。...同步非阻塞IO(NIO) 针对BIO的几个问题: 线程数量多,导致占用内存高,线程上下文切换开销大 IO请求会阻塞线程,导致并发高的情况下,响应慢 由此产生了NIO。...适用场景 适用于连接数比较多且连接比较长(重操作)的架构,比较相册服务器,充分调用OS参与并发操作,编程比较复杂,jdk7开始支持; 参考 BIO、NIO、AIO原理 Netty5 用户指南 BIO、NIO
BIO 有了Block的定义,就可以讨论BIO和NIO了。BIO是Blocking IO的意思。在类似于网络中进行read, write, connect一类的系统调用时会被卡住。...这时,BIO和NIO的区别是什么呢? 在BIO模式下,调用read,如果发现没数据已经到达,就会Block住。...操作系统并不会强制这俩必须得一起用——你可以用NIO,但不用IO多路复用,就像上一节中的代码;也可以只用IO多路复用 + BIO,这时效果还是当前线程被卡住。...Java NIO,nginx等在对应的平台的上都是使用这些api实现。 因为大部分情况下我会用Linux做服务器,所以下文以Linux epoll为例子来解释多路复用是怎么工作的。...总结 小结一下本文: 对于socket的文件描述符才有所谓BIO和NIO。 多线程+BIO模式会带来大量的资源浪费,而NIO+IO多路复用可以解决这个问题。
总结:通过BIO,读取硬盘的文件数据,要经历两次复制的操作,才能把数据读取到内存空间。 3、NIO NIO是同步非阻塞的IO操作。下图是NIO在进行IO操作时,数据流向过程。 ?...4、BIO/NIO文件拷贝测试 在本地同时拷贝一份400M的mp4资源,BIO跟NIO所消耗的时间比较。...因为考虑的不确定的因素可能会对测试结果造成影响,所以作者特地测试了三次,从结果来看,在tomcat中,使用nio后的性能确实比bio的性能好。 6、NIO在Redis中使用。...但是对于服务端来说,使用NIO比BIO在时间性能上提高了几千倍。 所以:BIO是阻塞的,而NIO是非阻塞的。NIO可以在BIO阻塞的时间上去处理别的操作,从而提高服务端性能。...7、IO模型图 BIO模型图: ? NIO模型图: ?
领取专属 10元无门槛券
手把手带您无忧上云