本文转自C++爱好者博客 http://www.cppfans.org/author/eliteyang,顺便记录一下自己学习epoll的过程。

现如今,网络通讯中用epoll(linux)和IOCP(windows)几乎是大家津津乐道的东西,不为别的,就因为高效,所以大家喜欢用。IOCP的基础东西已经讲过了,可翻阅《IOCP浅析》 《IOCP浅析[二]——IOCP出现的意义和函数接口》.

什么是epoll?

epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集 合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符 集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的电平触发 (Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。Linux2.6内核中对/dev/epoll设备的访问的封装(system epoll)。

这个使我们开发网络应用程序更加简单,并且更加高效。

为什么要使用epoll?

同样,我们在linux系统下,影响效率的依然是I/O操作,linux提供给我们select/poll/epoll等多路复用I/O方式(kqueue暂时没研究过),为什么我们对epoll情有独钟呢?原因如下:

1.文件描述符数量的对比。

epoll并没有fd(文件描述符)的上限,它只跟系统内存有关,我的2G的ubuntu下查看是20480个,轻松支持20W个fd。可使用如下命令查看:

cat /proc/sys/fs/file-max

再来看select/poll,有一个限定的fd的数量,linux/posix_types.h头文件中

#define __FD_SETSIZE    1024

2.效率对比。

当然了,你可以修改上述值,然后重新编译内核,然后再次写代码,这也是没问题的,不过我先说说select/poll的机制,估计你马上会作废上面修改枚举值的想法。

select/poll会因为监听fd的数量而导致效率低下,因为它是轮询所有fd,有数据就处理,没数据就跳过,所以fd的数量会降低效率;而epoll只处理就绪的fd,它有一个就绪设备的队列,每次只轮询该队列的数据,然后进行处理。(先简单讲一下,第二篇还会详细讲解)

3.内存处理方式对比。

不管是哪种I/O机制,都无法避免fd在操作过程中拷贝的问题,而epoll使用了mmap(是指文件/对象的内存映射,被映射到多个内存页上),所以同一块内存就可以避免这个问题。

btw:TCP/IP协议栈使用内存池管理sk_buff结构,你还可以通过修改内存池pool的大小,毕竟linux支持各种微调内核。

epoll的工作方式

epoll分为两种工作方式LT和ET。

LT(level triggered) 是默认/缺省的工作方式,同时支持 block和no_block socket。这种工作方式下,内核会通知你一个fd是否就绪,然后才可以对这个就绪的fd进行I/O操作。就算你没有任何操作,系统还是会继续提示fd已经就绪,不过这种工作方式出错会比较小,传统的select/poll就是这种工作方式的代表。

ET(edge-triggered) 是高速工作方式,仅支持no_block socket,这种工作方式下,当fd从未就绪变为就绪时,内核会通知fd已经就绪,并且内核认为你知道该fd已经就绪,不会再次通知了,除非因为某些操作导致fd就绪状态发生变化。如果一直不对这个fd进行I/O操作,导致fd变为未就绪时,内核同样不会发送更多的通知,因为only once。所以这种方式下,出错率比较高,需要增加一些检测程序。

LT可以理解为水平触发,只要有数据可以读,不管怎样都会通知。而ET为边缘触发,只有状态发生变化时才会通知,可以理解为电平变化。

如何使用epoll?

使用epoll很简单,只需要

#include <sys/epoll.h>

有三个关键函数:

int epoll_create(int size);

int epoll_ctl(int epfd, int op, int fd, struct epoll_events* event);

int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);

当然了,不要忘记关闭函数.

============分割线==============

这篇就讲到这里了,下面两篇主要是函数介绍,效率分析,例子。

转载请注明:C++爱好者博客 » 浅析epoll-为何多路复用I/O要使用epoll

浅析epoll-为何多路复用I/O要使用epoll相关推荐

  1. Linux系统编程——I/O多路复用select、poll、epoll

    参考:https://segmentfault.com/a/1190000003063859 Linux下的I/O复用与epoll详解:https://www.cnblogs.com/lojunren ...

  2. linux tcp 多路复用,linux下 C++ 使用 epoll 多路复用 实现高性能的tcpserver

    linux系统中,实现socket多路复用的技术有select .poll .epoll 等多种方式.这些不同方式个有优缺点和适用场景,这不是本文讨论的重点,又兴趣的可以自己搜索学习一下.但是在高并发 ...

  3. python epoll 写数据到数据库_Python--day40(EPOLL的使用、数据库基础)

    1. EPOLL的使用 1.1 select存在的问题 1.select,需要遍历socket列表,频繁的对等待队列进行添加移除操作, 2.数据到达后还需要给遍历所有socket才能获知哪些socke ...

  4. Linux下的I/O多路复用select,poll,epoll浅析

    转载:http://blog.csdn.net/u011573853/article/details/52105365 一,什么是I/O多路复用  所谓的I/O多路复用在英文中其实叫 I/O mult ...

  5. 【Linux系统编程】I/O多路复用select、poll、epoll的区别使用

    I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用. select(),poll(),epoll()都是I/O多路复用的机制. ...

  6. IO多路复用 select、poll、epoll

    什么是IO多路复用 在同一个线程里面, 通过拨开关的方式,来同时传输多个(socket)I/O流. 在英文中叫I/O multiplexing.这里面的 multiplexing 指的其实是在单个线程 ...

  7. Linux 底层原理 —— epoll 与多路复用

    引言 epoll 是 Linux 系统下高性能网络服务的必备技术,很多面试中高频出现的 Nginx.Redis 都使用了这一技术,本文总结 linux 多路复用模型的演变过程,看一看epoll 是如何 ...

  8. 浅谈Python-IO多路复用(select、poll、epoll模式)

    1. 什么是IO多路复用 在传统socket通信中,存在两种基本的模式, 第一种是同步阻塞IO,其线程在遇到IO操作时会被挂起,直到数据从内核空间复制到用户空间才会停止,因为对CPython来说,很多 ...

  9. 详解磁盘IO、网络IO、零拷贝IO、BIO、NIO、AIO、IO多路复用(select、poll、epoll)

    文章很长,但是很用心! 文章目录 1. 什么是I/O 2. 磁盘IO 3. 网络IO 4. IO中断与DMA 5. 零拷贝IO 6. BIO 7. NIO 8. IO多路复用 8.1 select 8 ...

最新文章

  1. 百度重磅发布云手机:低配置也可玩大型游戏 21
  2. 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、编写自定义函数在三线表中添加p值
  3. java 算法练习题
  4. 盘点 6 个被淘汰的 Java 技术,它们都曾经风光过!| CSDN 博文精选
  5. Fastboot和Recovery
  6. 【互联网今日大事儿记】春运抢票开始啦!
  7. hibernate 别名_Hibernate:在sqlRestriction上使用联接表别名
  8. Java GUI 实现登录界面
  9. AJAX跨域请求的理解,JAVA
  10. 暴雪准备用AI打击“游戏喷子”
  11. python 画折线图 并标记
  12. 即时获取最新全国省市区县地图json数据(亲测可用)以及echarts中使用中国地图
  13. 十大经典算法及其优化
  14. 实用的网址(chrome官方离线安装包,chrome插件、 Google play apk下载等等 )
  15. 基于java+springboot+mysql的中小型超市进销存管理系统
  16. AMA回顾|走进“元宇宙工厂”BreederDAO
  17. 关于Entity FrameWork获取插入后的自增ID
  18. 如何制作一个自己的四足机器人
  19. 猫眼 — 破解数字反爬获取实时票房
  20. 生成树协议三姐妹:STP、RSTP 和 MSTP,附思科和华为双厂商命令示例

热门文章

  1. 方舟服务器修改错误,方舟进服务器提示网络错误怎么办 | 手游网游页游攻略大全...
  2. cd协议属于计算机网络的应用层,计算机网络 题库 必考 期末 期终 考试 复习 考研 必备...
  3. python soup findall 第几个元素_python – 如何在BeautifulSoup中获取所有父标签的列表?...
  4. 手机python软件怎么创建项目_pycharm怎么创建项目
  5. python的核心数据类型_Python核心数据类型-集合
  6. 无法显示服务器级别,URL Rewrite会导致“无法显示此页面”
  7. vfifo控制mig_MIG IP控制DDR3读写测试
  8. session每次请求都是新建的吗_每次去火车站都是提心吊胆,感觉就像进了贼窝一样,有同感的吗?...
  9. 奇奇seo优化软件_信阳seo优化排名软件
  10. 数据库查询某一列大写转化小写字母表示_基于MySQL数据库下亿级数据的分库分表...