[Linux网络编程]高并发-Epoll模型

概要介绍

        epoll是Linux下多路复用IO借口select/poll的增强版本,它能显著提高程序在大量并发连接但是只有少数活跃的情况下的系统CPU利用率,因为他会复用文件描述符几何来传递结果。另一点原因是获取事件的时候,它无需遍历整个被监听的描述符集,只要遍历哪些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了

2021-09-08
重新复习了一下代码,有几个注意点区别于selec,这边的结构体是一开始创建两个,重复使用(没有清空),event也是重复使用,每次epoll_ctl 添加拷贝了一次。注意epoll_ctl添加 和 删除注意区别 删除只需要fd 不需要结构体。

1 Epoll和Select区别对比

  1. epoll不存在集合的覆盖 epoll_create会返回一个fd,指向空间包含全部的事件(结构体)

  2. epoll把要监听的每一个fd都包装成一个事件,并把这个事件记入epollfd 让epollfd来监听

  3. select产生动静是吧fd放入集合 但是epoll通过epoll_wait 把产生动静的fd所包装好的事件放入结构体数组

  4. select需要备份,需要重新创建数组放fd循环比对,epoll直接通过包装好的事件(结构体)就能获得fd,效率也更快(差别主要体现在这)

  5. 两者的区别是的select适合用户客服端不多的情况,而epoll没有客户端的上限

2 Epoll模型的三个函数

2.1 函数原型+功能说明

#include <sys/epoll.h>

int epoll_create(int size);
作用:创建一个epoll句柄,告诉他需要监听的数目(也可以理解成申请一片空间,用于存放监听的套接字)

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
作用:控制某个epoll监控的文件描述符上的事件:注册,修改、删除(也就是增添 删除 修改一个事件)

int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)
作用:监听红黑树上的事件,将产生动静的事件放在event这个数组内,

2.2 epoll_create()参数使用

  • int epoll_create(int size);
  • 参数一:通知内核监听size个fd,只是个建议值并与硬件有关系。(从 Linux 内核 2.6.8 版本起,size 这个参数就被忽略了,只要求 size 大于 0 即可)
    返回值:返回epoll句柄(fd)

2.3 epoll_ctl()参数使用

  • int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

  • 参数一:int epfd:epoll_create()的返回值

  • 参数二:int op: 表示动作,用三个宏来表示

    • EPOLL_CTL_ADD(注册新的fd到epfd)
    • EPOLL_CTL_MOD(修改已经注册的fd监听事件)
    • EPOLL_CTL_DEL(从epfd删除一个fd)
  • 参数三:int fd 操作对象(socket)

参数四:struct epoll_evevt* evevt; 告诉内核需要监听的事件

结构体如下:
struct epoll_event {
   
__uint32_t events; 宏定义读和写EPOLLIN读EPOLLOUT写
epoll_data_t data; 联合体
};
联合体如下:

typedef union epoll_data {
   
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
  • 返回值:成功返回0,不成功返回-1

特别注意参数四的使用

2.4 epoll_wait()参数使用

  • int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)

  • 参数一:int epfd:epoll_create()函数返回值

  • 参数二:struct epoll_events* events用于回传代处理事件的数组(也就是存放产生动静的事件)

  • 参数三:int maxevents 同时最多产生多少事件,告诉内核events有多大,该值必须大于0

  • 参数四:int timeout表示 -1相当于阻塞,0相当于非阻塞,超时时间(单位:毫秒)

  • 返回值:成功返回产生动静事件的个数

补充说明: 产生动静是指

  1. 有新的客户端需要连接 或者
  2. 已连接的客户端发送了信息

3 Epoll模型封装成类

头文件

const int  MAXEPOLLSIZE = 10;

class Epoll
{
   
   public:
       Epoll();
       bool Add(int fd,int eventsOption);//添加事件

       //Returns the number of triggered events
       int Wait();//等待事件触发
	   bool Del(int fd);
       //bool Delete(const int eventIndex);//删除事件
       int  GetEventOccurfd(const int eventIndex) const;//得到事件数组某个值的fd
       int  GetEvents(const int eventIndex) const;//得到事件数组的宏//可读可写,触发方式

   private:
        int epollfd;//epoll专用文件描述符
        int fdNumber;//epollfd里面客户端有多少
        
        struct epoll_event event;//事件
        struct epoll_event events[MAXEPOLLSIZE];
        struct rlimit  rt;

};

源文件

  • 43
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: libevent是一个开源的C语言网络编程库,主要用于处理高并发网络连接。它提供了对事件驱动的支持,使得开发者可以方便地编写高效的并发网络应用程序。 libevent的核心是事件循环机制。在传统的网络编程中,通常需要使用多线程或多进程来处理并发连接,而使用libevent可以通过一个事件循环来处理多个连接。在事件循环中,可以注册多个事件,并定义回调函数来处理事件的触发。当有事件发生时,libevent会调用相应的回调函数来处理事件的处理逻辑。这样可以大大简化并发编程的复杂性,并提高程序的性能。 libevent的事件模型基于操作系统提供的I/O多路复用机制,如select、poll和epoll等。它可以在不同的操作系统平台上运行,并提供一致的接口和高效的事件处理机制。借助这些机制,libevent可以同时处理大量的并发连接,并保持低延迟和高吞吐量。 除了处理网络连接,libevent还提供了其他常用的功能,如定时器和信号处理等。它允许开发者在事件循环中注册定时器事件,可以用于定时任务的调度。同时,libevent还可以处理来自操作系统的信号,并提供了对信号的处理接口,以便开发者能够处理各种系统事件。 总之,libevent是一个功能强大、简单易用的高并发网络编程库,适用于开发各种类型的网络应用。无论是开发服务器、代理、聊天程序还是实时应用,libevent都能帮助开发者快速编写高性能的并发网络程序。 ### 回答2: libevent是一个开源的C/C++网络库,用于高性能的事件驱动编程。它提供了一个轻量级、可移植的框架,用于开发高并发的网络应用程序。 它的设计目标是提供一个高效的事件处理器,可以处理成千上万个并发连接,并且支持多线程并发处理。libevent基于事件驱动模型,通过异步I/O和回调函数来实现高并发处理网络请求。 libevent提供了一系列的函数来注册和监听各种网络事件,包括读、写、超时和信号等等。当一个事件发生时,libevent会调用相应的回调函数来处理事件。通过这种方式,我们可以非常方便地处理并发连接,并实现高性能的网络编程。 libevent的优点主要包括: 1. 高性能:libevent使用异步I/O和事件驱动模型,能够处理成千上万个并发连接,具有很高的处理能力。 2. 可移植性:libevent提供了统一的接口,可以在多种操作系统上运行,包括Linux、Windows、Mac等。 3. 易用性:libevent简单易用,只需注册感兴趣的事件和相应的回调函数,就可以实现高效的网络编程。 4. 多线程支持:libevent支持多线程并发处理,可以充分利用多核CPU的性能优势。 总之,libevent是一款非常适合高并发网络编程的开源库,它可以帮助我们实现高性能的服务器程序,提升系统的并发处理能力。无论是开发网络服务器还是网络应用程序,libevent都是一个不错的选择。 ### 回答3: libevent 是一个用于高并发网络编程的 C/C++ 库。它提供了一个跨平台的异步事件驱动的网络编程框架,能够实现高效地处理大量并发连接的需求。 libevent 的主要特点包括: 1. 异步事件驱动:libevent 使用事件驱动模型,主要利用非阻塞 I/O 和事件回调机制,能够高效地处理大量并发事件。 2. 跨平台支持:libevent 提供了跨不同操作系统的支持,包括 Windows、Linux、Unix 等,并且提供了统一的 API 接口,方便开发者进行跨平台开发。 3. 支持多种网络协议:libevent 支持 TCP、UDP、HTTP 等多种网络协议,为开发者提供了丰富的网络编程能力。 4. 高性能:libevent 的设计目标之一是高性能,它通过使用多路复用技术,将系统资源高效地利用起来,能够同时处理大量并发连接,并且保持低延迟。 5. 灵活易用:libevent 提供了简洁的 API,使用起来非常方便,可以快速实现高并发网络编程的需求。 总之,libevent 是一个强大而灵活的 C/C++ 库,适用于各种需要处理高并发连接的网络应用程序。无论是开发高性能服务器、代理、负载均衡器还是其他类似应用,libevent 都是一个值得推荐的选择。它的高效性能、跨平台支持和简洁易用的 API 接口使得开发者能够快速构建稳定可靠的高并发网络应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Windalove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值