news 2026/4/27 9:06:13

IO多路复用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
IO多路复用

一、定义与作用

定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力
作用:
1.在tcp server中使用,处理多个客户端的请求。
2.对多个会阻塞的设备,进行io操作。 那个设备数据先就绪(可读或刻写),就及时处理。

二、Linux提供的io模型

1.阻塞IO 默认
2、非阻塞IO 忙等待(不会主动让出cpu) 能读取数据就读取数据,不能读取,代码继续运行。外部需要套一个死循环,直到实际处理成功,跳出循环。
3、信号驱动IO SIGIO 用的相对少(了解)
4、并行模型 进程,线程
5, IO多路复用 select、poll、epoll

将文件描述符设置为非阻塞

int flag ; flag = fcntl(fd,F_GETFL,0); ///获取fd文件的默认属性到flag变量中。 flag = flag | O_NONBLOCK; ///将变量的值调整并添加非阻塞属性 fcntl(fd,F_SETFL,flag); ///将新属性flag设置到fd对应的文件生效。

三、Select的处理过程

1.创建fd集合(数组)
2.添加关心 fd 到集合
3.select 阻塞等待,轮询(应用层处于阻塞状态,操作系统在轮询检查fd是否有数据到来)
4在集合中找到对应的fd
5.read -》fd
6.注意,手动清除标志位

相关函数

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 功能:完成指定描述符集合中有效描述符的动态检测。该函数具有阻塞等待功能,在函数执行完毕后 目标测试集合中将只保留最后有数据的描述符。 返回值:超时 0 失败 -1 成功 >0 为了配合select函数执行,有如下宏函数: void FD_CLR(int fd, fd_set *set); 功能:将指定的set集合中编号为fd的描述符号删除。 int FD_ISSET(int fd, fd_set *set); 功能:判断值为fd的描述符是否在set集合中, 如果在则返回真,否则返回假。 void FD_SET(int fd, fd_set *set); 功能:将指定的fd描述符,添加到set集合中。 void FD_ZERO(fd_set *set); 功能:将指定的set集合中所有描述符删除。

四、Epoll处理过程

1.创建集合(二叉树)
2. 添加fd 到集合
3.epoll_wait ,主动上报,异步通信。
4.在 rev数组中,查找对应描述符 。
5.读写操作

相关函数

int epoll_create(int size); 功能,创建 集合 参数 size:指定集合的大小 返回值: >0对应集合的文件描述符 , -1 错误 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 功能,向集合中,添加或删除文件描述 参数 size:指定集合的大小 返回值: ==0 ,成功 -1 错误 int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout); 功能,等待io事件的到来,阻塞函数 返回值: >0 代表集合中,准备就绪的文件描述符的个数 0 == 超时 -1 错误,

五、Select和Epoll的区别

1 select 集合最大容纳 1024 个文件, epoll 不限制监听的描述符个数(poll也是)
2.epoll 监听性能不随着监听描述 符数的增加而增加,是O(1)的,不再是轮询描述符来探测事件,而是由描述符主动上报事件, select 轮询
3 epoll 使用共享内存的方式,不在用户和内核之间反复传递监听的描述 符信息 。select 集合,会在内核和用户层发生多次。
4. epoll 返回参数中就是触发事件的列表(只有准备就绪的),不用再遍历输入事件表查询各个事件是否被触发。select ,需要在原始集合(准备就绪和未就绪在一起混着的)中查找。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:11:20

SSH X11转发实现PyTorch图形化调试界面显示

SSH X11转发实现PyTorch图形化调试界面显示 在深度学习开发中,有一个场景几乎每位工程师都遇到过:你把模型部署到远程服务器上跑训练,一切看起来都很顺利——日志正常输出、GPU 利用率拉满。但当你想用 matplotlib 看一眼数据预处理的结果&a…

作者头像 李华
网站建设 2026/4/23 12:24:57

工业显示器USB接口触控集成方案:详细说明

工业显示器如何用USB搞定触控?一文讲透设计精髓你有没有遇到过这样的场景:一台工业设备的触摸屏反应迟钝,点半天没反应;或者换了个操作系统,触控突然失灵;又或者现场维护时,得拆机插拔、重装驱动…

作者头像 李华
网站建设 2026/4/23 10:44:46

Anaconda环境快照功能记录PyTorch配置变更轨迹

Anaconda环境快照功能记录PyTorch配置变更轨迹 在深度学习项目中,最让人头疼的往往不是模型调参,而是“为什么昨天能跑通的代码今天却报错了?”——这类问题背后,十有八九是环境发生了不可见的变化。尤其是当你升级了 PyTorch 或 …

作者头像 李华
网站建设 2026/4/23 10:46:44

快速理解USB-Blaster在FPGA烧录中的作用与驱动需求

深入理解USB-Blaster在FPGA开发中的核心作用与驱动配置实战你有没有遇到过这样的场景:Quartus Prime工程编译成功,信心满满打开Programmer准备烧录,结果却弹出“No JTAG chain detected”?或者设备管理器里显示一个黄色感叹号的“…

作者头像 李华
网站建设 2026/4/23 10:46:29

2026年AI 编程软件推荐:从入门到精通的完整解决方案

在人工智能技术深度重构开发流程的 2025 年,AI 编程助手已经成为开发者必不可少的 "数字同事"。据第三方机构实测数据显示,适配的 AI 编程工具可使代码生成效率提升 40%-60%,复杂问题解决时间缩短 65% 以上。进入2026年以后&#x…

作者头像 李华
网站建设 2026/4/24 21:12:38

2026年五大AI编程软件权威推荐:开发者该如何选择智能编码伙伴?

凌晨三点的办公室,一位开发者面对屏幕上数千行遗留代码陷入沉思,而AI编程工具在几分钟内就理清了复杂的函数调用关系——这是2026年软件开发的新常态。在2026年的技术格局中,AI编程工具已从“锦上添花”的辅助工具演变为“不可或缺”的核心生…

作者头像 李华