几种 IO编程比较

几种 IO编程比较参考:Netty权威指南第一版Java网络IO编程总结(BIO、NIO、AIO均含完整实例代码)1.传统的BIO模型通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行处理,处理完之后,通过流返回应答给客户端,线程销毁。这就是典型的—请求—应答通信模型。该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发量增加后,服务端的线程

大家好,又见面了,我是你们的朋友全栈君。

参考:
Netty权威指南第一版
Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

1. 传统的BIO模型

通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行处理,处理完之后,通过流返回应答给客户端,线程销毁。这就是典型的—请求—应答通信模型。

该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发量增加后,服务端的线程个数和客户端并发访问呈1:1的正比关系,由于线程是java虚拟机非常宝贵的系统资源,当线程数膨胀以后,系统的性能将急剧下降,随着并发访问量的继续增大,系统会发生线程堆溢出、创建新线程失败等问题,并最终导致进程宕机或者僵死,不能对外提供服务。

2. 伪异步IO编程

对同步阻塞IO面临的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M :线程池最大线程数N的比例关系,其中M可以远远大于N,通过线程池可以灵活的调配线程资源,设置线程的最大值,防止由于海量并发接入导致线程耗尽。

该方式避免了为每个请求都创建一个独立线程造成的线程资源耗尽。但是由于它底层的通信依然采用同步阻塞模型,因此无法从根本上解决问题。

分析:
如果每个read操作都阻塞,导致线程池很快饱和,将不能继续处理新的请求,导致服务不可用。

3. NIO编程

相关概念:

  1. 缓冲区Buffer

    • ByteBuffer:字节缓冲区
    • CharBuffer:字符缓冲区
    • ShortBuffer:短整型缓冲区
    • IntBuffer:整型缓冲区
    • LongBuffer:长整型缓冲区
    • FloatBuffer:浮点型缓冲区
    • DoubleBuffer:双精度浮点型缓冲区
  2. 通道

  3. 多路复用Selector

4. AIO编程

JDK1.7 提供了NIO2.0, 引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供两种方式获取操作结果:

  • 通多java.util.concurrent.Future类来表示异步操作的结果
  • 在执行异步操作的时候传入一个java.nio.channels

NIO2.0 的异步套接字通道是真正的异步非阻塞IO,它对应UNIX网络编程中的事件驱动IO(AIO),它不需要通过多路复用器(Selector)对注册的通道进行轮训操作即可实现异步读写,从而简化NIO的编程模型。

AIO是真正的异步非阻塞的,所以,在面对超级大量的客户端,更能得心应手。

5. 4种IO比较

概念澄清

  • 异步非阻塞IO

    很多人习惯将JDK1.4提供的NIO称为异步非阻塞IO,其实严格按照UNIX网络编程模型和JDK实现区分,实际上它只能被称为非阻塞IO,不能叫做异步非阻塞IO。在早期JDK1.4和1.5 update10版本之前,JDK的Selector基于select/poll模型实现,它是基于IO复用技术的非阻塞IO,不是异步IO。在JDK1.5 update10和Linux core2.6以上,Sun优化了Selector的实现,它在底层使用epoll替换了select/poll,上层的API没有变化,可以认为是JDK NIO的一次性能优化,但是它仍旧没有改变IO的模型。

    JDK1.7提供的NIO2.0才真正的异步IO。

  • 多路复用器Selector

    将Selector翻译成选择器体现不出Selector的功能和特点,翻译为多路复用器更为合适。

  • 伪异步

    伪异步IO完全来自实践,后端采用线程池来处理IO任务。

对比

IO模型对比

结语

具体代码可查阅《Netty权威指南》或者参考博客Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132487.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • css怎么改鼠标样式,如何利用CSS改变鼠标的样式

    css怎么改鼠标样式,如何利用CSS改变鼠标的样式各种各样的鼠标样式,对于经常使用电脑的人而言一定不会生疏。当鼠标移动到不同的地方时,当鼠标执行不同的功能时,鼠标的外形都会发生变化。但在网页上,貌似只有当鼠标在超级链接上时才出现一个手形,在其它地方似乎没有什么变化,同布满动感的网页显得不怎么和谐。实际上,用css可以方便地定义许多种鼠标外形。下面小编就为大家介绍一下怎样利用CSS改变鼠标的样式。用CSS改变鼠标的样式,我们使用cursor属性,现…

    2022年5月31日
  • git 提交代码常用命令

    git 提交代码常用命令 一、master分支代码提交过程 gitlog 查看git合入的记录    gitpull从服务器重新拉代码,将本地代码更新为服务器上的最新代码 gitstatus查看本地代码状态,是否有待提交的代码  git add.  将本地代码全部提交  gitcommit-m"合入新的PUCCH和小区功率代码"   为本次提交添加注释 …

    2022年6月26日
  • OA工作流-Activiti(一)[通俗易懂]

    OA工作流-Activiti(一)[通俗易懂]OA工作流-Activiti(一)一、工作流定义工作流:一系列相互衔接、自动进行的业务活动或任务。OA工作流:建立于网络办公自动化基础上的事务行政审批,业务申请审批、公文、信息等的网上流转。它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。    不同于以往我们在仅仅进行增删改查(CRUD),我们还…

    2022年6月23日
  • 3.7v锂电池升压电路_电池升压

    3.7v锂电池升压电路_电池升压FS2114的PCB布局设计建议-基础篇开关电源的一个常见问题是“不稳定”的开关波形。有时,波形抖动很明显,可以听到从磁性元件发出噪声。如果问题与印刷电路板(PCB)布局有关,则很难确定原因。EMC也是很注重(PCB)布局,这就是为什么在开关电源设计的早期正确布局PCB至关重要的原因。其重要性不可夸大。原理图走线主要器件放置并联一个旁路电容0.1uFLX节点FB反馈电阻R1,R2COUT电容容易影响输出的布线功率组件的推荐焊盘图案GND功率地的PCB布线电感器选择概述FS2

    2022年10月7日
  • linux之文件操作

    1.文件操作思维导图2.linux系统目录结构及简单说明linux目录图:root启动Linux时使用的一些核心文件。如操作系统内核、引导程序Grub等。home存储普通用户的个人文件

    2021年12月28日
  • 很挫的 SHFileOperation 用法 2011-07-18 11:42「建议收藏」

    很挫的 SHFileOperation 用法 2011-07-18 11:42「建议收藏」今天编写一个局域网文件拷贝的demo。其中有一个SHFileOperation的用法,这个函数有个参数SHFILEOPSTRUCT。查看msdn有如下解释:pFromAddressofa

    2022年7月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号