条件触发和边缘触发 及 epoll 的长处
- 条件触发: 仅仅要输入缓冲有数据就会一直通知该事件
边缘触发: 输入缓冲收到数据时仅注冊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的长处:
- 支持一个进程打开大数目的
socket
描写叙述符(FD
)
select
最不能忍受的是一个进程所打开的FD
是有一定限制的。由FD_SETSIZE
设置。默认值是2048
。对于那些须要支持的上万连接数目的IMserver来说显然太少了。
这时候你一是能够选择改动这个宏然后又一次编译内核,只是资料也同一时候指出这样会带来网络效率的下降,二是能够选择多进程的解决方式(传统的 Apache
方案),只是尽管linux
上面创建进程的代价比較小,但仍旧是不可忽视的,加上进程间数据同步远比不上线程间同步的高效,所以也不是一种完美的方案。
只是 epoll
则没有这个限制,它所支持的FD
上限是最大能够打开文件的数目,这个数字一般远大于2048
,举个样例,在1GB
内存的机器上大约是10
万左右。详细数目能够cat /proc/sys/fs/file-max
察看,一般来说这个数目和系统内存关系非常大。
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
之上了。
- 使用
mmap
加速内核与用户空间的消息传递。
这点实际上涉及到epoll
的详细实现了。不管是select
,poll
还是epoll
都须要内核把FD
消息通知给用户空间,怎样避免不必要的内存拷贝就 非常重要,在这点上。epoll
是通过内核于用户空间mmap
同一块内存实现的。而假设你想我一样从2.5内核就关注epoll
的话,一定不会忘记手工 mmap
这一步的。
- 内核微调
这一点事实上不算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 的长处的更多相关文章
- 实例浅析epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO
一.基本概念 我们通俗一点讲: Level_triggered(水平触发):当被监控的 ...
- epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO
转自:http://www.cnblogs.com/yuuyuu/p/5103744.html 一.基本概念 ...
- epoll水平/边缘触发模式下阻塞/非阻塞EPOLLOUT事件触发条件及次数
在IO多路复用技术中,epoll默认的事件触发模式为Level_triggered(水平触发)模式,即当被监控的文件描述符上有可读/写事件发生时,epoll_wait()会通知处理程序去读写.如果这次 ...
- 边缘触发(Edge Trigger)和条件触发(Level Trigger)
int select(int n, fd_set *rd_fds, fd_set *wr_fds, fd_set *ex_fds, struct timeval *timeout); sele ...
- epoll ET(边缘触发) LT(水平触发)
EPOLL事件有两种模型: Edge Triggered (ET) 边缘触发只有数据到来,才触发,不管缓存区中是否还有数据.Level Triggered (LT) 水平触发只要有数据都会触发. 首先 ...
- Linux网络编程之select、poll、epoll的比较,以及epoll的水平触发(LT)和边缘触发(ET)
Linux的网络通信先后推出了select.poll.epoll三种模式. select有以下三个问题: (1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大. ...
- epoll的边缘触发与水平触发
epoll的边缘触发与水平触发 Tcp连接是双向的,内核为每个socket维护两个缓冲区,读缓冲区与写缓冲区,内核会一个关注这两个缓冲区,当采用水平触发时,对于写缓冲区而言,如果有多余空间可写,对于读 ...
- jenkins 判断是手动触发还是定时器触发
根据变量BUILD_CAUSE的值可以判断本次触发是手动触发还是定时器触发 手动触发:MANUALTRIGGER 定时器触发:TIMERTRIGGER
- Unity插件之NGUI学习(6)—— 关于Widget怎样加入触发事件(触发OnClick)
NGUI中,Button本身就带有OnClick事件,可是Sprite,Label等( 也绑有Widget的)并没有触发事件,事实上NGUI的事件触发都必须加入Box Collider,并勾选Is T ...
随机推荐
- Node.js 笔记(一) nodejs、npm、express安装
Windows平台下的node.js安装 直接去nodejs的官网http://nodejs.org/上下载nodejs安装程序,双击安装就可以了 测试安装是否成功: 在命令行输入 node –v 应 ...
- 机器学习-分类器-Adaboost原理
Adaboost原理 Adaboost(AdaptiveBoosting)是一种迭代算法,通过对训练集不断训练弱分类器,然后把这些弱分类器集合起来,构成强分类器.adaboost算法训练的过程中,初始 ...
- Go语言使用PostgreSQL数据库
Go语言使用PostgreSQL数据库 PostgreSQL和MySQL比较,它更加庞大一点,因为它是用来替代Oracle而设计的.所以在企业应用中采用PostgreSQL是一个明智的选择. 现在My ...
- vue框架整体流程
1.整体流程 (1)模板解析成render函数 (2)响应式监听 (3)首次渲染,显示页面,绑定依赖 (4)data属性变化,触发rerender 2.模板解析为render函数 参考上一篇博客. 模 ...
- Atitit.Guibutton与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数.
Atitit.Guibutton与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数. 1. Kpi::: 代码行数(凝视行数,空白的行数), 方法数,class数 1 2. ...
- JAVA识别字符串是数字(英文)还是汉字,web页面进行字符截断的帮助类
public static void main(String[] args) { //长度是2说明是英文/数字/英文状态下的字符,长度为4说明是汉字/中文状态下的字符 String str = &qu ...
- jQuery get selected text from SELECT (or DROPDOWN) list box
Most of the time in JavaScript we want to do following things with Select (or dropdown) list box. – ...
- GitLab概念——Group、Project、Member
概念说明: Group是一个父子结构的目录 Group每一级都可以设置关联的Member,同时每一级下都可以创建项目 Group关联的Member和Member对应的权限,会继承到Group下的所有P ...
- Ubuntu18.04下希捷移动硬盘Seagate Backup Plus读写慢
去年买的一块Seagate Backup Plus 4TB, 专门用来备份的, 之前在win7下用过几次, 但是在Ubuntu下可能只用过一两次, 今天备份的时候, 感觉写入速度不太正常, 大概只有1 ...
- 转:ArcEngine10.0+VS2010+MFC 扫盲贴 .
项目用vc6.0+MapObject写的,现在却要升级成AE10,研究了好多天的AE10.0和c++,中间的曲折也不想多说了,废话少数,下面是实现ArcEngine基本功能的,仅供参考,如能帮到同仁们 ...