面试官:BIO、NIO、AIO 的区别是什么?






面试官:说一说多线程常见锁的策略

面试题:BIO,NIO,AIO的区别?

这是个网络编程的面试题:

在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。

同步

自己的理解:

也就是必须一件一件事做,等前一件做完了才能做下一件事 (提交请求->等待服务器处理->处理完返回 这个期间客户端浏览器不能干任何事 )

官方:

使用同步IO时,Java自己处理IO读写。


异步:

自己的理解:

请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

官方:

使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,完成后OS通知Java处理(回调)。

阻塞:

自己的理解:

阻塞就是说在煮水的过程中,你不可以去干其他的事情(性能和可靠性都不好)

官方:

使用阻塞IO时,Java调用会一直阻塞到读写完成才返回。


非阻塞:

自己的理解:

非阻塞就是在同样的情况下,可以同时去干其他的事情(对于低负载、低并发的应用程序)

官方:

使用非阻塞IO时,如果不能立马读写,Java调用会马上返回,当IO事件分发器通知可读写时在进行读写,不断循环直到读写完成。

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。

一、传统的BIO(同步阻塞的BIO)

就是说服务端一旦接受客户端的连接,就可以建立通信套接字在这个通信套接字上进行读写操作,此时不能再接收其他客户端连接请求,只能等待同当前连接的客户端的操作执行完成,不过可以通过多线程来支持多个客户端的连接,循环导致高cpu消耗。

服务器的实现模式是一个连接一个线程,这样的模式很明显的一个缺陷是:

由于客户端连接数与服务器线程数成正比关系,可能造成不必要的线程开销,严重的还将导致服务器内存溢出。当然,这种情况可以通过线程池机制改善,但并不能从本质上消除这个弊端。

问题:当出现高并发怎么办?

解决这个问题就有了下面的


二、NIO(同步非阻塞的NIO)。它支持面向缓冲的,基于通道的I/O操作方法

从JDK1.4以后开始,JDK引入的新的IO模型NIO

  • Channel(通道) :通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和Buffer交互。因为 Buffer,通道可以异步地读写。
  • Buffer(缓冲区) :Buffer是一个对象,它包含一些要写入或者要读出的数据
  • Selector(选择器) :选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。线程之间的切换对于操作系统来说是昂贵的。因此,为了提高系统效率选择器是有用的。

就是说加了三个功能来解决bio中的单线程一对多的问题

而服务器的实现模式是多个请求一个线程,即请求会注册到多路复用器Selector上,多路复用器轮询到连接有IO请求时才启动一个线程处理。

Java NIO: 单线程管理多个连接。

劣处:维护成本高,容易出现bug,项目大了之后消耗成本


三、AIO(异步非阻塞的AIO)

JDK1.7发布了NIO2.0也可以说是Nio的加强版,它是异步非阻塞的IO模型。

异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

这就是真正意义上的异步非阻塞,服务器的实现模式为多个有效请求一个线程,客户端的IO请求都是由OS先完成再通知服务器应用去启动线程处理(回调)。

应用场景:并发连接数不多时采用BIO,因为它编程和调试都非常简单,但如果涉及到高并发的情况,应选择NIO或AIO,更好的建议是采用成熟的网络通信框架Netty。

总结:理解了这,浓缩了还是有点东西的

  • BIO是一个连接一个线程。
  • NIO是一个请求一个线程。

  • AIO是一个有效请求一个线程。







END

1.为什么数据库连接池不采用 IO 多路复用?2.磁盘IO、CPU、JVM调优百科全书~3.牛逼!一个故事讲清楚 NIO 了!4.详解TCP网络协议栈的工作原理

我是技术管家,专心做内容,不割韭菜

分享技术成长之路,不忘初心,惠泽他人终身学习,与时俱进,点赞关注不迷路

相关推荐

  • 女同事35岁,五一节后再没露面,听说是被裁拿了10万,今天看到她退了群,但领导又反悔了,让她把10万补偿退回来。
  • [开源]一款多租户Saas快速开发平台,完全免费给个人及企业使用
  • 实操教程|称霸Kaggle的十大深度学习技巧
  • 早逝录:南林教师宋凯博士,因首聘期考核未过自杀身亡,享年38岁!
  • 可以一直做的低成本蓝海项目,适合新人练手
  • 每日 prompt:推荐这个风格画漫画
  • 谷歌也出大招了;字节推豆包大模型全家桶;Ilya Sutskever宣布退出OpenAI
  • OpenAI首席科学家Ilya离职,一个让马斯克与佩奇决裂的男人
  • 谷歌7大模型22项AI大招轰炸:70秒视频生成、Gemini安卓合体、200万tokens上下文
  • 腾讯混元文生图大模型全面开源!Sora同架构,更懂中文,免费商用
  • 字节豆包大模型发布!“比行业价格低99%”,对话火山引擎总裁谭待
  • 华为余承东履新后首次登台,Pura70“重新发布”,十七款重磅新品炸场
  • 打工人效率暴增神器!AI时代硬核办公图鉴,TWS耳机成全能会议助理
  • 全新的分布式锁,几行代码搞定,简单且强大
  • 32 个 Python 实例彻底解析 f-String 格式化浮点数 004【推荐收藏】
  • 京东秒送售后系统退款业务重构心得
  • 【腾讯云 BI 数据分析可视化大赛】有奖征文活动
  • 今天,创业4周年。
  • 混元文生图大模型正式开源:15 亿参数、首个中文原生DiT架构、与腾讯现网版本完全一致!
  • 都2024年了,串口通信还在用TTL?