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简介的更多相关文章

  1. Epoll简介以及例子

    第一部分:Epoll简介 问题 :  Select,Poll和Epoll的区别 答案 : Epoll和Select的区别 1. 遍历方式的区别.select判断是否有事件发生是遍历的,而epoll是事 ...

  2. 基本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_系列函数). 操作系统中 ...

  3. epoll简介 与 UDP server的实现

    Abstractepoll是Linux内核为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系 ...

  4. epoll简介(一)

    一:概述   1:简介 EPOLL类似于POLL,是Linux特有的一种IO多路复用的机制.它在2.5.44内核中引入. 对于大量的描述符处理,EPOLL更有优势,它提供了三个系统调用来创建管理epo ...

  5. select、poll、epoll简介

    epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSIX所规定,一般操作系统均有实现 sele ...

  6. epoll简介(二)

    一:多路复用的举例 以一个生活中的例子来解释: 假设你在大学中读书,要等待一个朋友(数据)来访(要读),而这个朋友只知道你在A号楼(socket集合),但是不知道你具体住在哪里,于是你们约好了在A号楼 ...

  7. I/O多路复用之select,poll,epoll简介

    一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...

  8. linux下select/poll/epoll机制的比较

    select.poll.epoll简介 epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSI ...

  9. epoll ET模式陷阱分析

    0. 前言 这篇文章主要记录在使用epoll实现NIO接入时所遇到的问题. 1. epoll简介 epoll是Linux下提供的NIO,其主要有两种模式,ET(Edge trige)和LT(Level ...

随机推荐

  1. bzoj 3505 [Cqoi2014]数三角形——排列组合

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3505 好题!一定要经常回顾! 那个 一条斜线上的点的个数是其两端点横坐标之差和纵坐标之差的g ...

  2. flask之flask_socketio

    js客户端发送 {'op':'descrip', 100} python服务端收到的为 dict, 回复客户端可以用emit(str(json.dumps(dict)), room=roomname) ...

  3. Nginx报错 connect() failed (111: Connection refused) while connecting to upstream 的解决方法

    今天访问公司的网站突然报错,抛出一些英文,提示看一下Nginx的error.log日志: cd  /usr/local/nginx/logs/  看到了error.log ,下一步 tail -n 2 ...

  4. Java基础--虚拟机JVM

    JVM内存结构 Heap Space: 堆内存(Heap Space)是由Young Generation和Old Generation组成,而Young Generation又被分成三部分,Eden ...

  5. ThreadPoolTaskExecutor异常收集

    ThreadPoolTaskExecutor ipFinderThreads = new ThreadPoolTaskExecutor(); ipFinderThreads.setCorePoolSi ...

  6. 转:面对一个全新的环境,作为一个Oracle DBA,首先应该了解什么

    转载:面对一个全新的环境,作为一个Oracle DBA,首先应该了解什么 由于时间比较久了,找不到原文章的链接,先贴上内容供大家参考 在这里,不谈那些大的方面,比如了解整个IT环境整体情况,假设你已经 ...

  7. Maven的Snapshot版本与Release版本

    1. Snapshot版本代表不稳定.尚处于开发中的版本 2. Release版本则代表稳定的版本 3. 什么情况下该用SNAPSHOT? 协同开发时,如果A依赖构件B,由于B会更新,B应该使用SNA ...

  8. Adobe Flash 无法正常使用

    如果 Adobe Flash 无法正常使用,或者您看到以下错误消息,请尝试按照下文介绍的问题排查步骤操作. Adobe Flash 版本太旧,因此已被屏蔽无法加载插件该网页已屏蔽以下插件如果您使用的是 ...

  9. enable or disable Oracle block change tracking

    Oracle的block change tracking用于记录上次备份以来改变过的block信息,因此打开block change tracking可以大大加快增量备份的速度. 1. Enable ...

  10. eclipse中server location为灰色,不能修改

    Eclipse中tomcat service设置发布时间︰选择window ----show view---services可以看到服务的面板双击tomcat进入配置界面Service Locatio ...