Java的NIO模型

简介: Java经典八股文之NIO模型

Java相关文章


IO的本质

  1. 操作系统分为用户空间内核空间
  2. 任何io事件都分为两个过程
  1. 用户空间发起读写请求到内核空间,等待内核空间数据就绪
  2. 内核空间数据准备好拷贝到用户空间
  1. 等待数据就绪阶段是否发生阻塞等待可以将io时间分为阻塞io非阻塞io
  2. 如果等待就绪阶段与内核数据拷贝阶段都阻塞的话为同步io,都不阻塞则为异步io


BIO

  1. 首先在服务端启动一个ServerSocket来监听网络请求,客户端启动Socket发起网络请求,默认情况下SeverSocket会建立一个线程来处理此请求,如果服务端没有线程可用,客户端则会阻塞等待或遭到拒绝。
  2. 如果要让 BIO 通信模型能够同时处理多个客户端请求,就必须使用多线程(主要原因是 socket.accept()、socket.read()、 socket.write()都是阻塞的


NIO

  1. 同步非阻塞IO模型的实现
  2. 提供了与传统BIO模型中的SocketServerSocket相对应的SocketChannelServerSocketChannel两种不同的套接字通道实现。
  3. 本身想解决 BIO的并发问题,通过Reactor模式的事件驱动机制来达到Non Blocking的。当 socket 有流可读或可写入 socket 时,操作系统会相应的通知应用程序进行处理,应用再将流读取到缓冲区或写入操作系统。
  4. 在NIO中,基本所有的IO操作都是从Channel开始的,Channel通过Buffer(缓冲区)进行读写操作。
  5. 多路复用器Selector组件用于轮询一个或多个NIO Channel的状态是否处于可读、可写。通过轮询的机制就可以管理多个Channel,也就是说可以管理多个网络连接。
  6. 客户端与服务器之间通过channel通信,nio可以在channel进行读写操作,chandel都被注册到selector多路复用器上,selector通过一个线程轮询channel找到就绪的channel执行io
  7. bio面向流操作,nio面向管道,channel读写同时操作
  8. selector轮询出所有注册管道,然后通过SelectionKey可以取得就绪的Channel集合,从而进行后续的IO操作
  • 核心组件
  1. Selector: 多路复⽤器,轮询检查多个 Channel 的状态,判断注册事件是否发⽣,即判断 Channel 是否处于可读或可写状态。使⽤前需要将 Channel 注册到 Selector,注册后会得到⼀个 SelectionKey,通过 SelectionKey 获取 Channel 和 Selector 相 关信息。
  2. Channel: 双向通道,替换了 BIO 中的 Stream 流,不能直接访问数据,要通过 Buffer 来读写数 据,也可以和其他 Channel 交互。
  3. Buffer: 缓冲区,本质是⼀块可读写数据的内存,⽤来简化数据读写。Buffer 三个重要属性: position 下次读写数据的位置,limit 本次读写的极限位置,capacity 最⼤容量。 flip 将写转为读,底层实现原理把 position 置 0,并把 limit 设为当前的 position 值。 clear 将读转为写模式(⽤于读完全部数据的情况,把 position 置 0,limit 设为 capacity)。 compact 将读转为写模式(⽤于存在未读数据的情况,让 position 指向未读数据的下⼀ 个)。 通道⽅向和 Buffer ⽅向相反,读数据相当于向 Buffer 写,写数据相当于从 Buffer 读。  




相关文章
|
3天前
|
存储 Java 数据处理
|
3天前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
8 2
|
3天前
|
消息中间件 存储 Java
Java与Go的生产者消费者模型比较
【4月更文挑战第20天】
20 1
|
3天前
|
缓存 Java API
Java NIO和IO之间的区别
NIO(New IO),这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
17 1
|
3天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
|
3天前
|
存储 监控 Java
浅谈Java NIO
浅谈Java NIO
7 0
|
3天前
|
消息中间件 存储 Java
【Java NIO】那NIO为什么速度快?
是这样的,在NIO零拷贝出现之前,一个I/O操作会将同一份数据进行多次拷贝。可以看下图,一次I/O操作对数据进行了四次复制,同时来伴随两次内核态和用户态的上下文切换,众所周知上下文切换是很耗费性能的操作。
31 1
【Java NIO】那NIO为什么速度快?
|
3天前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java NIO是一种高效I/O库,特征包括非阻塞性操作、通道(如文件、网络连接)、缓冲区和选择器。选择器监控通道状态变化,通知应用程序数据可读写,避免轮询,提升性能。示例代码展示了一个使用NIO的服务器,监听连接、读取数据并处理客户端通信。
14 1
|
3天前
|
Java API
java中IO与NIO有什么不同
java中IO与NIO有什么不同
|
7月前
|
存储 Java API
Java NIO+示例代码
Java NIO(New IO)是 JDK 1.4 引入的一组新的 I/O API,用于支持非阻塞式 I/O 操作。相比传统的 Java IO API,NIO 提供了更快、更灵活的 I/O 操作方式,可以用于构建高性能网络应用程序。 Java NIO 的主要组成部分包括: 1. Channel:通道是一个在应用程序和文件、网络套接字之间的连接。可以通过通道来进行数据的读取和写入。 2. Buffer:缓冲区是一个容器,用于存储数据。在 NIO 中,所有的数据读取和写入都是通过缓冲区进行的。 3. Selector:选择器用于监听多个 NIO 通道的事件,如读写事件。当某个通道发生事件时,选
52 0