• I/O复用-epoll模型


    epoll函数

    epoll函数的使用与select、poll上有很大的差异.

    • epoll使用一组函数来完成任务,而不是单个函数.
    • epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而无需每次都要重复传入文件描述符集或者事件集.
    • epoll需要一个额外的文件描述符,来唯一标示内核中的这个事件表.

    epoll函数

    #include <sys/epoll.h>
     int epoll_create(int size);  //size并不起作用,只是给内核一个提示,告诉它事件表需要多大.

    下面函数用来操作epoll的内核事件表

    #include <sys/epoll.h>
    int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event);
    /*fd参数是要操作的文件描述符,op指定操作类型*/

    op操作类型有如下3种:

    •  EPOLL_CTL_ADD  往事件表中注册fd上的事件.
    •  EPOLL_CTL_MOD  修改事件表中的注册事件.
    •  EPOLL_CTL_DEL  s删除fd上的注册事件.

    event参数指定事件,它是epoll_event结构指针类型.epoll_event的定义如下:

    struct epoll_event{
       __uint32_t events;  /*epoll事件*/
       epoll_data_t data;   /*用户数据*/
    };

    其中events成员描述事件类型,它与poll模型的事件类型基本相同.只是要在其类型前面加上"E",比如EPOLLIN.但epoll有两个额外的事件类型-EPOLLINETEPOLLONESHOT,它们对于epoll的高效运作非常关键.具体请查阅资料.

    data成员用于存储用户数据,其类型epoll_data_t的类型如下:

    typedef union epoll_data{
            void* ptr;
             int    fd;
             uint32_t u32;
             uint64_t u64;
    }epoll_data_t;

    epoll_data_t是一个联合体,其4个成员中使用最多的是fd.

    epoll_ctl成功时返回0,失败则返回-1并设置errno.

    epoll_wait函数

    #include <sys/epoll.h>
    int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout);

    函数成功时返回就绪的文件描述符的个数,失败时返回-1并设置errno.

    epoll_wait函数如果检测到事件,就将所有就绪的事件从内核事件表中(由epfd参数指定)中复制到它的第二个参数events指向的数组中.这个数组只用于输出epoll_wait检测到的就绪事件,而不像select和poll的数组参数那样既用于传入用户注册的事件,又用于输出内核检测到的就绪事件.这样极大的提高了应用程序索引就绪文件描述符的效率.

                                             poll和epoll在使用上的差别

    /*如何索引poll返回的就绪文件描述符*/
    int ret=poll(fds,MAX_EVENT_NUMBER,-1);
    /*必须遍历所有已注册文件描述符并找到其中的就绪*/
    for(int i=0;i<MAX_EVENT_NUMBER;i++){
         if(fds[i].revents & POLLIN){
                 int sockfd=fds[i].fd;
                 /*处理sockfd*/
         }
    }
    
    /*如何索引epoll返回的就绪的文件描述符*/
    int ret=epoll(epollfd,events,MAX_EVENTS,-1);
    /*仅遍历就绪的ret个文件描述符*/
    for(int i=0;i<ret;i++){
        int sockfd=events[i].data.fd;
        /*sockfd肯定就绪,直接处理*/
    }

     epoll的LT和ET模式

     epoll对文件描述符的操作有两种模式:LT和ET.当往epoll内核事件表中注册一个文件描述符上的EPOLLET事件时,epoll将以ET模式来操作该文件描述符.ET模式是epoll的高效工作模式.

     LT:当epoll_wait检测到其文件描述符上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件。这样,当应用程序下一次调用epoll_wait时,epoll_wait还会再次向应用程序通告此事件,直到该事件被处理。

     ET:当epoll_wait检测到其文件描述上的事件发生并将此通知应用程序后,应用程序必须立即处理,因为后续的epoll_wait调用将不再向应用程序通知这一事件.

     因此,ET模式在很大程度上降低了同一个epoll事件被触发的次数.所以效率要比LT模式高.

                                参考于 《Linux高性能服务器端编程》

  • 相关阅读:
    C#加密算法汇总
    解决无法连接到visual studio开发服务器的问题
    javascript
    js仿移动端的下拉刷新,上拉加载更多。
    博客园第一篇博文——做一个思考行动派
    $("<div />")代表的意思
    ini_set 设置php配置项 在windows和linux下的不同
    Java入门1
    Java入门2
    jQuery获取元素上一个、下一个、父元素、子元素
  • 原文地址:https://www.cnblogs.com/sixue/p/3977879.html
Copyright © 2020-2023  润新知