- 0. Java 线程IO模型
- 1. BIO
- 2. NIO
- 3. I/O多路复用(主要)
- 3.1 概念
- 3.2 实现
- 1. select
- 2. poll
- 3. epoll
- 4. AIO
- 5. 技术对比
- 5.1 BIO、NIO、I/O多路复用、AIO对比
- 5.2
select
、poll
、epoll
对比
- 6. 面试模拟
- 参考资料
0. Java 线程IO模型
Java当中的线程I/O模型如图所示:
1. BIO
当一个线程进行I/O操作的时候,传统的做法是阻塞等待,直到I/O操作完成再继续后续的操作,这种IO方式就是BIO(Blocking I/O)。
(资料图)
BIO方式的缺点是:
- 大量并发线程的场景下效率过低;
- 空等待浪费资源;
2. NIO
JDK1.4引入了NIO(No Blocking I/O或者是New I/O)。NIO是一种同步非阻塞的I/O模型,相对于BIO,NIO允许一个线程在I/O操作的时候处理其他任务,但是需要定期轮询检查I/O操作是否完成。NIO的缺点在于:
- 轮询的时间间隔不好把握;
- 一个线程处理一个I/O操作,如果存在大量I/O,处理其他任务和轮询操作反复切换状态,上下文切换开销大;
3. I/O多路复用(主要)
3.1 概念
为了解决NIO的缺点,Linux引入了I/O多路复用的机制,即一个线程可以同时监听多个I/O操作,当某个I/O操作完成后,会通知线程进行处理。多路指的是多个SOCKET连接之间的I/O操作,复用指的是共用一个线程。I/O多路复用的优点在于:
- 一个线程可以同时监听多个I/O操作,减少了线程的数量,避免了线程切换的开销;
需要注意的是,I/O多路复用只有和NIO配合使用才能发挥作用,因为NIO是非阻塞的,所以可以在一个线程中同时监听多个I/O操作,而BIO是阻塞的,一个线程只能处理一个I/O操作,所以无法实现I/O多路复用。
3.2 实现
I/O多路复用的实现思路:对于多个socket连接,程序提供一个文件描述符集合给系统,当某个接口的I/O操作完成后,会通知线程进行处理。
实现I/O多路复用的方式有三种:select
、poll
、epoll
。
1. select
函数原型如下所示:
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
- nfds:文件描述符的数量,即文件描述符集合中最大的文件描述符加1;
- readfds:读文件描述符集合;
- writefds:写文件描述符集合;
- exceptfds:异常文件描述符集合;
- timeout:超时时间;
从参数可以看出来select
方式监听读、写、异常事件。
select
根据监听的事件类型分别创建三个文件描述符数组,然后在timeout时间内阻塞线程进行监听,直到有事件发生或者超时。之后检查数组中是否有事件到达。select
的缺点在于:
- 文件描述符数组大小有限,为1024,因此对于高并发场景并不适用;
- 维持三个文件描述符数组,占据大量的内存空间;
- 每次调用
select
需要将数组从用户空间拷贝到内核空间,同时重新对数组进行遍历查找,效率低;
2. poll
函数原型如下所示:
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
- fds:文件描述符数组;
- ndfs:文件描述符数组的大小;
- timeout:超时时间;
本质的工作过程和select
类似,但是稍微做了改进,只需要构建一个数组,并且数组大小不受限制,而是能够自由指定;poll
的缺点在于:
- 每次调用
poll
之后都需要进行数组遍历,这一点并没有改进
3. epoll
为了解决select
和poll
的缺点,在高并发场景下,不同的操作系统引入了不同的解决方案,例如Linux引入了epoll
、FreeBSD引入了kqueue
、Solaris引入了/dev/poll
。由epoll
实现I/O多路复用,步骤如下:
- 先创建epoll对象:
int epfd = epoll_create(10);
其中,int epoll_create(int size)
会在内核空间开辟一块指定大小的数据表,并由epfd
指向这部分内存。2. 创建好epoll对象之后,使用epoll_ctl
将注册需要监听的事件:
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epfd
是创建数组之后的内存指针;op
是操作类型,包括三种模式:EPOLL_CTL_ADD
:添加需要监听的事件;EPOLL_CTL_MOD
:修改需要监听的事件;EPOLL_CTL_DEL
:删除需要监听的事件;
fd
是需要监听的文件描述符,需要支持NIO;event
记录了注册事件的具体信息。数据结构如下所示:
typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64;} epoll_data_t;struct epoll_event { uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */};
- 使用
epoll_wait
进行监听:epoll_wait
函数原型如下所示:
int epoll_wait(int epfd, struct epoll_event *evlist, int maxevents, int timeout);
epfd
是创建数组之后的内存指针;evlist
是用于存放事件的数组,也是返回的结果数组,包含被触发事件的对应文件描述符;- 这里显示了和
select
、poll
的区别,select
、poll
会返回所有文件描述符然后遍历,而epoll
只会返回被触发事件的文件描述符;
- 这里显示了和
maxevents
是监听事件的最大容量;timeout
是超时时间;监听步骤是block
的,也就是阻塞的,只有超时才会返回;
epoll的优点在于:
- 只返回触发事件的文件描述符,避免了整个数组的遍历;
- 支持水平触发(Level Trigger)和边缘触发(Edge Trigger)两种模式;
- 对于水平触发和边缘触发,具体解释可参考这篇博客;
4. AIO
AIO(Asynchronous I/O),即异步非阻塞I/O模型,AIO的实现方式是基于事件和回调机制的,当一个I/O操作完成后,会通知线程进行处理,因此不需要轮询操作。
AIO和NIO的区别在于:
- NIO:线程需要定时检查I/O操作是否完成;
- AIO:安心去做其他事情,等到通知之后才会进行处理;
5. 技术对比
5.1 BIO、NIO、I/O多路复用、AIO对比
5.2 select
、poll
、epoll
对比
6. 面试模拟
Q:IO多路复用是什么意思?A:IO多路复用指的是一个线程管理多个IO连接,监听多个IO事件;
Q:NIO的具体含义A:NIO一般理解为Not Blocking IO,即非阻塞IO,和传统的BIO(阻塞IO)相比,NIO模型中,一个线程在IO操作的时候可以处理其他任务,定期轮询检查IO操作是否完成
Q:基于什么实现的I/O多路复用?A:传统的实现方式包括
select
、poll
,但是这两类方法都需要遍历数组,效率较低,为此不同的操作系统提出了不同的改进方案,例如solaris提出了/dev/poll
,FreeBSD提出了kqueue
,Linux提出了epoll
,而epoll
相比于select
、poll
的主要区别就是返回的事件列表只包括触发事件的文件描述符,而不是全部监听事件的文件描述符,改进了数组遍历这一监听方式。
参考资料
- 一文彻底理解Java IO模型(阻塞IO非阻塞IO/IO多路复用)
- IO多路复用机制详解
- 讲讲BIO和NIO以及IO多路复用
关键词:
- 家电行业进入多元化 我国智能家电市场规模进一步增
- 佛山向欧盟出口供暖设备同比增长154.4% “暖家电”
- 格兰仕家用电器持续增持 占公司总股本1.24%
- 面板厂商持续加码产能 OLED能否迎来爆发式增长?
- 洗鞋机是一匹“黑马”吗? 能否创造下一个风口
- 8月空调行业最忙碌 它们将哪些新动作又将如何惊艳
- 【后端面经-Java】I/O多路复用 简录
- ESR于7月7日斥资567.85万港元回购45万股
- 上汽合资品牌6月销量全线走低
- 腾讯云行业大模型的“面子”和“里子”
- 绿色金融为节能减排装上“加速器”(财经故事)
- 根据个人理财网站Bankrate的一项最新调查,美国人需
- 高温天气新能源汽车如何顶住“烤”验?一个系统搞定
- 以色列安保人员在东耶路撒冷打伤一名巴勒斯坦持刀女
- 10年“永恒”长约一季缘尽!莱万特当家球星跳槽瓦伦
- 豆类下方支撑仍强
- 全球并购市场喜忧并存
- 红米小金刚千元直降500
- 第二十届中国·内蒙古草原文化节开幕
- 多名未成年人入店抢劫致人死亡?警方回应
- 红旗新车8AT变速箱 动力猛如狗
- 年假从什么时候开始算是交社保吗(年假从什么时候开
- 超1000项政务服务事项在普陀可跨省通办!
- 中国国家地理摄影基地授牌仪式在延安市甘泉大峡谷景
- 本田CB300R,售价不变,新亮黄外观抢眼
- 壮乡留守妇女玩转“新农活” 直播带货既能卖果也能
- “无人车”又有好消息!首批已发放→
- 国博新禁令!“静音”为游客负责,“去噪”对历史负
- 中蒙两国重启高勒毛都2号墓地考古发掘工作
- 杭州上城区亚运疫情演练全保障
- “两岸学者面对面”共议闽南文化
- 俄乌局势进展:联合国称冲突致逾2.5万名平民伤亡
- 民生证券:给予瑞联新材买入评级
- 安徽颍上:科技创新“强引擎” 跑出经济“加速度”
- 益生股份6月份白羽肉鸡苗销售收入同比增长48.94%
- 跳进地理书的旅行 S01E02 || 保不齐严格的法律人
- 捷信逾期欠了10多天会坐牢吗
- 从三苏祠出发 音乐剧《苏东坡》启动全国巡演
- 46岁韩国女歌手李尚恩演出前死在厕所,警方:将进行
- 央视《新闻直播间》寻访镇江文宗阁
- 华晨宇首秀电竞职业舞台 数据糟糕再引网友质疑
- 恒生电子:蚂蚁集团所涉罚款预计对公司本年度财务报
- 乌克兰国防部承认袭击克里米亚大桥 乌方终于承认了
- “影响世界华人盛典”落幕 史学大家许倬云获终身
- “史墙”之子“兴”所铸青铜壶 有哪些特别之处?|
- 日媒评《FF16》缺乏新鲜感 难以成为PS5独占代表作
- 海陆空全覆盖 京津雄半小时通达
- 棕色尘埃设置中文方法
- 奥萨尔4中1遭美记嘲讽:火箭捡漏白魔扎心活塞 两人
- 上海庄行伏羊节
- 女性所想要的素颜的究极追求是什么?想无惧素颜告别
- 济宁职业技术学院有什么专业介绍_济宁职业技术学院
- “零食大王”要退市!原因竟是→
- 加纳乔晒合照告别德赫亚:你值得拥有最好的一切
- 民生证券给予亚太股份推荐评级,2023年半年度业绩预
- 在新征程上继续当好排头兵
- 广州一女子向餐馆免费汤、调料盒投放不明液体,顾客
- 科苑小学召开2022-2023学年第二学期期末学业质量分析会
- 北京丽泽金融商务区入驻企业超千家 “金融+科技”
- #你不买苹果手机的原因是什么#
- 6年长约+1亿签字费!当世第二人无悬念,巴黎默许,
- 云南省临沧市2023-06-26 03:54发布雷电黄色预警
- 十年超5万起补贴措施!日媒:补贴竞赛给全球自由贸
- 2023年5月大宗商品-三氯甲烷价格分析:价格为2275元
- 探花亨德森因为肩膀需要休息将缺席明天对马刺的比赛
- 东道主业余球员陈暄尹夺得新加坡女子高尔夫大师赛冠
- 高温橙色预警!河北、河南、山东、浙江等局地气温可
- 伊朗外长:伊方愿同苏丹恢复外交关系
- 连续5天出战!西西帕斯三盘横扫晋级,时隔5年再进温
- 让牛排变嫩的四大妙招?
- 意媒:卢卡库只想留在国米,拒绝尤文&沙特&英超邀请
- 从汉字起源到书体演变 翻开这本“汉字中国版”的《
- 经济师考试-公共科目成绩在有效期内,但专业科目尚
- 景区爆满、演出售罄!北京迎暑期旅游高峰
- 某网红买200万保险挑战海鲜市场,丢脸的是市场,打
- 大太刀断了怎么修补(大太刀断了怎么修)
- 十八般武器图片和名称(十八般武器分别是什么)
- 莫高窟·飞天(关于莫高窟·飞天的简介)
- 畅快玩水 夏日狂欢
- 一次抽象艺术与学术的对话 “绘画交换形象”抽象
- 10.6生死战看看国足主力球员年薪郜林税后年薪达到了
- 上海海事大学就业网站 高级航运人才的摇篮)
- 大运知多少 一起了解成都大运会火炬“蓉火”背后的
- “艾莉”之外的李彩桦:来成都会友、玩滑板,感受成
- 小米语音播报
- 丁磊:用最快速度探索AI大模型应用是首要任务
- 贵州:大力发展“避暑经济”,促进绿水青山的生态价值
- 潮都南阳 舞出最美潮文化
- 知名男星被曝遭女友长期控制欺凌!他曾被誉为“最帅
- 古都文旅消费向深度沉浸式转变 新职业、新商圈、新
- 【电商快评】蚂蚁、腾讯领百亿罚单 平台企业金融业
- 11部门联合部署开展论坛活动专项清理整治
- 《走遍更好潍坊》走进寿光仓颉汉字文化艺术馆
- 金色朝阳少儿定期保险是什么意思?好不好?
- 扫城、扫路、扫楼、扫网 郑州郑东警方集中行动守护
- 快来打卡沉浸式电影潮玩地——长春电影嘉年华
- 步步皆“高光”,星途星纪元进阶之路蹄疾步稳
- 姆巴佩:巴黎是一支分裂的球队&不会帮到我,我不会
- 淄博烧烤走红三个月,暑假旅游再迎高峰:八大局游客
- 国乒锁定一冠!孙颖莎王楚钦丢局,梁靖崑钱天一从资
- Here we go!罗马诺:伯恩利签多特19岁中卫库利巴
- 中国哈尔滨获得2025年第九届亚冬会举办权
- 价值8亿美元!美第42次向乌发“军援”!包括多国禁
- 定了!2025年亚冬会在哈尔滨
- 禁止进口日本福岛等十个县(都)食品
- 电脑远程可以看到微信么