Linux IO的水平触发和边缘触发的区别

发布时间 - 2026-01-11 01:05:55    点击率:

Linux IO的水平触发和边缘触发的区别

    在linux的IO多路复用中有水平触发,边缘触发两种模式,这两种模式的区别如下:

     水平触发:如果文件描述符已经就绪可以非阻塞的执行IO操作了,此时会触发通知.允许在任意时刻重复检测IO的状态.select,poll就属于水平触发.

     边缘触发:如果文件描述符自上次状态改变后有新的IO活动到来,此时会触发通知.在收到一个IO事件通知后要尽可能多的执行IO操作,因为如果在一次通知中没有执行完IO那么就需要等到下一次新的IO活动到来才能获取到就绪的描述符.信号驱动式IO就属于边缘触发.

     写过单片机的人可以从另一方理解水平触发和边缘触发的区别:

     水平触发:就是只有高电平(1)或低电平(0)时才触发通知,只要在这两种状态就能得到通知.上面提到的只要有数据可读(描述符就绪)那么水平触发的epoll就立即返回.

    边缘触发:只有电平发生变化(高电平到低电平,或者低电平到高电平)的时候才触发通知.上面提到即使有数据可读,但是io状态没有变化epoll也不会立即返回.

    epoll既可以采用水平触发,也可以采用边缘触发.

    大家可能还不能完全了解这两种模式的区别,我们可以举例说明:一个管道收到了1kb的数据,epoll会立即返回,此时读了512字节数据,然后再次调用epoll.这时如果是水平触发的,epoll会立即返回,因为有数据准备好了.如果是边缘触发的不会立即返回,因为此时虽然有数据可读但是已经触发了一次通知,在这次通知到现在还没有新的数据到来,直到有新的数据到来epoll才会返回,此时老的数据和新的数据都可以读取到(当然是需要这次你尽可能的多读取).所以当我们写epoll网络模型时,如果我们用水平触发不用担心数据有没有读完因为下次epoll返回时,没有读完的socket依然会被返回,但是要注意这种模式下的写事件,因为是水平触发,每次socket可写时epoll都会返回,当我们写的数据包过大时,一次写不完,要多次才能写完或者每次socket写都写一个很小的数据包时,每次写都会被epoll检测到,因此长期关注socket写事件会无故cpu消耗过大甚至导致cpu跑满,所以在水平触发模式下我们一般不关注socket可写事件而是通过调用socket write或者send api函数来写socket,说到这我们可以看到这种模式在效率上是没有边缘触发高的,因为每个socket读或者写可能被返回两次甚至多次,所以有时候我们也会用到边缘触发但是这种模式下在读数据的时候一定要注意,因为如果一次可写事件我们没有把数据读完,如果没有读完,在socket没有新的数据可读时epoll就不回返回了,只有在新的数据到来时,我们才能读取到上次没有读完的数据。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Linux  # IO的水平触发和边缘触发  # 水平触发和边缘触发的区别  # Linux IO多路复用之epoll网络编程  # 详解Linux命令iostat  # Linux的Socket IO模型趣解  # Linux shell编程中IO和条件及循环处理的细节问题讨论  # 如何使用iostat查看linux硬盘IO性能  # Linux 查看磁盘IO并找出占用IO读写很高的进程  # 详细介绍Linux IO  # 边缘  # 这两种  # 当我们  # 过大  # 高电平  # 模式下  # 数据包  # 的人  # 还没有  # 低电平  # 此时会  # 也会  # 就能  # 就不  # 才会  # 两种  # 中有  # 两次  # 说到  # 我们可以 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在万网利用已有域名快速建站?  如何在建站主机中优化服务器配置?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  做企业网站制作流程,企业网站制作基本流程有哪些?  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  用yum安装MySQLdb模块的步骤方法  什么是javascript作用域_全局和局部作用域有什么区别?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  如何在 Pandas 中基于一列条件计算另一列的分组均值  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何在云主机上快速搭建多站点网站?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  EditPlus中的正则表达式实战(5)  百度浏览器如何管理插件 百度浏览器插件管理方法  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Laravel如何自定义错误页面(404, 500)?(代码示例)  Java解压缩zip - 解压缩多个文件或文件夹实例  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  如何在IIS中配置站点IP、端口及主机头?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  高性能网站服务器配置指南:安全稳定与高效建站核心方案  如何在搬瓦工VPS快速搭建网站?  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  IOS倒计时设置UIButton标题title的抖动问题  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel如何处理文件下载请求?(Response示例)  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  网站图片在线制作软件,怎么在图片上做链接?  如何在建站宝盒中设置产品搜索功能?  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  创业网站制作流程,创业网站可靠吗?  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  如何在万网开始建站?分步指南解析  Laravel怎么在Controller之外的地方验证数据  如何在云服务器上快速搭建个人网站?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  怎么用AI帮你为初创公司进行市场定位分析?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧