当前位置: 首页 > news >正文

I/O 多路复用

举例:

一.同步阻塞IO

服务端一直循环等待连接,每次循环只处理一个请求。
会在accept和read方法进行阻塞

多线程时需要创建对应的线程数去操作

二.同步非阻塞

accept不阻塞,如果没有连接,返回一个非法的值,一直循环,如果有连接,就加到fd_list中,缺点:需要一直循环

三 .select模式

下面是大概的源码。
1.重置FD_SET是bitmap 默认只有1024位
2.for循环把初始化拿到的fds[i]跟rset绑定。需要监听哪几位fd

3.调用select方法,从用户态拷贝fd到内核态。会进行遍历fd。查看有没有哪个fd就绪了,返回总共就绪的数量int,如果一直没有则阻塞
4.由于只是返回了就绪个数,不知道哪个就绪了,所以还需要一次遍历来确定就绪的fd,然后调用read来读数据


fd_set 入参表示要监听哪些fd,如图:1号和3号需要监听,出差表示哪些FD就绪,如图:3号准备好了


缺点:
(1)FD_SET是bitmap 默认只有1024位,所以默认监听1024fd
(2)处理完一轮后需要重新初始化FD_SET,FD_SET不能复用
(3)每次调用select,需要把fd从用户态拷贝到内核态,调用完成后还要把全部fd从内核态拷贝到用户态,占用内存
(4)需要遍历全部的fd来找到就绪的fd来执行逻辑,需要O(n)复杂度

四 .poll模式

源码大致如下。
pollfds结构中fd表示监听的文件描述符,events表示监听的事件,revents表示就绪的事件。
poll方法入参:文件描述符数组,数组长度,超时时间,
出参:就绪的个数,

跟select类似,将一批fd发送到内核态进行判断。就绪了就返回同时把对应的revents设置为1
因为也不知道哪个fd就绪了,还是需要全部遍历,但是在遍历的过程中就把revents设置为0,统一做一次初始化。


使用的pollfds数据结构组成数组,没有1024的限制

五.epoll模型

  1. 创建实例
    epoll_create1() 分配 struct eventpoll,
    初始化红黑树 rbr + 就绪链表 rdllist

  2. 注册监听
    epoll_ctl(EPOLL_CTL_ADD) 创建 struct epitem
    插入红黑树 rbr
    注册回调 ep_poll_callback 到 fd 的等待队列

  3. 等待事件
    epoll_wait()
    检查就绪链表 rdllist 是否为空
    空则进入睡眠 (TASK_INTERRUPTIBLE)

  4. 事件到达
    文件就绪
    驱动调用 wake_up() 唤醒等待队列
    触发 ep_poll_callback 回调
    将 epitem 加入就绪链表 rdllist
    唤醒 epoll_wait 中的进程

  5. 返回事件
    epoll_wait 被唤醒
    遍历就绪链表 rdllist
    拷贝事件到用户空间 events 数组
    返回就绪事件数量

两种模式LT vs ET 对比。默认LT

六.对比

参考链接:https://www.bilibili.com/video/BV1r54y1f7bU/?spm_id_from=333.337.search-card.all.click&vd_source=d9a52d82a1f11ceeeb7021c93269e8d2
https://www.bilibili.com/video/BV1gN411e7gd/?spm_id_from=333.337.search-card.all.click&vd_source=d9a52d82a1f11ceeeb7021c93269e8d2

http://www.jsqmd.com/news/461118/

相关文章:

  • 移动机器人总装图
  • 1e1af3e8-900f-4e13-937e-e02fce56cf3e
  • 跨越词汇的鸿沟:NLTK 中不为人知的语义与语篇分析能力深度探索
  • 【全网最全】2026主流AI绘画比例大横评:DALL-E 3、Midjourney、Gemini与Claude的隐藏技巧
  • 企业级高校实习管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 紧随电车出海浪潮,外贸ERP助力车企实现精准协同与库存优化
  • Flutter 三方库 coverage_reporter 的鸿蒙化适配指南 - 实现具备 LCOV 自动分析与多格式统计的代码覆盖率报告引擎、支持端侧质量量化与 CI 流水线对齐实战
  • Flutter 三方库 gviz 的鸿蒙化适配指南 - 实现复杂的 Graphviz 拓扑图布局计算、支持 DOT 语言解析与自动化图谱生成
  • Flutter 三方库 jsonata_dart 的鸿蒙化适配指南 - 实现高性能的 JSON 数据查询与转换、支持 JSONata 表达式引擎与端侧复杂数据清洗
  • 放化疗口腔并发症治疗用药选速舒®,口腔护理更科学
  • Flutter 三方库 session 的鸿蒙化适配指南 - 实现具备 TTL 机制的端侧会话持久化、支持敏感凭证加密存储与全生命周期状态同步实战
  • 宁波极微纳-精选2026纳米材料厂家/纳米氧化物厂家,全域适配,赋能多业 - 栗子测评
  • Spring Cloud负载均衡组件到底是哪一个?
  • Flutter 三方库 teno_datetime 的鸿蒙化适配指南 - 实现极简的日期时间格式化与操作增强、支持多语言本地化显示与时区转换
  • 别让“播放量迷信”抹杀你的努力!
  • C++ 模板进阶:从特化机制到分离编译
  • OpenClaw 入门实践:Token 机制、Skill 安装与核心概念解析
  • LOONGRL: REINFORCEMENT LEARNING FOR ADVANCED REASONING OVER LONG CONTEXTS粗读
  • 别忙着“养虾”了!AI时代的战争已经打响!
  • Flutter 三方库 servicestack 的鸿蒙化适配指南 - 实现企业级 Message-based 架构集成、支持强类型 JSON 序列化与跨端服务调用同步
  • 拍照手机哪款好?五款影像旗舰的拿手好戏
  • 2026年AI手机口碑排行:五款AI手机口碑见真章
  • 制造业AI Agent落地实战指南:破解千万级SKU管理与智能报价的深度路径
  • 安装配置大龙虾openclaw
  • Flutter 三方库 app_dirs 的鸿蒙化适配指南 - 标准化存取平台沙箱路径、支持配置文件与缓存目录一键获取
  • Flutter 三方库 arcade 的鸿蒙化适配指南 - 实现高性能的端侧 Web 框架、支持轻量级 HTTP 路由分发与服务端逻辑集成
  • 【高清视频】基于Broadcom PCIe 5.0 交换芯片的8盘位SSD测试卡
  • 【高清视频】当前PCIe 6.0协议兼容性测试CTS进展及SerialTek CTS高清演示
  • 【高清视频】CXL over Fibre基于FPGA实现的CXL Device拉远高清演示
  • AntDesign中用Tabs渲染多数据时,想快速锁定其中一个index下的tab,并且使它在可视区域内