NIO概述

Non-Blocking I/O,是一种非阻塞通信模型。

BIO和NIO的对比

BIO NIO
1.阻塞通信模型,典型代表是ServerSocket 和Socket accept connect read write 会产生阻塞。所以 BIO通信模型的弊端在于:如果有大量请求,会创建大量线程,一是可能造成内存溢出,此外,线程多了之后,会造成cpu的负载过高,因为要做线程管理和上下文切换。 虽然引入线程池,也未能解决根本问题,因为底层还是同步阻塞模型。 同步阻塞模型一是性能低,二是不可靠,取决于对端环境。 2.面向流处理,即阻塞最根本的原子在于流的read和wirte方法是阻塞方法 1.非阻塞通信模型 2.面向缓冲区(Buffer) 3.NIO传输数据的方式:把数据放到缓冲区,然后通过Channel进行传输。

BIO和NIO的适用场景

NIO的适用场景:高并发,高访问量,短请求

BIO的使用场景:访问量少,长请求(比如下载一个大文件等场景)
在这里插入图片描述

NIO中的几个基础概念

在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Selector(选择器)。

Channel和传统IO中的Stream很相似。虽然很相似,但是有很大的区别, 主要区别为:通道是双向的,通过一个Channel既可以进行读,也可以进行写;而Stream只能进行单向操作,通过一个Stream只能进行读或者写;

Buffer,故名思意,缓冲区,实际上是一个容器,是一个连续数组。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。

从一个客户端向服务端发送数据,然后服务端接收数据的过程。客户端发送数据时,必须先将数据存入Buffer中,然后将Buffer中的内容写入通道。服务端这边接收数据必须通过Channel将数据读入到Buffer中,然后再从Buffer中取出数据来处理。

Selector类是NIO的核心类,Selector能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时, 才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线 程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。

猜你喜欢

转载自blog.csdn.net/qq_42306104/article/details/85762308
NIO
今日推荐