前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这么回答offer拿到手软,谈谈你对IO多路复用机制的理解

这么回答offer拿到手软,谈谈你对IO多路复用机制的理解

作者头像
Tom弹架构
发布2023-04-28 11:11:15
2110
发布2023-04-28 11:11:15
举报
文章被收录于专栏:Tom弹架构Tom弹架构

一位工作5年的小伙伴面试时被问到IO相关的问题,说,谈谈你对IO多路复用机制的理解。当时他说只是听过多路复用,具体细节没有了解过。今天,我给大家分享一下我的理解。

1 IO多路复用

ENTER TITLE

IO多路复用是一种同步的IO模型。利用IO多路复用模型,可以实现一个线程监视多个文件句柄;一旦某个文件句柄就绪,就能够通知到对应应用程序进行相应的读写操作;没有文件句柄就绪时就会阻塞应用程序,从而释放出CPU资源。

ENTER TITLE

IO可以理解为,在操作系统中,数据在内核态和用户态之间的读、写操作,大部分情况下是指网络IO;

ENTER TITLE

多路大部分情况下是指多个TCP连接,也就是多个Socket 或者多个Channel;

ENTER TITLE

复用是指复用一个或多个线程资源。IO多路复用意思就是说,一个或多个线程处理多个 TCP 连接。尽可能地减少系统开销,无需创建和维护过多的进程/线程。

ENTER TITLE

实现IO多路复用的模型有三种,分别是Select、poll 和 epoll。下面详细介绍一下三种多路复用模型的基本原理和优缺点:

2 select模型

ENTER TITLE

select模型,它的基本原理是,采用轮询和遍历的方式。也就是说,在客户端操作服务器时,会创建三种文件描述符,简称FD。分别是writefds(写描述符)、readfds(读描述符)和 exceptfds(异常描述符)。

ENTER TITLE

而select会阻塞监视这三种文件描述符,等有数据、可读、可写、出异常或超时都会返回;

ENTER TITLE

返回后通过遍历fdset,也就是文件描述符的集合,来找到就绪的FD,然后,触发相应的IO操作。

ENTER TITLE

它的优点是跨平台支持性好,几乎在所有的平台上支持。

ENTER TITLE

它的缺点也很明显,由于select是采用轮询的方式进行全盘扫描,因此,随着FD数量增多而导致性能下降。

ENTER TITLE

因此,每次调用select()方法,都需要把FD集合从用户态拷贝到内核态,并进行遍历。而操作系统对单个进程打开的FD数量是有限制的,一般默认是1024个。虽然,可以通过操作系统的宏定义FD_SETSIZE修改最大FD数量限制,但是,在IO吞吐量巨大的情况下,效率提升仍然有限。

3 poll模型

ENTER TITLE

poll 模型的原理与select模型基本一致,也是采用轮询加遍历,唯一的区别就是 poll 采用链表的方式来存储FD。

所以,它的优点点是没有最大FD的数量限制。

ENTER TITLE

它的缺点和select一样,也是采用轮询方式全盘扫描,同样也会随着FD数量增多而导致性能下降。

ENTER TITLE

4 epoll模型

由于select和poll都会因为吞吐量增加而导致性能下降,因此,才出现了epoll模型。

epoll模型是采用时间通知机制来触发相关的IO操作。它没有FD个数限制,而且从用户态拷贝到内核态只需要一次。它主要通过系统底层的函数来注册、激活FD,从而触发相关的 IO 操作,这样大大提高了性能。主要是通过调用以下三个系统函数:

ENTER TITLE

1、epoll_create()函数,在系统启动时,会在Linux内核里面申请一个B+树结构的文件系统,然后,返回epoll对象,也是一个FD。

ENTER TITLE

2、epoll_ctl()函数,每新建一个连接的时候,会同步更新epoll对象中的FD,并且绑定一个 callback回调函数。

ENTER TITLE

3、epoll_wait()函数,轮询所有的callback集合,并触发对应的 IO 操作

ENTER TITLE

所以,epoll模型最大的优点是将轮询改成了回调,大大提高了CPU执行效率,也不会随FD数量的增加而导致效率下降。当然,它也没有FD数量限制,也就是说,它能支持的FD上限是操作系统的最大文件句柄数。一般而言,1G 内存大概支持 10 万个句柄。分布式系统中常用的组件如Redis、Nginx都是优先采用epoll模型。

ENTER TITLE

它的缺点是只能在Linux下工作。

5 综合对比

下表是三种多路复用模型的综合对比,有兴趣的小伙伴可以截图保存一下,或者到我的个人煮叶简介中获取。

ENTER TITLE

好了,以上就是我对IO多路复用机制的理解。

另外,5/6/7月份资料文档已打包,包含如下↓(还在持续更新中!):

①100道最新大厂经典面试题解析资料文档!

②20万+字Java面试题解析和配套答案!

③从应届生到高级开发都使适用的简历模板!

④从入门到精通的架构师学习路线图!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tom弹架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档