I/O复用函数 select poll 和epoll的 区别

  函数原型:

   select: int select(int nfds.fd_set*readfds, fd_set* writefds, fd_set*  exceptfds,struct timeval* timeout);

     注释:timeout参数用来设置select函数的超时时间,如果timeout的参数都传递为0,则select将立即返回,如果传递为NULL,则select一直阻塞。

     poll:int poll(struct poll*fds,nfds_t nfds,int timeout);

        struct pollfd

{

      int fd;//文件描述符的个数;

      short events;//注册的事件;

      short revents;//实际发生的事件,由内核填充;

};

注释:其中,fd成员指定文件描述符;events成员告诉poll监听fd上有那些事件,它是一些列的按位或;revents成员则由内核修改,已通知应用程序fd上实际发生那些事件。

        nfds参数指定被监听事件集合fds的大小,类型为:typedef unsigned long int nfds_t;

        timeout参数指定poll的超时值,单位是毫秒。当timeout为-1时,poll将永远阻塞,直到某个事件发生;当timeout为0时,poll调用立即返回。

       epoll: int epoll_creat(int size);

     注释: size参数现在并不起作用,只是给内核一个提示,告诉他事件表需要多大,该函数返回的文件描述符将用作其他所有epoll系统调用的第一个参数,以指定要访问的内核事件表。

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

                  fd参数是要操作的文件描述符。op参数则指定操作类型:

                           ①EPOLL_CTL_ADD//往事件表中注册fd上的事件。

                           ②EPOLL_CTL_MOD//修改fd上注册事件

                           ③EPOLL_CTL_DEL//删除fd上的注册事件。

                   event参数指定事件,它是epoll_event结构指针类型

                            struct epoll_event

                           {

                                 _uint32_t events;//epoll事件

                                 epoll_data_t data;//用户数据

                           }

   其中events成员描述事件类型。

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

  成功返回文件就绪的个数,失败返回-1,maxevents参数指定最多监听多少个事件。

 1.select通过三个结构体分别表示可读,可写和异常事件。但是poll和epoll用一个short类型的变量表示关注的事件,事件类型更多。

  2.select通过32个元素的long类型数组按位记录文件描述符,最多关注1024个文件描述符,并且0~1023。poll和epoll都是通过一个int的fd表示的文件描述符。poll通过用户数组记录所有的文件描述符,epoll通过内核时间表记表记录,一般能达到系统的允许的最大文件描述符。

3.select通过三个结构传递用户的关注的文件描述符,也是通过其返回就绪和未就绪的文件描述符,所以每次调用select都要必须重新设置三个结构体,poll将用户关注的事件和内核反馈的发生的事件分开了,epoll通过数组返回就绪的内核事件。

4.select和poll返回就绪和未就绪的文件描述符,检测就绪的文件描述符时间复杂度为O(n),epoll直接通过数组仅仅返回就绪的文件描述符,检测就绪的描述符时间复杂度为O(1).

5.select和poll内核采用轮询的方式,epoll采用回调的方式。

6.select内核是数组,poll内核是链表,epoll内核是红黑树+链表

7.select 和poll仅仅支持LT模式,epoll支持高效的ET模式。

8.select和poll都是单独的函数,epoll是一组函数。

 

epoll  -> et模式:

              et:epoll_wait检测就绪事件,将其通知给应用程序,应用程序必须立即处理并且必须将事件处理完,如果未处理或者未处理完,则下一次epoll_wait并不会通知这个就绪事件。

            LT:epoll_wait检测到就绪事件,将其通知给应用程序,应用程序可以不立即处理或者处理不完,下一次epoll_wait依旧会通知这一事件。

       et效率比IT高。

   1.同一个et只会通知一次,IT会通知多次,epoll_wait函数调用多次,epoll_wait的调用需要消耗时间。

   2.LT模式下,epoll_wait因上一次事件未处理完而直接返回,造成对后续事件的延迟处理。

   3.et模式内核实现时,只会将rdlist中就绪的文件描述符通过txlist拷贝给用户空间,并且rdlist会被清空。LT内核实现时,将rdlist中就绪的文件描述符通过txlist拷贝给用户空间,rdlist也会清空。但是将未处理的或者处理未完成的文件描述符又返回给rdlist,以便下次返回使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值