Java NIO 之 IO模型总结整理

简介:

    这里总结了常用的IO通信模型,列举了5种形式。

  1. 传统IO模型

  1. 1:1形式的同步阻塞IO通信模型 

  wKioL1neux3x3rGqAAEsu3KRvnE438.png

在基于传统同步阻塞模型中:

  • ServerSocket的主要作用?

    1、负责绑定IP地址

    2、启动监听端口;

  • Socket的主要作用?

    负责发起连接操作。

    连接成功后,双方通过输入输出流进(InputStream/OutputStream)行同步阻塞式通信

 

  • 通信过程:

    1)服务端通常由一个独立的Acceptor线程负责监听客户端的连接;

    2)Acceptor监听到客户端的连接请求后,为每个客户端创建一个新的线程进行链路处理;

    3)链路处理线程完成客户端请求的处理后,通过输出流返回应答给客户端,然后线程销毁。

  • 模型缺点:

    1)服务端线程个数与客户端并发访问连接数是11的关系;

    2)随着客户端并发访问量增大,服务端线程个数线性膨胀,系统性能急剧下降。

 

  1. M:N形式的同步阻塞IO通信模型

wKiom1nevqujo8B0AAEIxsiPETk123.png

服务端通过线程池来处理多个客户端的接入请求,通过线程池约束及调配服务端线程资源。

形成客户端个数M:服务端线程池最大线程数N的比例关系

 

通信过程:

    1)当有新的客户端接入时,将客户端Socket封装成一个Task投递到服务端任务队列;

    2)服务端任务线程池中的多个线程对任务队列中的Task进行并行处理;

    3)任务线程处理完当前Task后,继续从任务队列中取新的Task进行处理。

模型缺点:

    1BIO的读和写操作都是同步阻塞的,阻塞时间取决于对端IO线程的处理速度和网络IO的传输速度,可靠性差;

    2)当线程池中所有线程都因对端IO线程处理速度慢导致阻塞时,所有后续接入的客户端连接请求都将在任务队列中排队阻塞堆积;

    3)任务队列堆积满后,新的客户端连接请求将被服务端单线程Acceptor阻塞或拒绝,客户端会发生大量连接失败和连接超时。


  1. 非阻塞式IO模型(NIO)

基础知识

  1. NIO模型

    多路复用器Selector是NIO模型的基础,一个多路复用器Selector可以同时轮询多个注册在它上面的Channel,服务端只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端连接。

模型优点:

    1)NIO中Channel是全双工(是说可以通过Channel 即可完成读操作,也可以完成写操作)的,Channel比流(InputStream/OutputStream)可以更好地映射底层操作系统的API(UNIX网络编程模型中,底层操作系统的通道都是全双工的,同时支持读写操作);

    2)客户端发起的连接操作是异步的,不需要像之前的客户端那样被同步阻塞;(此时,客户端不依赖于服务器端,也就是说客户端发完请求可以做其他其他事情)

    3)一个Selector线程可以同时处理成千上万个client的请求,而且性能不会随着客户端链接的增加而线性下降;原因:JDK的Selector在Linux等主流操作系统上通过epoll实现,它没有连接句柄数的限制,适合做高性能高负载的网络服务器方案

  1. Reactor模式思想:

分而治之+事件驱动

 

1)分而治之

    一个connection里完整的网络处理过程一般分为6步:acceptreaddecodeprocessencodesend

    Reactor模式将每个步骤映射为一个Task,服务端线程执行的最小逻辑单元不再是一次完整的网络请求,而是Task,且采用非阻塞方式执行。

2)事件驱动

    每个Task对应一个特定事件,当Task准备就绪时,对应的事件通知就会发出。

Reactor收到事件通知后,分发给绑定了对应事件的Handler执行Task

 

  1.  NIO+单线程Reactor模式

wKioL1nevRKg3j8hAAHHygE1yNI551.png


说明:

    Reactor:负责响应事件,将事件分发给绑定了该事件的Handler处理;

    Handler:事件处理器,绑定了某类事件,负责执行对应事件的Task对事件进行处理;

    Acceptor:就是处理客户端链接connect事件的; Handler的一种,绑定了connect事件。当客户端发起connect请求时,Reactor会将accept事件分发给Acceptor处理。

 

模型优缺点

    a、单线程版本Reactor模型优点是不需要做并发控制,代码实现简单清晰;

    b、缺点是不能利用多核CPU,一个线程需要执行处理所有的acceptreaddecodeprocessencodesend事件,如果其中decodeprocessencode事件的处理很耗时,则服务端无法及时响应其他客户端的请求事件。

    

  1. NIO+多线程Reactor模式



wKiom1nev8mREIQaAAJLHBiUoX4173.png

    a、使用线程池执行数据的具体处理过程decodeprocessencode,提高数据处理过程的响应速度;

    bReactor所在单线程只需要专心监听处理客户端请求事件acceptreadwrite

 

此模型缺点:

    a、因为Reactor仍是单线程,无法并行响应多个客户端的请求事件(比如同一时刻只能read一个客户端的请求数据)。


  1. NIO+主从多线程Reactor模式



wKiom1nev8qC0XVvAAJYyn0_Ygc075.png

    a、采用多个Reactor,每个Reactor在自己单独线程中执行,可以并行响应多个客户端的请求事件;mainReactor 不再是一个单独的NIO线程,而是一个独立的NIO线程池处理链接请求,认证,登陆等操作

    Acceptor处理完成后,将事件注册到subReactor线程池中的某个IO线程上去,此IO线程继续完成后面的IO操作

    bNetty采用类似这种模式,boss线程池就是多个mainReactorworker线程池就是多个subReactor

    

总结:

    1、对IO模型整体有个认识,为以后使用IO模型积累经验

    2、为接下来深入分析Netty中的IO模型积累经验

    3、分而治之的思想,为以后做其他框架积累经验


















本文转自故新51CTO博客,原文链接: http://blog.51cto.com/xingej/1971598,如需转载请自行联系原作者




相关文章
|
30天前
|
监控 Java API
探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
43 3
|
1月前
|
存储 监控 Java
Java的NIO体系
通过本文的介绍,希望您能够深入理解Java NIO体系的核心组件、工作原理及其在高性能应用中的实际应用,并能够在实际开发中灵活运用这些知识,构建高效的Java应用程序。
46 5
|
2月前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
64 9
|
3月前
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
195 4
网络协议与IO模型
|
3月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
110 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
2月前
|
消息中间件 缓存 Java
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
零拷贝技术 Zero-Copy 是指计算机执行操作时,可以直接从源(如文件或网络套接字)将数据传输到目标缓冲区, 而不需要 CPU 先将数据从某处内存复制到另一个特定区域,从而减少上下文切换以及 CPU 的拷贝时间。
java nio,netty,kafka 中经常提到“零拷贝”到底是什么?
|
3月前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
52 2
|
3月前
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
27 3
|
3月前
|
缓存 Java Linux
硬核图解网络IO模型!
硬核图解网络IO模型!
|
3月前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
79 0

热门文章

最新文章