epoll简介
1.epoll简介
epoll是I/O事件通知工具,与select/poll相比,epoll最大的好处在于它不会随着监听fd数目的增长而效率降低。
epoll API既可以用作edge触发的接口,也可以用作level触发,并且对于监听大量的文件描述符同样有很好的性能。
因为内核中的select采用轮询实现的,轮询的fd数目越多,耗时越多。并且,在linux/posix_types.h中#define __FD_SETSIZE 1024
即select最多同时监听1024个fd,当然,可以通过修改头文件再重编译内核来扩大这个数目,但这似乎并不治本。
2.epoll使用方法
(1)使用epoll_create()创建一个epoll实例。
(2)通过epoll_ctl()将想监听的文件描述符和其事件注册进epoll实例中。
POLL_CTL_ADD:注册目标文件描述符,并将事件event与相关联。
EPOLL_CTL_MOD: 更改与目标文件描述符fd关联的事件event。
EPOLL_CTL_DEL: 溢出指定的FD
可设置的监听事件类型:
EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里
(3)通过epoll_wait()来阻塞监听I/O事件。
3.edge触发和level触发的区别
epoll事件分发接口能够表现为边缘触发(ET)和水平触发(LT)。 两种机制之间的差异可以描述如下。 假设发生这种情况:
①表示管道读取端(rfd)的文件描述符在epoll实例上注册。
②管道的写入端在管道的wfd上写入2kB的数据。
③完成对epoll_wait()的调用,将rfd作为就绪文件描述符返回。
④管道读取端先从rfd读取1kB数据。
⑤完成对epoll_wait()的调用。
如果已使用EPOLLET(边缘触发)标志将rfd文件描述符添加到epoll接口,则尽管文件输入缓冲区中仍存在可用数据,但在步骤⑤中的对
epoll_wait()的调用可能会挂起。原因是边缘触发模式仅在受监视文件描述符发生更改时才传递事件。因此在步骤5中对epoll_wait()的调用
可能会无限期地被阻塞。
用作水平触发时(默认是水平触发的,未指定EPOLLET时),epoll只是一个更快的poll()。
4.注意事项
使用epoll的应用程序应使用非阻塞(O_NONBLOCK)文件描述符(select/poll应该也是一样的)建议方法如下:
a.使用非阻塞文件描述符;
b.仅在read()或write()之后检查errno值是否是EAGAIN。(若是非阻塞的读,读完了返回-EAGAIN,缓存区写满了返回-EAGAIN)
5.EPOLL_CTL_MOD标志
即使使用边缘触发的epoll,也可以在收到多个事件,调用者可以选择指定EPOLLONESHOT标志,告诉epoll在收到
epoll_wait()事件后禁用关联的文件描述符。 当指定了EPOLLONESHOT标志时,若想再次使用epoll来监听这个描述符调用者
需要使用epoll_ctl(EPOLL_CTL_MOD)重新安装此文件描述符。
6.epoll的/proc接口
/proc/sys/fs/epoll/max_user_watches 用于限制epoll()监听的最大文件描述符的个数,用于限制对内核内存的使用。默认是4%的内存占用。
可参考:
高并发网络编程之epoll详解:https://blog.csdn.net/shenya1314/article/details/73691088
epoll 总结:https://blog.csdn.net/xiangguiwang/article/details/80659826
epoll简介的更多相关文章
- Epoll简介以及例子
第一部分:Epoll简介 问题 : Select,Poll和Epoll的区别 答案 : Epoll和Select的区别 1. 遍历方式的区别.select判断是否有事件发生是遍历的,而epoll是事 ...
- 基本I/O模型与Epoll简介
5种基本的I/O模型:1)阻塞I/O ;2)非阻塞I/O; 3)I/O复用(select和poll);4)信号驱动I/O(SIGIO);5)异步I/O(POSIX.1的aio_系列函数). 操作系统中 ...
- epoll简介 与 UDP server的实现
Abstractepoll是Linux内核为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系 ...
- epoll简介(一)
一:概述 1:简介 EPOLL类似于POLL,是Linux特有的一种IO多路复用的机制.它在2.5.44内核中引入. 对于大量的描述符处理,EPOLL更有优势,它提供了三个系统调用来创建管理epo ...
- select、poll、epoll简介
epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSIX所规定,一般操作系统均有实现 sele ...
- epoll简介(二)
一:多路复用的举例 以一个生活中的例子来解释: 假设你在大学中读书,要等待一个朋友(数据)来访(要读),而这个朋友只知道你在A号楼(socket集合),但是不知道你具体住在哪里,于是你们约好了在A号楼 ...
- I/O多路复用之select,poll,epoll简介
一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...
- linux下select/poll/epoll机制的比较
select.poll.epoll简介 epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSI ...
- epoll ET模式陷阱分析
0. 前言 这篇文章主要记录在使用epoll实现NIO接入时所遇到的问题. 1. epoll简介 epoll是Linux下提供的NIO,其主要有两种模式,ET(Edge trige)和LT(Level ...
随机推荐
- Qt中如何用QImage::Format_Indexed8表示灰度图
QImage *qi = new QImage(data_ptr, width, height, QImage::Format_Indexed8); QVector<QRgb> grayT ...
- HTML5一些元素的整理
address元素: 定义和用法 <address> 标签定义文档或文章的作者/拥有者的联系信息. 如果 <address> 元素位于 <body> 元素内,则它表 ...
- webapi中使用token验证(JWT验证)
本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get(" ...
- 2015.5.9 C#编写DLL及C#调用C#DLL
过程比C#调用VC++dll简单. 一.创建DLL 新建工程,类型选择类库,生成的结果就是dll 注意:在项目属性-应用程序中,注意三个地方,程序集名称和默认命名空间可以调整,但要一致,别的程序调用此 ...
- Class python31
# class Teacher: # def __init__(self, name, age, sex, salary, level): # self.name = name # self.age ...
- 10-17C#语句(3)--跳转语句、异常处理语句
回顾: 穷举法(重点掌握):虽然运用for...嵌循环语句,但是也要找到执行for...循环的规律, 即一个题目中,需要得到哪个值,首先定义它初始变量:哪个条件需要改变,它对应的就是for...循环的 ...
- 类型:.net;问题:ASP.NET路由;结果:ASP.NET 路由 .NET Framework 4
ASP.NET 路由 .NET Framework 4 更新:2007 年 11 月 ASP.NET 路由使您可以使用不必映射到网站中特定文件的 URL.由于 URL 不必映射到文件,所以可以在 ...
- 用UltraISO把硬盘文件制作成ISO格式
转自:https://wenku.baidu.com/view/0052c88dcc22bcd126ff0cbf.html 用UltraISO把硬盘文件制作成ISO格式方法: 制作硬盘ISO文件步骤一 ...
- cookie禁用后重定向跳转时session的跟踪
- Java知识点总结1
1.java的引用传递和值传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...