浅析epoll-为何多路复用I/O要使用epoll
本文转自C++爱好者博客 http://www.cppfans.org/author/eliteyang,顺便记录一下自己学习epoll的过程。
现如今,网络通讯中用epoll(linux)和IOCP(windows)几乎是大家津津乐道的东西,不为别的,就因为高效,所以大家喜欢用。IOCP的基础东西已经讲过了,可翻阅《IOCP浅析》 《IOCP浅析[二]——IOCP出现的意义和函数接口》.
什么是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相关推荐
- Linux系统编程——I/O多路复用select、poll、epoll
参考:https://segmentfault.com/a/1190000003063859 Linux下的I/O复用与epoll详解:https://www.cnblogs.com/lojunren ...
- linux tcp 多路复用,linux下 C++ 使用 epoll 多路复用 实现高性能的tcpserver
linux系统中,实现socket多路复用的技术有select .poll .epoll 等多种方式.这些不同方式个有优缺点和适用场景,这不是本文讨论的重点,又兴趣的可以自己搜索学习一下.但是在高并发 ...
- python epoll 写数据到数据库_Python--day40(EPOLL的使用、数据库基础)
1. EPOLL的使用 1.1 select存在的问题 1.select,需要遍历socket列表,频繁的对等待队列进行添加移除操作, 2.数据到达后还需要给遍历所有socket才能获知哪些socke ...
- Linux下的I/O多路复用select,poll,epoll浅析
转载:http://blog.csdn.net/u011573853/article/details/52105365 一,什么是I/O多路复用 所谓的I/O多路复用在英文中其实叫 I/O mult ...
- 【Linux系统编程】I/O多路复用select、poll、epoll的区别使用
I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用. select(),poll(),epoll()都是I/O多路复用的机制. ...
- IO多路复用 select、poll、epoll
什么是IO多路复用 在同一个线程里面, 通过拨开关的方式,来同时传输多个(socket)I/O流. 在英文中叫I/O multiplexing.这里面的 multiplexing 指的其实是在单个线程 ...
- Linux 底层原理 —— epoll 与多路复用
引言 epoll 是 Linux 系统下高性能网络服务的必备技术,很多面试中高频出现的 Nginx.Redis 都使用了这一技术,本文总结 linux 多路复用模型的演变过程,看一看epoll 是如何 ...
- 浅谈Python-IO多路复用(select、poll、epoll模式)
1. 什么是IO多路复用 在传统socket通信中,存在两种基本的模式, 第一种是同步阻塞IO,其线程在遇到IO操作时会被挂起,直到数据从内核空间复制到用户空间才会停止,因为对CPython来说,很多 ...
- 详解磁盘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 ...
最新文章
- 百度重磅发布云手机:低配置也可玩大型游戏 21
- 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、编写自定义函数在三线表中添加p值
- java 算法练习题
- 盘点 6 个被淘汰的 Java 技术,它们都曾经风光过!| CSDN 博文精选
- Fastboot和Recovery
- 【互联网今日大事儿记】春运抢票开始啦!
- hibernate 别名_Hibernate:在sqlRestriction上使用联接表别名
- Java GUI 实现登录界面
- AJAX跨域请求的理解,JAVA
- 暴雪准备用AI打击“游戏喷子”
- python 画折线图 并标记
- 即时获取最新全国省市区县地图json数据(亲测可用)以及echarts中使用中国地图
- 十大经典算法及其优化
- 实用的网址(chrome官方离线安装包,chrome插件、 Google play apk下载等等 )
- 基于java+springboot+mysql的中小型超市进销存管理系统
- AMA回顾|走进“元宇宙工厂”BreederDAO
- 关于Entity FrameWork获取插入后的自增ID
- 如何制作一个自己的四足机器人
- 猫眼 — 破解数字反爬获取实时票房
- 生成树协议三姐妹:STP、RSTP 和 MSTP,附思科和华为双厂商命令示例
热门文章
- 方舟服务器修改错误,方舟进服务器提示网络错误怎么办 | 手游网游页游攻略大全...
- cd协议属于计算机网络的应用层,计算机网络 题库 必考 期末 期终 考试 复习 考研 必备...
- python soup findall 第几个元素_python – 如何在BeautifulSoup中获取所有父标签的列表?...
- 手机python软件怎么创建项目_pycharm怎么创建项目
- python的核心数据类型_Python核心数据类型-集合
- 无法显示服务器级别,URL Rewrite会导致“无法显示此页面”
- vfifo控制mig_MIG IP控制DDR3读写测试
- session每次请求都是新建的吗_每次去火车站都是提心吊胆,感觉就像进了贼窝一样,有同感的吗?...
- 奇奇seo优化软件_信阳seo优化排名软件
- 数据库查询某一列大写转化小写字母表示_基于MySQL数据库下亿级数据的分库分表...