libevent中用到的,epoll是Linux下多路复用IO接口select/poll的增强版本。网上找到的介绍资料,无法标明来源。

Q:网络服务器的瓶颈在哪? 
A:IO效率。

在大家苦苦的为在线人数的增长而导致的系统资源吃紧上的问题正在发愁的时候,Linux 2.6内核中提供的System Epoll为我们提供了一套完美的解决方案。传统的select以及poll的效率会因为在线人数的线形递增而导致呈二次乃至三次方的下降,这些直接导致了网络服务器可以支持的人数有了个比较明显的限制。

自从Linux提供了/dev/epoll的设备以及后来2.6内核中对/dev/epoll设备的访问的封装(System Epoll)之后,这种现象得到了大大的缓解,如果说几个月前,大家还对epoll不熟悉,那么现在来说的话,epoll的应用已经得到了大范围的普及。

那么究竟如何来使用epoll呢?其实非常简单。 
通过在包含一个头文件#include 以及几个简单的API将可以大大的提高你的网络服务器的支持人数。

首先通过create_epoll(int maxfds)来创建一个epoll的句柄,其中maxfds为你epoll所支持的最大句柄数。这个函数会返回一个新的epoll句柄,之后的所有操作将通过这个句柄来进行操作。在用完之后,记得用close()来关闭这个创建出来的epoll句柄。

之后在你的网络主循环里面,每一帧的调用epoll_wait(int epfd, epoll_event events, int max events, int timeout)来查询所有的网络接口,看哪一个可以读,哪一个可以写了。基本的语法为: 
nfds = epoll_wait(kdpfd, events, maxevents, -1); 
其中kdpfd为用epoll_create创建之后的句柄,events是一个epoll_event*的指针,当epoll_wait这个函数操作成功之后,epoll_events里面将储存所有的读写事件。max_events是当前需要监听的所有socket句柄数。最后一个timeout是epoll_wait的超时,为0的时候表示马上返回,为-1的时候表示一直等下去,直到有事件范围,为任意正整数的时候表示等这么长的时间,如果一直没有事件,则范围。一般如果网络主循环是单独的线程的话,可以用-1来等,这样可以保证一些效率,如果是和主逻辑在同一个线程的话,则可以用0来保证主循环的效率。

epoll_wait范围之后应该是一个循环,遍利所有的事件: 
for(n = 0; n < nfds; ++n) { 
               if(events[n].data.fd == listener) { //如果是主socket的事件的话,则表示有新连接进入了,进行新连接的处理。 
                   client = accept(listener, (struct sockaddr *) &local, 
                                   &addrlen); 
                   if(client < 0){ 
                       perror("accept"); 
                       continue; 
                   } 
                   setnonblocking(client); // 将新连接置于非阻塞模式 
                   ev.events = EPOLLIN | EPOLLET; // 并且将新连接也加入EPOLL的监听队列。 
注意,这里的参数EPOLLIN | EPOLLET并没有设置对写socket的监听,如果有写操作的话,这个时候epoll是不会返回事件的,如果要对写操作也监听的话,应该是EPOLLIN | EPOLLOUT | EPOLLET 
                   ev.data.fd = client; 
                   if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) { 
// 设置好event之后,将这个新的event通过epoll_ctl加入到epoll的监听队列里面,这里用EPOLL_CTL_ADD来加一个新的epoll事件,通过EPOLL_CTL_DEL来减少一个epoll事件,通过EPOLL_CTL_MOD来改变一个事件的监听方式。 
                       fprintf(stderr, "epoll set insertion error: fd=%d0, 
                               client); 
                       return -1; 
                   } 
               } 
               else // 如果不是主socket的事件的话,则代表是一个用户socket的事件,则来处理这个用户socket的事情,比如说read(fd,xxx)之类的,或者一些其他的处理。 
                   do_use_fd(events[n].data.fd); 
}

对,epoll的操作就这么简单,总共不过4个API:epoll_create, epoll_ctl, epoll_wait和close。

转载于:https://www.cnblogs.com/Victorzsg/p/3542477.html

Epoll为我们带来了什么相关推荐

  1. Linux网络编程 | 多路复用I/O :select、poll、epoll、水平触发与边缘触发、惊群问题

    文章目录 多路复用IO 多路复用IO的概念 多路复用IO与多线程/多进程的并发 多路复用IO模型进行服务器并发处理 多线程/多进程进行服务器并发处理 select 工作原理 接口 优缺点 select ...

  2. 五种高级IO | select poll epoll 水平触发模式 边缘触发模式 惊群问题

    一.高级IO 在介绍多路复用IO之前,先介绍一下其它四种高级IO: 阻塞IO: 在内核将数据准备好之前,系统调用会一直等待.所以的套集字默认是阻塞方式. 非阻塞IO: 在内核还未将数据准备好,则系统调 ...

  3. linux操作系统使用论文_Linux高性能服务器设计

    C10K和C10M 计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模.1999年,Dan Kegel提出了著名的C10问题:一台服务器上同 ...

  4. 83998 连接服务器出错_Linux高性能服务器设计

    C10K和C10M 计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模.1999年,Dan Kegel提出了著名的C10问题:一台服务器上同 ...

  5. 淘宝网前台应用性能优化实践

    本文曾发表于2013年4月的<程序员>杂志 近年来,随着用户数和PV的增加,淘宝网的后端服务器数量增长很快:并且我们知道,Web页面延迟时间和转化率之间有着直接的关联.出于提升系统吞吐量. ...

  6. Nginx学习之Nginx高性能的实现原理

    Nginx 采用的是多进程(单线程) & 多路IO复用模型,使用了 I/O 多路复用技术的 Nginx,就成了"并发事件驱动"的服务器,同时使用sendfile等技术,最终 ...

  7. 从0开始,在Linux中配置Nginx反向代理、负载均衡、session共享、动静分离

    写这篇文章花费了我近一周的时间,参考网上许多优秀的博客文章,我不敢说写的很好,至少很全很详细.本文先介绍原理部分,然后再进行实战操作,我认为这样才会有更深的理解,不过这也导致了文章篇幅很长.但是,如果 ...

  8. epoll相关资料整理

    http://www.cppblog.com/converse/archive/2008/10/13/63928.html epoll相关资料整理 学习epoll有一段时间了,最近终于有一个服务器采用 ...

  9. select,epoll,poll比较

    select,poll,epoll简介 select select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理.这样所带来的缺点是: 1 单个进程可监视的fd数量被限制 2 需要维 ...

最新文章

  1. python中实例方法分类_python方法的分类(实例方法、类方法、静态方法)
  2. Android Jetpack组件之Navigation使用-源码
  3. 内核级HOOK的几种实现与应用
  4. 《Zabbix-ICMP ping监控添加方法》-7
  5. Uber获土豪沙特35亿美元投资 不过别期待补贴增加
  6. (Java集合框架)集合框架概述和Collection常用功能及遍历
  7. Markdown批量发布到Github
  8. MyEclipse调试过程中遇到一个奇怪的问题
  9. 总结:Oracle快速入门
  10. 简单计算机面试题库及答案_计算机专业复试面试问题含答案
  11. 【python】os.getcwd和getcwdu
  12. Maven:导入Oracle的jar包时出现错误
  13. golang编译工具LiteIDE的调试使用方法(F5)
  14. 龙果充值平台,具备话费充值、流量充值、话费卡兑换功能;可以拓展其他充值兑换业务;也适用于支付、鉴权等业务功能的拓展。
  15. Docker使用概览图
  16. pythonATM,购物车项目实战_补充5-interface接口
  17. 怎样正确安装Photoshop CS6破解版【图文教程】
  18. java计算机毕业设计html5健身房信息管理系统源码+数据库+系统+lw文档
  19. 2022考研数学 张宇 基础班【配套张宇30讲】【免费分享】
  20. 将阿拉伯数字转为中文大写读法

热门文章

  1. halcon与c#联合编程的方法
  2. php按比例截图,php 按比例生成小图函数
  3. 虚拟机服务器503解决,(图文)解决重启VCSA 6.0提示:503 Service Unavailable错误
  4. php 多选的 二进制,PHP二进制操作初体验
  5. django报错is not a registered tag library. Must be one of
  6. 跨网页的新手引导_IOS中新手引导页面的实现(新手引导,Guide)
  7. python redis处理高并发-Python高并发解决方案实现过程详解
  8. Visual Paradigm 教程[UML]:如何在序列图中应用消息编号?
  9. 书籍:Python机器学习蓝图第2版 Python Machine Learning Blueprints 2nd - 2019.pdf
  10. C++_类和动态内存分配2-改进后的String类