多路复用IO-EPOLL

epoll是什么

    epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。

epoll怎么用

系统提供了三个epoll相关的函数,分别是:
int epoll_create(int size);   epoll_create() creates an epoll(7) instance.  Since Linux 2.6.8, the size argument is ignored, but must be greater than zero; see NOTES below.
epoll_create()  returns  a  file descriptor referring to the new epoll instance.  This file descriptor is used for all the subsequent calls to the epoll interface.  When no longer required, the
file descriptor returned by epoll_create() should be closed by using close(2).  When all file descriptors referring to an epoll instance have been closed, the kernel destroys the  instance  and
releases the associated resources for reuse.
epoll_create系统调用会创建一个epoll的实例, 从Linux 2.6.8之后,size参数就被忽略了但是必须要大于0
epoll_create返回一个指向一个新的epoll实例的文件描述符,这个文件描述符被用于随后对于epoll接口的调用。当不再被使用时
epoll_create返回的文件描述符应该用close关闭掉。当指向epoll实例的文件描述符被关闭,内核会释放掉该实例相关的资源

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epfd: epoll_create返回的文件描述符
op: EPOLL_CTL_ADD 把fd注册到epfd的关联  EPOLL_CTL_MOD 用event的属性修改已关联的fd  EPOLL_CTL_DEL 把fd从epfd关联中移除,event可以为NULL
fd: 要操作的文件描述符
event:event的events是由以下(常用)标志组成的位掩码
            EPOLLIN  fd读事件
            EPOLLOUT  fd写事件
            EPOLLET 给关联的fd设置边缘触发行为,默认是水平触发
            EPOLLPRI   可读紧急数据
            EPOLLERR 关联的fd出现了错误,epoll_wait总是关注此事件,不需要设置
            EPOLLHUP fd断开连接事件,epoll_wait总是关注此事件,不需要设置
            ...

水平触发(Level Triggered):当被监控的文件描述符有读写事件发生时,epoll会通知应用程序去处理,如果一次没有处理完所有的数据,下次调用epoll_wait,内核还会通知应用程序去处理,如果一直不去处理,内核就会一直通知
边缘触发(Edge Triggered):当被监控的文件描述符有读写事件发生时,epoll会通知应用程序去处理,如果没有处理,下次调用epoll_wait,内核不会通知应用程序去处理,直到该文件描述符出现第二次读写事件事,才会通知。
这种模式比水平触发效率高,系统不会充斥大量你不关心的就绪文件描述符。

LT-test:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值