关于poll与epoll
一:poll
1.poll与select相同,都是在指定时间内轮询一定数量的文件描述符,测试是否有就绪事件
2.poll的参数int (struct pollfd* fds,nfds_t nfds,int timeout)
fds是一个pollfd结构体类型的数组
pollfd类型三个参数:fd表示关注的文件描述符;
short events是告诉poll监听fd上的那些事件,是一系列事件的按位或,因为short有16位所以有16个事件;
short revents由内核修改,以通知应用程序fd上实际发生了哪些事情
nfds参数是一个无符号长整型数据,指定被监听事件集合fds'的大小
二:epoll
1.epoll与select和poll相比,epoll使用一组函数来完成任务而不是单个函数。其次epoll把用户关心(注册的文件描述符)的文件描述符放在一个内核事件表中,从而无需像select和poll那样每次调用都要重复传入文件描述符集或事件集。但是epoll需要使用一个额外的文件描述符,来唯一标识内核中的这个事件表,该文件描述符通过epoll_create(int size)来创建,参数的作用是给内核提示事件表需要多大
2.操作epoll的内核事件表的函数 int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event);
Epfd:内核事件表的fd fd:要操作的文件描述符 op:指定操作类型,有三种往事件表上注册fd上的事件,修改fd上的注册事件,删除fd上的注册事件
Event 指定事件struct epoll_event中的两个成员 是:epoll事件和一个epoll_data_t(union联合体)类型的用户数据
epoll_data_t中有一个fd,它指定事件所从属的目标文件描述符
epoll事件其余与poll相同但是比poll多了两个EPOLLET(ET模式注册的事件)和EPOLLONESHOT
3.epoll_wait:int epoll_wait(int epfd,struct epoll_event* events,int maxenevts,int timeout)
函数成功时返回就绪的文件描述符的个数,失败返回-1,并设置error
maxevents指定最多监听多少个事件,必须大于0
*events:数组,接收就绪fd
如果epoll_wait检测到事件就将所有就绪的事件从内核事件表中复制到第二个参数events中。这个数组只用于输出epoll_wait检测到的就绪事件,而不像selelct和poll的数组参数那样既用于传入用户注册事件又用于输出内核检测到的就绪事件,这就极大的提高了应用程序索引就绪文件描述符的效率。
4.LT普遍的默认水平触发模式 ET高效的边缘触发:当往epoll内核事件表中注册一个文件描述符上的EPOLLET事件时epoll将以ET模式来操作该文件描述符。
LT模式是当epoll_wait检测到它上面有事件发生并将此通知应用程序时应用程序可以不立即处理该事件,这样当下一次调用epoll_Wiat时,epoll_wait还会再次向应用程序通告此事,直到该事件被处理。而ET,当epoll_wait检测到并通知应用程序后,应用程序必须立即处理该事件,因为后续epoll_wait将不会在向应用层程序通知该事件。ET在很大程度上降低了同一个epoll事件被重复触发的次数,因此比LT模式要高效。
5.使用ET模式的文件描述符都应该是非阻塞的,如果是阻塞的,那么读或者写操作将因为没有后续的的事件而一直处于阻塞状态。
6.EPOLLONESHOT即使使用ET模式,一个socket上的某个事件还是可能被触发多次。在并发时就会引起问题。比如一个线程/进程 ,读取完某个socket上的数据后开始处理这些数据,而在处理数据时socket上又有新的数据可读(EPOLLIN)再次触发,此时另外一个线程被唤醒来读取这些新的数据。于是就出现了两个线程同时操作一个socket的局面。EPOLLONESHOT就可以解决这个问题,使得一个socket在连接的任意时间都只被一个线程处理。
对于注册了EPOLLONTSHOT事件的文件描述符,操作系统最多触发其上注册的一个可读可写或者异常事件,且只触发一次,除非我们使用epoll_ctl函数重置该文件描述符上注册的EPOLLONESHOT事件。
反向考虑,这种设计是对的,注册了EPOLLONESHOT事件的socket一旦被某个线程处理完毕,该线程就应该立即重置这个socket上的EPOLLONESHOT事件,以确保下一次可读的时候,其EPOLLIN事件可以被触发,进而让其他工作线程有机会继续处理这个socket。
关于poll与epoll相关推荐
- linux下poll和epoll内核源代码剖析
作者:董昊 博客链接http://donghao.org/uii/ poll和epoll的使用应该不用再多说了.当fd很多时,使用epoll比poll效率更高. 我们通过内核源码分析来看看到底是为什么 ...
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll、Epoll模型处理长连接性能比较
在<朴素.Select.Poll和Epoll网络编程模型实现和分析--模型比较>一文中,我们分析了各种模型在处理短连接时的能力.本文我们将讨论处理长连接时各个模型的性能.(转载请指明出于b ...
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——模型比较
经过之前四篇博文的介绍,可以大致清楚各种模型的编程步骤.现在我们来回顾下各种模型(转载请指明出于breaksoftware的csdn博客) 模型编程步骤对比 <朴素.Select.Poll和Ep ...
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Epoll模型
在阅读完<朴素.Select.Poll和Epoll网络编程模型实现和分析--Select模型>和<朴素.Select.Poll和Epoll网络编程模型实现和分析--Poll模型> ...
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll模型
在<朴素.Select.Poll和Epoll网络编程模型实现和分析--Select模型>中,我们分析了它只能支持1024个连接同时处理的原因.但是在有些需要同时处理更多连接的情况下,102 ...
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型
在<朴素.Select.Poll和Epoll网络编程模型实现和分析--朴素模型>中我们分析了朴素模型的一个缺陷--一次只能处理一个连接.本文介绍的Select模型则可以解决这个问题.(转载 ...
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——朴素模型
做Linux网络开发,一般绕不开标题中几种网络编程模型.网上已有很多写的不错的分析文章,它们的基本论点是差不多的.但是我觉得他们讲的还不够详细,在一些关键论点上缺乏数据支持.所以我决定好好研究这几个模 ...
- Linux多线程编程----IO【select、poll、epoll】
IO操作多 速度就下降 IO数据的 读和写 IO的完成 必须等到 读事件(如磁盘 拷贝 每次要从磁盘查找数据) 和 写事件 (允许写 如写太快 写满就要马上阻塞)的就绪 IO是否高效 :主要看一 ...
- 0730------Linux网络编程----------服务器端模型(迭代,多进程,多线程,select,poll,epoll 等)...
1.迭代服务器模型 1.1 迭代服务器是处理多个请求时一种最简单直接的思路,即使用while循环,它不具有并发能力,即必须一个一个的处理客户的请求. 1.2 程序示例. #include " ...
- Select、Poll、Epoll IO复用技术
我们之前采用的多进程方式实现的服务器端,一次创建多个工作子进程来给客户端提供服务.其实这种方式是存在问题的. 可以打个比方:如果我们先前创建的几个进程承载不了目前快速发展的业务的话,是不是还得增加进程 ...
最新文章
- 关于spring读取配置文件的两种方式
- 用php写一个可以抽取随机数的工具一次只抽四个怎么实现?_面试了一个32岁的程序员,场面一度很尴尬。...
- php调用pdf2html,php html2pdf
- python数值积分_python实现数值积分的Simpson方法实例分析
- 揭秘网络:互联网调查入门 出版发行时间_cqy、cdx、zqsg……啥意思?揭秘QQ上的“00后黑话”...
- [Yii Framework] yii中如何不加载layout
- Unity3D实践2:控制物体移动与旋转
- Dev-C++下载与安装教程
- 微信小程序常用api
- Tampermonkey油猴教程及Greasyfork脚本使用
- PDF虚拟打印机(pdfFactory) v5.11 官方版
- A4张的尺寸大小是多大?像素又是多少呢?
- 微信公众号网页授权流程
- 操作系统期末大题类型题解
- excel表格如何把含有数字的单元格筛选出来?
- 高等数学:一元函数微分学
- 逐点分析,这样做Web端性能测试更易上手
- 【Transformers】第 5 章:微调文本分类的语言模型
- 7005-艺赛旗RPA8.0产品介绍(2019.01)
- 吐槽微软,远离微软!