美文网首页
select pool 差异分析

select pool 差异分析

作者: Little熊猫 | 来源:发表于2020-08-11 18:55 被阅读0次

    一 使用方法

    1) seclect的用法

    
               FD_ZERO(&rfds);
               FD_SET(0, &rfds);
    
               /* Wait up to five seconds. */
    
               tv.tv_sec = 5;
               tv.tv_usec = 0;
    
               retval = select(1, &rfds, NULL, NULL, &tv);
               /* Don't rely on the value of tv now! */
    

    看fd_set的定义

    #define FD_SETSIZE 1024
    #define NFDBITS (8 * sizeof(fd_mask))
    typedef struct {
      fd_mask fds_bits[FD_SETSIZE/NFDBITS];
    } fd_set;
    

    select最多可以跟踪1024个文件或者socket.

    而poll的用法,单个文件与事件绑定,动态分配没有1024这个限制

    struct pollfd {
      int fd;
      short events;
      short revents;
    };
    int poll(struct pollfd *fds, nfds_t nfds, int timeout);
    

    二 内核实现

    记得之前2.6内核时看到poll和select的实现大体相同,现在就看一下Kernel如何实现这两个函数的。

    select
     |- __pselect6
         |- syscall pselect6
             |- do_pselect
                  |- poll_select_set_timeout
                     core_sys_select
                       |- do_select
                            |-(*f_op->poll)
                     poll_select_copy_remaining    
    
    

    poll的调用流程

    poll
      |- ppoll
          |- ppoll64
                |- __ppoll
                    |- SYSCALL ppoll
                         |- do_sys_poll
                              |- do_poll
                                   |- do_pollfd
                                       |- f.file->f_op->poll
    

    最后都是通过file的poll函数实现。因此本质上poll和select是实现是相似的,只不过用法不一样

    相关文章

      网友评论

          本文标题:select pool 差异分析

          本文链接:https://www.haomeiwen.com/subject/ewwydktx.html