Linux面试题2:网络IO模型 & IO多路复用

天天见闻 天天见闻 2023-03-17 教育 阅读: 152
摘要: 当用户进程运行read任务时,内核向用户空间复制数据是否同步,IO复用实际上是一个select/poll/epoll选择器,如果一个线程同时接收多个文件描述符(fd_set),当等待并且文件描述符可以读写时接收通知的linux,处理网络IO连接时linux的优化,每次调用2.Select时,都必须将fd_set集合复制到内核状态。Poll,如果逻辑fd_set为1字节byte,则执行。

先确定一下范围,我们讨论的都是网络IO,现阶段计算机早已经从CPU密集型转换成网络IO密集型,所以网络io的类型对于服务响应而言更重要。

五种IO模型

依据Unix的IO分类,网络IO分为五类

  • 阻塞IO(BlockingIO
  • 非阻塞IO(Non-Blocking IO
  • IO多路复用( IO Multiplexing
  • 信号驱动IO(signal driven IO
  • 异步IO(async IO
内核态和用户态

可见另一篇文章

网络IO的两阶段阶段
  1. 等待网卡读就绪 —> 将网卡数据复制奥内核缓冲区
  2. 将内核缓冲区的数据复制到用户空间

其中:第一阶段主要用来区分是否是阻塞IO

阻塞与非阻塞

进行一个IO操作之后,无论是否有数据、是否就绪,是否会立刻返回而不阻塞用户进程的逻辑。

当用户进程发出read操作时,如果kernel中的数据没有准备好,不会block用户进程,而是返回一个EAGAIN err。从用户的角度而言,发起一个读操作,不需要等待,马上得到了一个结果。

一旦kernel的数据准备好了,收到用户进程的一个systemcall,就会马上把数据拷贝到用户内存,然后返回。

同步与异步

第二阶段,内核将数据拷贝到用户空间是否是同步进行的,决定是否是异步IO;除了aync IO以外其他都是同步的IO模型。

面试回答 概述

IO多路复用实际就是select/poll/epoll这些多路选择器,使用一个线程同时监听多个文件描述符(fd_set), I/O事件,阻塞等待并且在某个文件描述符可读写时收到通知。linux在处理网络IO连接时的优化,复用的不是I/O连接,而是复用的是线程,让一个线程处理多个连接。

select/poll/epoll
选择器运行逻辑特点缺点
select1.最大并发数限制; 2.每次调用select,需要把fd_set集合拷贝到内核态;3.性能衰减严重
pollpoll与select类似,只是没有最大并发数限制
epoll
select
#include 
#include
#include int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); // 和 select 紧密结合的四个宏:
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);

运行逻辑

fd_set如果是1 字节byte, 1byte = 8bit,每一个bit可以表示一个文件描述符fd,则1byte的fd_set最大可以对应8个fd

  1. 执行 FD_ZERO(&set), 则 set 用位表示是 0000,0000
  2. 若 fd=5, 执行 FD_SET(fd, &set); 后 set 变为 0001,0000(第 5 位置 为 1)
  3. 再加入 fd=2, fd=1,则 set 变为 0001,0011
  4. 执行 select(6, &set, 0, 0, 0) 阻塞等待
  5. 若 fd=1, fd=2 上都发生可读事件,则 select 返回,此时 set 变为 0000,0011 (注意:没有事件发生的 fd=5 被清空)

特点

  1. 可以监控的文件描述符个数取决于 sizeof(fd_set)的值。如果 sizeof(fd_set) = 512, 每个bit表示一个文件描述符, 512 * 8 = 4096。
  2. 需要拷贝 fd_set,转换成一个array
  3. 需要循环fd_set,线性扫描整个fd_set

缺点

epoll

epoll是Linux Kernel 2.6之后引入的IO事件驱动技术,本质上还是一个线程处理所有链接的等待消息准备好IO事件。但是 当数十万的并发连接存在时,可能每一毫秒猪油数百个活跃的链接,同时其余数十万连接在这一毫秒是非活跃的,而select&poll的使用方法是 返回的活跃链接 == select(全部带监控的连接)

高频调用的接口是select()方法,而这个方法任何轻微的效率损失都会被高频两个字放大。epoll解决了这个问题.

#include 
int epoll_create(int size); // int epoll_create1(int flags);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

epoll的工作原理如下图:

  • epoll_ctl 来插入和删除一个fd,实现从用户态到内核态的拷贝,确保每一个fd只在生命周期一次拷贝。
  • epoll使用红黑树存储所有监控的fd,红黑树的时间复杂度O(logN)。
  • 每一个fd有一个关键步骤:fd回合相应的设备(网卡、硬盘)驱动程序建立一个回调关系,在fd相应的时间出发之后,内核就会调用这个回调函数,ep_poll_callback,这个回调函数会把fd添加到fdllist的双向链表(就绪列表之中)epoll_wait这个就是检查是否有就绪的fd,所以非常高效。
总结

以上是真正的电脑专家为你收集整理的Linux面试题2:网络IO模型 & IO多路复用的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得真正的电脑专家网站内容还不错,欢迎将真正的电脑专家推荐给好友。

其他相关
黑客推出Linux勒索软件:可加密VMware ESXi

黑客推出Linux勒索软件:可加密VMware ESXi

作者: 天天见闻 时间:2023-09-18 阅读: 74
2023-06-30 13:20:08 作者:人宝宝 近日,一款名为Akira的勒索软件引发了业内人士的关注。据了解,该软件的主要目标是VMWare的一系列软件,并且可以对用户的虚拟机镜像进行加密,用户只有支付高额赎金,才能找回被加密的文件。 此软件在今年3月首次被发现时,主要针对Windows电脑进行攻击,但现在黑客们已经推出了Linux版本,目的是对VMware的ESXi虚拟机进行加密。与其他同类型的Linux勒索软件相比,Akira凭借其更强大的加密能力与速度,让用户难以应对。 据专业人员分析,微观原因在于Akira软件样本中存在"加密档案比例"的变量选项,可能是为了让黑客可以根据每台受感染机器的不同情况,灵活控制对应的加密速度。 值得注意的是,尽管该勒索软件的影响范围暂时并不广泛,但从被相关组织报告的数据显示,该软件仍对北美个别地区的影响较大。因此,对于这款勒索软件,相关组织和用户仍需保持警惕,不能掉以轻心。...
盘符 两个字母(盘符 linux)

盘符 两个字母(盘符 linux)

作者: 天天见闻 时间:2023-03-18 阅读: 156
电脑盘符名称?电脑盘符是DOS、WINDOWS系统对于磁盘存储设备的标识符。请输入windows所在盘符。盘符是DOS、WINDOWS系统对于 磁盘存储设备的 标识符。Win+R键运行cmd:4、detail disk 显示选择的硬盘详细信息(显示的第一行是硬盘型号?linux多少盘符:引导分区盘符什么意思。一般Windows系统放着MBR或者是GPT等主引导记录的分区。...
Linux启动进程(启动linux进程)

Linux启动进程(启动linux进程)

作者: 天天见闻 时间:2023-03-17 阅读: 129
1. 开机启动时自动运行程序Linux加载后,可以使init自动启动其它程序。编辑/etc/rc.d/rc.local 文件(该文件通常是系统最后启动的脚本),2. 登录时自动运行程序用户登录时。bash先自动执行系统管理员建立的全局登录script,只需根据实际需要在上述文件中加入命令就可以实现用户登录时自动运行某些程序(类似于DOS下的Autoexec.bat)。...
linux c面试题目及答案(linux c面试题)

linux c面试题目及答案(linux c面试题)

作者: 天天见闻 时间:2023-03-16 阅读: 162
linux中内核空间及用户空间的区别?linux中系统调用过程?应用程序中read()在linux中执行过程即从用户空间到内核空间?查看驱动模块中打印信息应该使用什么命令?如何查看内核中已有的字符设备的信息?请分析chartest使用的是那一类设备驱动程序。设备驱动程序中如何注册一个字符设备?字符型驱动设备怎么创建设备文件?在具体应用上要不要先注册驱动再注册设备,内核函数mmap的实现原理。...
常见的MySQL语句

常见的MySQL语句

作者: 天天见闻 时间:2023-03-15 阅读: 141
...
mysql的查询、子查询和连接查询

mysql的查询、子查询和连接查询

作者: 天天见闻 时间:2023-03-15 阅读: 142
...
我来说两句

年度爆文