• 条件触发: 仅仅要输入缓冲有数据就会一直通知该事件
  • 边缘触发: 输入缓冲收到数据时仅注冊1次该事件。即使输入缓冲中还留有数据,也不会再进行注冊

  • 水平触发(level-triggered。也被称为条件触发):仅仅要满足条件。就触发一个事件(仅仅要有数据没有被获取,内核就不断通知你)

  • 边缘触发(edge-triggered): 每当状态变化时,触发一个事件

举个读socket的样例,假定经过长时间的沉默后,如今来了100个字节。这时不管边缘触发和条件触发都会产生一个read ready notification通知应用程序可读。应用程序读了50个字节。然后又一次调用api等待io事件。

这时条件触发的api会由于还有50个字节可读从而马上返回用户一个read ready notification。而边缘触发的api由于可读这个状态没有发生变化而陷入长期等待

因此在使用边缘触发的api时,要注意每次都要读到socket返回EWOULDBLOCK为止,否则这个socket就算废了。而使用条件触发的api时,假设应用程序不须要写就不要关注socket可写的事件。否则就会无限次的马上返回一个write ready notification

大家经常使用的select就是属于条件触发这一类。长期关注socket写事件会出现CPU 100%的毛病。

epoll的长处:

  1. 支持一个进程打开大数目的socket描写叙述符(FD)

select最不能忍受的是一个进程所打开的FD是有一定限制的。由FD_SETSIZE设置。默认值是2048。对于那些须要支持的上万连接数目的IMserver来说显然太少了。

这时候你一是能够选择改动这个宏然后又一次编译内核,只是资料也同一时候指出这样会带来网络效率的下降,二是能够选择多进程的解决方式(传统的 Apache方案),只是尽管linux上面创建进程的代价比較小,但仍旧是不可忽视的,加上进程间数据同步远比不上线程间同步的高效,所以也不是一种完美的方案。

只是 epoll则没有这个限制,它所支持的FD上限是最大能够打开文件的数目,这个数字一般远大于2048,举个样例,在1GB内存的机器上大约是10万左右。详细数目能够cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系非常大。

  1. IO效率不随FD数目添加而线性下降

传统的select/poll还有一个致命弱点就是当你拥有一个非常大的socket集合,只是由于网络延时。任一时间仅仅有部分的socket是”活跃”的, 可是select/poll每次调用都会线性扫描所有的集合,导致效率呈现线性下降。可是epoll不存在这个问题,它仅仅会对”活跃”的socket进行 操作—这是由于在内核实现中epoll是依据每一个fd上面的callback函数实现的。那么。仅仅有”活跃”的socket才会主动的去调用 callback函数,其它idle状态socket则不会。在这点上,epoll实现了一个”伪”AIO,由于这时候推动力在os内核。在一些 benchmark中,假设所有的socket基本上都是活跃的—比方一个快速LAN环境,epoll并不比select/poll有什么效率,相反。假设过多使用epoll_ctl,效率相比还有略微的下降。可是一旦使用idle connections模拟WAN环境,epoll的效率就远在select/poll之上了。

  1. 使用mmap加速内核与用户空间的消息传递。

这点实际上涉及到epoll的详细实现了。不管是select,poll还是epoll都须要内核把FD消息通知给用户空间,怎样避免不必要的内存拷贝就 非常重要,在这点上。epoll是通过内核于用户空间mmap同一块内存实现的。而假设你想我一样从2.5内核就关注epoll的话,一定不会忘记手工 mmap这一步的。

  1. 内核微调

这一点事实上不算epoll的长处了,而是整个linux平台的长处。或许你能够怀疑linux平台。可是你无法回避linux平台赋予你微调内核的能力。

比方,内核TCP/IP协议栈使用内存池管理sk_buff结构,那么能够在执行时期动态调整这个内存pool(skb_head_pool)的大小 — 通过echo XXXX>/proc/sys/net/core/hot_list_length完毕。再比方listen函数的第2个參数(TCP完毕3次握手 的数据包队列长度),也能够依据你平台内存大小动态调整。更甚至在一个数据包数目巨大但同一时候每一个数据包本身大小却非常小的特殊系统上尝试最新的NAPI网卡驱动架构。 

条件触发和边缘触发 及 epoll 的长处相关推荐

  1. 五种高级IO | select poll epoll 水平触发模式 边缘触发模式 惊群问题

    一.高级IO 在介绍多路复用IO之前,先介绍一下其它四种高级IO: 阻塞IO: 在内核将数据准备好之前,系统调用会一直等待.所以的套集字默认是阻塞方式. 非阻塞IO: 在内核还未将数据准备好,则系统调 ...

  2. 实例浅析epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO

    一.基本概念 我们通俗一点讲: Level_triggered(水平触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写.如果这次没有把数据一次性全部读写完( ...

  3. epoll哪些触发模式_5.epoll的水平触发和边缘触发

    本篇是多路复用的第五篇,主要来讲解epoll的水平触发和边缘触发是怎么回事. 一.概念介绍 EPOLL事件有两种模型,水平出发和边缘触发,如下所示: 1. Level Triggered (LT) 水 ...

  4. epoll边缘触发_4.2.3、epoll:水平触发与边缘触发

    select和poll都只提供了一个函数:select或者poll函数. 而epoll提供了三个函数,epoll_create,epoll_ctl和epoll_wait,epoll_create是创建 ...

  5. 移除类名没有触发transition_epoll边缘触发模式

    epoll(kqueue),支持两种事件触发模式.水平触发以及边缘触发. epoll实际可以监听多种描述符,下文主要以套接字介绍,并且假设同时注册了读/写. 水平触发:只要套接字可读/可写epollw ...

  6. Linux网络编程 | 多路复用I/O :select、poll、epoll、水平触发与边缘触发、惊群问题

    文章目录 多路复用IO 多路复用IO的概念 多路复用IO与多线程/多进程的并发 多路复用IO模型进行服务器并发处理 多线程/多进程进行服务器并发处理 select 工作原理 接口 优缺点 select ...

  7. 什么是epoll的水平触发与边缘触发?两段代码彻底理解

    Edge trigger and level trigger of epoll 水平触发 对于读操作:只要缓冲内容不为空,LT模式返回读就绪. 对于写操作:只要缓冲区还不满,LT模式会返回写就绪. # ...

  8. 操作文件操作符的工作模式:LT(电平触发)ET(边缘触发)实验对比

    文章目录 什么是LT和ET? LT(Level Trigger)模式: ET(Edge Trigger)模式: 得出结论,ET模式的工作效率要比LT高,因为ET模式降低了同一事件被重复触发的次数 实验 ...

  9. 边沿触发是什么意思_epoll边缘触发模式

    epoll(kqueue),支持两种事件触发模式.水平触发以及边缘触发. epoll实际可以监听多种描述符,下文主要以套接字介绍,并且假设同时注册了读/写.水平触发:只要套接字可读/可写epollwa ...

最新文章

  1. codility上的问题 (22)
  2. css入门教程 网页首字下沉,CSS制作首字下沉_CSS Inline Layout Module, initial-letter, CSS3 教程_w3cplus...
  3. 如何让制定的计划实施起来
  4. 2d shader unity 阴影_Unity中实现2D光照系统
  5. 计算机ppt文字1是什么原因,ppt让答案一个个出现,ppt让文字一个个出现
  6. linux18.0.4安装mysql
  7. C#调用存储过程详解
  8. python爬取贴吧图片_Python爬取贴吧多页图片
  9. sql 语句中where条件和jion on条件的区别
  10. 莫烦python_莫烦python教学网站
  11. Cesium地图不加载或者加载有问题怎么办
  12. OpenCV的Mat格式和IplImage格式的使用
  13. 心中无码便是高清,用“脑补”除马赛克!
  14. java get set怎么用_JAVA get set用法
  15. Java ArrayList add()方法与示例
  16. 微信封号推送卡包发消息方法揭秘
  17. 重装win7系统并激活
  18. Modelsim下时序(功能)仿真altera IP核 程序(重要)
  19. 【elasticsearch】问题解决:Remote responded with a chunk that was too large. Use a smaller batch size
  20. ESP32 - ESP32_ULP_EB 低功耗应用评估板

热门文章

  1. 3D打印革命性升级!只要光照几十秒,完美雕像浮出水面丨Science
  2. 谷歌推出针对AI歧视的新课程!60分钟的ML公平自学训练模块 | 资源
  3. 小米首场开发者大会:宣布IoT开发者计划,联手百度提升AI能力
  4. Kanban VS Scrum:哪个是最好的敏捷项目管理框架
  5. 【HNOI 2016】大数
  6. 30问提升技术人写作力-第1问作业
  7. 什么是闭包?闭包的优缺点?
  8. dev grid 常用方法
  9. 利用Splatting提交参数(Hash,哈希)
  10. LINUX如何配置IP别名