从I/O复用谈epoll为什么高效

上一篇文章中,谈了一些网络编程的基本概念。在现实使用中,用的最多的就是I/O复用了,无非就是select,poll,epoll

很多人提到网络就说epoll,认为epoll效率是最高的。单纯的这么认为,其实有失偏颇。epoll固然高效,可是它是怎么做到高效的,它到底比select或poll优异在哪儿?

我们通过调用流程来简单分析下。

首先以select为例(poll类似),看下其调用过程

1.选择想要处理的套接字,通过接口FD_SET(fd, &set)加入到set中;

2.调用select(max+1, &set,,..)

3.对set中所有套接字调用FD_ISSET(fd,&set),查看fd上是否有事件发生

select存在的问题

  1. 单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数量,但由于select采用轮询的方式扫描文件描述符,文件描述符数量越多,性能越差;(在linux内核头文件中,有这样的定义:#define __FD_SETSIZE    1024)
  2. 内核 / 用户空间内存拷贝问题,select需要复制大量的句柄数据结构,产生巨大的开销;
  3. select返回的是含有整个句柄的数组,应用程序需要遍历整个数组才能发现哪些句柄发生了事件;
  4. select的触发方式是水平触发,应用程序如果没有完成对一个已经就绪的文件描述符进行IO操作,那么之后每次select调用还是会将这些文件描述符通知进程。

epoll调用过程

1 .epoll_create 创建一个epoll对象,一般epollfd = epoll_create()

2 .epoll_ctl (epoll_add/epoll_del的合体),往epoll对象中增加/删除某一个流的某一个事件

比如epoll_ctl(epollfd, EPOLL_CTL_ADD, socket, EPOLLIN);//注册缓冲区非空事件,即有数据流入     

      epoll_ctl(epollfd, EPOLL_CTL_DEL, socket, EPOLLOUT);//注册缓冲区非满事件,即流可以被写入

添加事件的时候,其实是向内核注册了一个回调函数。回调函数作用是,在相应的套接字上发生事件时,将其加入到epoll对象的时间就绪链表中,而这是在内核完成的。

3 epoll_wait(epollfd,...),获取就绪事件。即从就绪事件链表中取出所有的事件。

可以看到epoll比select高效的地方在于,其返回的就是所有已经发生事件的套接字,而不需要像select那样需要在用户态去判断每个套接字上是否有事件发生。

另外,在调用select时,内核需要去一一检测传入的套接字集合是否有事件,而调用epoll_wait时,只是将内核中的就绪数据取出而已

如果有n个连接,并且这n个连接都有事件发生,那么使用select与epoll其实并没有多少区别。对于select来说,用户态对每一个套接字的事件监测都是有效的。

但是select有一个问题是,每次去调用select之前,都要重置套接字set。如果连接数很大,每次FD_SET(fd, &set)调用接口,也会对性能造成不小的影响。而epoll中,只需调用一次epoll_ctl即可。

所以,在连接数很大,且活跃连接不多的情况下,使用epoll有明显的优势;而如果连接数较少,且连接基本都是活跃的,其实select的效果反而会更好。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

<<一种基于δ函数的图象边缘检测算法>>一文算法的实现。

  原始论文下载: 一种基于δ函数的图象边缘检测算法。      这篇论文读起来感觉不像现在的很多论文,废话一大堆,而是直入主题,反倒使人觉得文章的前后跳跃有点...

27050
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

图像抠图算法学习 - Shared Sampling for Real-Time Alpha Matting

 一、序言      陆陆续续的如果累计起来,我估计至少有二十来位左右的朋友加我QQ,向我咨询有关抠图方面的算法,可惜的是,我对这方面之前一直是没有研究过的。除...

86860
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

双指数边缘平滑滤波器用于磨皮算法的尝试。

  说起为什么会看到这个东西,那还真的绕一圈。首先在写《Single Image Haze Removal Using Dark Channel Prior》一...

33860
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

图像美容之眼睛放大算法。

   目前,手机上各种图像特效的软件应用App越来越盛行,比较有名如美图秀秀,camare360,美颜相机等,还有一些在某些特定的方向做的比较的优秀的如魔漫相...

503100
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

利用联合双边滤波或引导滤波进行升采样(Upsampling)技术提高一些耗时算法的速度。

     这十年来,在图像处理领域提出了很多新的图像分析和处理方法,包括是自动的以及一些需要有人工参与的,典型的比如stereo depth computati...

88560
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

对比度保留之彩色图像去色算法---基础算法也可以上档次。

    因昨日写的匆忙,有不少错误,特重写并增加了适当的解释,并且觉得对于搞图像处理的朋友来说,这个可能在很多场合还是用得着的,因此删除了原随笔,又重新发布了下...

347100
来自专栏HT

HTML5版的String Avoider小游戏

HTML5版的String Avoider小游戏 http://www.newgrounds.com/portal/view/300760 蛮简单也蛮考验耐心,...

26980
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

基于Fast Bilateral Filtering 算法的 High-Dynamic Range(HDR) 图像显示技术。

一、引言 本人初次接触HDR方面的知识,有描述不正确的地方烦请见谅。 为方便文章描述,引用部分百度中的文章对HDR图像进行简单的描述。 高动态范围图像(High...

52380
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

局部自适应自动色阶/对比度算法在图像增强上的应用。

    在限制对比度自适应直方图均衡化算法原理、实现及效果一文中针对全局直方图均衡化的一些缺点,提出了分块的自适应均衡化技术,很好的克服了全局直方图均衡化的一些...

82090
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

使用局部标准差实现图像的局部对比度增强算法。

      图像的对比度增强算法在很多场合都有着重要的应用,特别是在医学图像上,这是因为在众多疾病的诊断中,医学图像的视觉检查时很有必要的。而医学图像由于本身及...

44290

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励