首页 > 其他分享 >I/O多路复用

I/O多路复用

时间:2024-10-12 13:18:37浏览次数:7  
标签:文件 多路复用 epoll 描述符 fd select

I/O多路复用(I/O Multiplexing)是一种可以让程序同时监视多个文件描述符(包括网络套接字、管道、文件等)的机制。通过这种技术,程序无需为每个 I/O 操作都创建一个线程或进程,而是可以在一个线程或进程内管理多个 I/O 操作,从而提高资源利用率和系统的并发处理能力。

以下是 I/O 多路复用的详细知识点及常见面试问题。


1. I/O多路复用的概念

I/O 多路复用的核心思想是:通过一种机制,使得程序可以同时监视多个 I/O 事件,并在其中的一个或多个 I/O 事件就绪时,通知应用程序进行相应的处理

与传统的阻塞 I/O 方式相比,I/O 多路复用允许应用程序不必为每一个 I/O 操作创建一个独立的线程或进程,而是使用一个线程同时等待多个文件描述符的事件(如可读、可写、异常等)。


2. 常见的 I/O 多路复用模型

常见的 I/O 多路复用实现包括:

  • select
  • poll
  • epoll(Linux 独有)
  • kqueue(BSD 系统,如 macOS)
  • IOCP(Windows)
(1) select
  • 功能select 可以同时监视多个文件描述符的状态(可读、可写、异常)。它通过传递三个集合(可读集合、可写集合、异常集合)来判断文件描述符的状态。
  • 特点
    • 文件描述符数量有限制(通常为 1024 或 2048)。
    • 每次调用 select 都需要重新填充文件描述符集,因此效率较低。
    • 采用轮询的方式检查每个文件描述符的状态。
  • 使用示例
    fd_set readfds;
    FD_ZERO(&readfds);
    FD_SET(socket_fd, &readfds);
    select(max_fd + 1, &readfds, NULL, NULL, NULL);
    if (FD_ISSET(socket_fd, &readfds)) {
        // socket_fd 可读
    }
    

(2) poll
  • 功能pollselect 类似,也可以监视多个文件描述符的状态,但它使用 pollfd 结构体数组来存储文件描述符及其事件。
  • 特点
    • 没有文件描述符数量的限制(取决于系统内存)。
    • 每次调用时仍需要遍历整个文件描述符数组。
    • 每次调用都要重新初始化数组,效率不高。
  • 使用示例
    struct pollfd fds[2];
    fds[0].fd = socket_fd;
    fds[0].events = POLLIN;
    poll(fds, 2, timeout);
    if (fds[0].revents & POLLIN) {
        // socket_fd 可读
    }
    

(3) epoll
  • 功能epoll 是 Linux 专有的 I/O 多路复用机制,针对大量文件描述符监控进行了优化。它提供了三种操作模式:epoll_createepoll_ctlepoll_wait
  • 特点
    • 没有文件描述符数量限制。
    • 只需在文件描述符的状态发生变化时通知程序,不需要轮询所有文件描述符。
    • epoll 支持两种模式:水平触发(Level-triggered, LT)和边缘触发(Edge-triggered, ET)。
    • ET 模式下只有在 I/O 事件发生时才会通知,需要一次性读取或写入所有数据。
  • 使用示例
    int epoll_fd = epoll_create(1);
    struct epoll_event event;
    event.events = EPOLLIN;
    event.data.fd = socket_fd;
    epoll_ctl(epoll_fd, EPOLL_CTL_ADD, socket_fd, &event);
    struct epoll_event events[10];
    int nfds = epoll_wait(epoll_fd, events, 10, timeout);
    for (int i = 0; i < nfds; i++) {
        if (events[i].data.fd == socket_fd) {
            // socket_fd 可读
        }
    }
    


3. I/O多路复用的优缺点

优点
  1. 高效的资源利用:通过使用一个线程处理多个 I/O 操作,减少了线程创建和上下文切换的开销。
  2. 并发处理:适用于高并发的 I/O 场景,尤其是网络服务器,可以有效处理大量的并发连接。
  3. 易于扩展:可以轻松扩展来处理更多的文件描述符,而无需改变原有的代码结构。
缺点
  1. 复杂度增加:相较于简单的阻塞 I/O,I/O 多路复用的编程复杂度较高,需要精细管理各个文件描述符的状态。
  2. 性能瓶颈(selectpoll:对于大规模并发连接,selectpoll 需要遍历所有文件描述符,性能会受到影响。
  3. 事件驱动编程难度:尤其在 epoll 的 ET 模式下,需要确保所有数据在一次事件触发时被处理完,否则可能会丢失事件通知。

4. 常见的面试问题

(1) 什么是 I/O 多路复用?
  • 回答要点
    • I/O 多路复用是一种可以让程序同时监视多个 I/O 操作的机制,避免为每个 I/O 操作创建独立线程或进程。
    • 常用的 I/O 多路复用技术包括 selectpollepoll
(2) selectpoll 的区别是什么?
  • 回答要点
    • select 有文件描述符数量限制(通常为 1024),而 poll 没有这个限制。
    • poll 使用一个结构体数组传递文件描述符,而 select 使用文件描述符集。
    • 两者都需要在每次调用时重新初始化文件描述符的集合或数组。
(3) epollselectpoll 相比有什么优势?
  • 回答要点
    • epoll 没有文件描述符数量限制,适合大规模并发连接。
    • epoll 不需要每次遍历所有文件描述符,性能更高。
    • epoll 采用事件通知机制,而 selectpoll 需要轮询。
(4) 什么是水平触发(LT)和边缘触发(ET)?
  • 回答要点
    • 水平触发(LT):每次有数据可读或可写时,都会触发事件通知,允许程序分多次处理数据。
    • 边缘触发(ET):只有在状态从无到有变化时才会触发事件通知,需要程序一次性处理完所有数据。
(5) 如何处理高并发场景下的 I/O 操作?
  • 回答要点
    • 使用 I/O 多路复用机制(如 epoll)来管理大量的文件描述符。
    • 使用非阻塞 I/O 和异步 I/O,减少线程和进程的上下文切换开销。
    • 结合线程池或协程等技术进一步优化并发处理能力。
(6) epoll 的 LT 和 ET 模式如何选择?
  • 回答要点
    • LT 模式更简单易用,适合大多数场景,不需要一次性处理所有数据。
    • ET 模式适合高性能要求的场景,可以减少不必要的系统调用,但需要更复杂的编程逻辑来确保所有数据被及时处理。
(7) 描述 I/O 多路复用在服务器中的应用场景?
  • 回答要点
    • 高并发服务器中使用 I/O 多路复用来处理多个客户端的连接请求。
    • 常用于网络服务器、代理服务器等需要同时处理大量 I/O 操作的应用。
    • 通过 epollselect 管理大量的连接,减少对系统资源的消耗,提高服务器的吞吐量和响应速度。

标签:文件,多路复用,epoll,描述符,fd,select
From: https://blog.csdn.net/weixin_44965579/article/details/142874293

相关文章

  • 面试官:谈谈你对IO多路复用的理解?
    “IO多路复用”是编程中常见的技术词汇,使用这种技术的框架有很多,如,Redis、Kafka、Netty、Nginx中都用到了此技术。那问题来了,什么是IO多路复用?它的具体实现技术有哪些?这些技术之间有什么区别?今天我们就来简单的探讨一下。1.什么是IO多路复用?IO多路复用技术是一种允许单个......
  • python之I/O多路复用
    python IO多路复用一、多路复用概念:监听多个描述符(文件描述符(windows下暂不支持)、网络描述符)的状态,如果描述符状态改变则会被内核修改标志位,进而被进程获取进而进行读写操作 二、多路复用两种触发方式:水平触发(LevelTriggered):将就绪的文件描述符告诉进程后,如果进程没......
  • 0915,SOCKET网络编程部分,三种I/O多路复用模型(select ,poll,epoll)
    目录  nc127.0.0.1port01_socket_client.cc01_socket_server.cc02_select_client.cc02_select_server.cc03_poll_server.cc04_epoll_server.cc01_socket_client.cc#include<stdlib.h>#include<string.h>#include<sys/stat.h>#include<sy......
  • IO多路复用
    I/O模型指的是操作系统处理输入/输出(I/Oinput/output)操作的不同方式,它们主要在于如何处理程序与I/O操作设备(如磁盘、网络等)之间的交互,以及在等待I/O操作完成时,程序如何调度和管理。常见的IO模型有:阻塞IO非阻塞IOIO多路复用异步IO 阻塞IO最基础的IO模型,简单调用read()......
  • 适合初学者的[JAVA]:Redis(2:I/O多路复用模型与事件派发)
    目录说明前言I/O多路复用模型备注:用户空间和内核空间:备注:阻塞IO:(了解)非阻塞IO:(了解)IO多路复用:(重点)常见的方式有:差异:事件派发说明:Redis网络模型总结: 说明本文适合刚刚学习Java的初学者,也可以当成阿岩~的随手笔记.接下来就请道友们和我一起来......
  • IO多路复用
    epoll功能及参数:intepoll_ctl(intepfd,intop,intfd,structepoll_event*event);功能:控制epoll属性,比如给红黑树添加节点。参数:1.epfd:epoll_create函数的返回句柄。2.op:表示动作类型,有三个宏:EPOLL_CTL_ADD:注册新的fd到epfd中EPOLL_CTL_MOD:修改已注册......
  • io多路复用
    目录select1. 特点2. 编程步骤超时检测必要性poll1. 特点2. 编程步骤select1. 特点1. 一个进程最多可以监听1024个文件描述符2. select每次被唤醒之后,要重新轮询表,效率低3. select每次都会清空未发生响应的文件描述符,每次都要经过用户空间拷......
  • day08(网络编程基础)Linux IO 模型(IO多路复用)
    目录场景假设select特点编程步骤练习练习一:输入鼠标的时候,响应鼠标事件,输入键盘的时候,响应键盘事件(两路IO)练习二:用select创建并发服务器,可以同时连接多个客户端(0,sockfd)(12min)练习三:用select创建并发服务器,可以与多个客户端进行通信(监听键盘、socket、多个accept......
  • IO多路复用、服务器模型
    IO多路复用:epollepoll的提出--》它所支持的文件描述符上限是系统可以最大打开的文件的数目;eg:1GB机器上,这个上限10万个左右。每个fd上面有callback(回调函数)函数,只有产生事件的fd才有主动调用callback,不需要轮询。注意:Epoll处理高并发,百万级1.红黑树:是特殊的二叉树......
  • 重头开始嵌入式第三十一天(IO多路复用)
    目录1.IO多路复用1.IO模型1、阻塞IO ===》最常用 默认设置2、非阻塞IO ===》在阻塞IO的基础上调整其为不再阻塞等待。 在程序执行阶段调整文件的执行方式为非阻塞:3.信号驱动io 4.并发  5.IO 多路复用 ===》并发服务器 ===》TCP协议1、select循环服务器 ===......