• 条件触发: 仅仅要输入缓冲有数据就会一直通知该事件
  • 边缘触发: 输入缓冲收到数据时仅注冊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. 实例浅析epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO

    一.基本概念                                                          我们通俗一点讲: Level_triggered(水平触发):当被监控的 ...

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

    转自:http://www.cnblogs.com/yuuyuu/p/5103744.html 一.基本概念                                               ...

  3. epoll水平/边缘触发模式下阻塞/非阻塞EPOLLOUT事件触发条件及次数

    在IO多路复用技术中,epoll默认的事件触发模式为Level_triggered(水平触发)模式,即当被监控的文件描述符上有可读/写事件发生时,epoll_wait()会通知处理程序去读写.如果这次 ...

  4. 边缘触发(Edge Trigger)和条件触发(Level Trigger)

    int select(int n, fd_set *rd_fds, fd_set *wr_fds, fd_set *ex_fds, struct timeval *timeout);     sele ...

  5. epoll ET(边缘触发) LT(水平触发)

    EPOLL事件有两种模型: Edge Triggered (ET) 边缘触发只有数据到来,才触发,不管缓存区中是否还有数据.Level Triggered (LT) 水平触发只要有数据都会触发. 首先 ...

  6. Linux网络编程之select、poll、epoll的比较,以及epoll的水平触发(LT)和边缘触发(ET)

    Linux的网络通信先后推出了select.poll.epoll三种模式. select有以下三个问题: (1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大. ...

  7. epoll的边缘触发与水平触发

    epoll的边缘触发与水平触发 Tcp连接是双向的,内核为每个socket维护两个缓冲区,读缓冲区与写缓冲区,内核会一个关注这两个缓冲区,当采用水平触发时,对于写缓冲区而言,如果有多余空间可写,对于读 ...

  8. jenkins 判断是手动触发还是定时器触发

    根据变量BUILD_CAUSE的值可以判断本次触发是手动触发还是定时器触发 手动触发:MANUALTRIGGER 定时器触发:TIMERTRIGGER

  9. Unity插件之NGUI学习(6)—— 关于Widget怎样加入触发事件(触发OnClick)

    NGUI中,Button本身就带有OnClick事件,可是Sprite,Label等( 也绑有Widget的)并没有触发事件,事实上NGUI的事件触发都必须加入Box Collider,并勾选Is T ...

随机推荐

  1. maven 下载源码downloadsources

    mvn eclipse:eclipse -Ddownloadsources=true  -Ddownloadjavadocs=true

  2. Python脚本生成sitemap

    项目须要用脚本生成sitemap,中间学习了一下sitemap的格式和lxml库的使用方法.把结果记录一下,方便以后须要直接拿来用. 来自Python脚本生成sitemap 安装lxml 首先须要pi ...

  3. Redis 操作数据

    展现最新数据 Web应用常常要展现最新数据,就会根据时间对数据排序: SELECT * FROM foo WHERE ... ORDER BY time DESC LIMIT 10 随着数据的增加,问 ...

  4. HTML DOM 基础知识,成为javascript晋级高手的必备手册

    一.DOM 简介,什么是 DOM? 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口. 标记语言,也称置标语言,是一种将文本( ...

  5. JS获取当前/指定URL参数

    方法: 首先通过 document.location 获得当前访问网页的网址, 其次用 split 方法通过“?”把网址分为两部分. 如果网址中有参数(arrObj.length > 1) 再用 ...

  6. python object对象

    动态语言的对象属性 既然都是动态语言,自然python和熟知的JavaScript很像,建一个空对象用来存放所有的数据,看看js: var data = {}; data.name = 'CooMar ...

  7. umeng友盟消息推送功能集成

    umeng友盟消息推送功能集成(本人使用的是eclipse开发) 1.首先请自行观看友盟消息推送集成的API文档. 观看地址如下: http://dev.umeng.com/push/android/ ...

  8. CS 寄存器 和 IP 寄存器

    下面将要介绍的是一组非常非常重要的寄存器,即 CS:IP . CS:IP 两个寄存器指示了 CPU 当前将要读取的指令的地址,其中  CS 为代码段寄存器,而   IP 为指令指针寄存器 . 什么叫做 ...

  9. windows 10 更新失败及应用商店重装问题解决记录

    简单的记录一下这次遇到的问题及解决办法. 使用的windows 10 企业版一直不能更新成功,各种办法都试过了,都是失败然后回退. 这次直接下载了1709的映像进行升级安装的,因为我的是双系统,升级安 ...

  10. Linux指令范例速查手册

    linux命令繁多,命令就是AK的子弹,对上口径,百发百中! 无意发现一本介绍Linux命令的手册--->[Linux指令范例速查手册] 下载: https://pan.baidu.com/s/ ...