• [C++网络协议] 优于select的epoll


    1.epoll函数为什么优于select函数

    select函数的缺点:

    1. 调用select函数后,要针对所有文件描述符进行循环处理。
    2. 每次调用select函数,都需要向该函数传递监视对象信息。

    对于缺点2,是提高性能的最大障碍。因为,套接字是操作系统来管理的,所以每次调用select函数,都会将要监视的对象信息传递给操作系统,这会对程序造成很大的负担。而且无法通过代码来解决,所以,缺点2是提高性能的最大障碍。

    所以,有没有这么一种函数,仅向操作系统传递一次监控对象,当监视范围或内容发生变化时,只通知发生变化的事项呢?

    答:epoll函数就具有问题里所说的功能。

    适合select函数的使用情形:

    1. 系统需要具有兼容性。epoll函数是基于Linux系统的,而select函数几乎所有系统都有。
    2. 服务器端接入者少。

    综上,epoll函数的优点:

    1. 无需编写以监视状态变化为目的的针对所有文件描述符的循环语句
    2. 调用对应于select函数的epoll_wait函数时,无需每次都传递监视对象信息,造成性能负担。

    2.epoll函数

    2.1 epoll_create函数

    作用:创建保存epoll文件描述符的空间

    1. #include
    2. int epoll_create(int size); //size:epoll实例的大小
    3. 成功返回epoll文件描述符
    4. 失败返回-1

    调用epoll_create函数时创建的文件描述符保存空间称为“epoll例程”。

    size参数的传递,只是向操作系统提供建议,实际上操作系统会根据情况调整epoll例程的大小。更实际上的是,Linux2.6.8版本后的内核将完全忽略size参数。

    注意:epoll_create函数创建的资源与套接字相同,都由操作系统来管理。所以返回的epoll文件描述符主要用于区分epoll例程的,需要终止时,也要和其他文件描述符相同,要调用close函数。

    2.2 epoll_ctl函数

    作用:向空间注册或注销文件描述符

    1. #include
    2. int epoll_ctl(
    3. int epfd, //用于注册监视对象的epoll例程的文件描述符
    4. int op, //用于指定监视对象的添加、删除、更改操作
    5. int fd, //需要监视的文件描述符
    6. struct epoll_event* event //监视对象的事件类型
    7. );
    8. 成功返回0,失败返回-1

    参数epfd:指定epoll例程空间

    参数op:

    含义
    EPOLL_CTL_ADD 将文件描述符注册到epoll例程
    EPOLL_CTL_DEL 将文件描述符从epoll例程中删除,第四个参数填NULL
    EPOLL_CTL_MOD 更改注册的文件描述符的关注事件发生情况

    参数fd:需要监视的文件描述符

    参数event:

    1. struct epoll_event
    2. {
    3. __uint32_t events;
    4. epoll_data_t data;
    5. }
    6. typedef union epoll_data
    7. {
    8. void* ptr;
    9. int fd;
    10. __uint32_t u32;
    11. __uint64_t u64;
    12. }epoll_data_t
    <
    events常量(可以通过位或“|”运算符传递多个参数 含义
    EPOLLIN
  • 相关阅读:
    Postgresql源码(73)两阶段事务PrepareTransaction事务如何与会话解绑
    边写论文边发疯,多大仇啊?导师批注学生论文:建议把致谢部分烧掉
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java手游账号交易系统u2741
    多线程与高并发——并发编程(7)
    初识Protobuf
    系统编程 day08 信号函数(信号量的使用方法,申请信号量初始化信号量 销毁信号的函数 (signal 信号捕捉函数)
    Mustango——音乐领域知识生成模型探索
    工业机械设备设计与艺术设计
    [Java安全]—Controller内存马
    openjudge 1.7.24 单词的长度
  • 原文地址:https://blog.csdn.net/A_ns_wer_/article/details/133176125