I/O多路复用(二):poll

2017-07-09 12:55 阅读 582 次 评论 0 条

poll的提出弥补了select的两大不足,但是poll本身也存在弊端,在I/O多路转接中,poll是承接select启发epoll模型的一个过渡,掌握并熟悉它可以帮助我们更好的理解epoll模型。

poll是如何解决select的缺点?

⑴ poll所监视的文件描述符无上限。

select之所以有限制,是因为它采用位图来存储,特定的数据结构必然是有限制的。而poll使用一个pollfd的指针,基于链存储,理论上没有最大连接数的限制,但受内存大小限制。

⑵ 效率较高,减少了冗余操作。

select每一次都要重新将监测的fd设置进fd_set,而poll将输入参数与输出参数分离开来,用events表示监测的fd,revents表示就绪的fd,因此只需要设置一次。

poll的系统调用接口

不同于select使用三个fd_set的方式,poll只使用了一个pollfd的指针来实现。

poll在使用时,用events和revents将事件分离开来,这样可以使得对关心的事件只进行设置一次。

事件 说明
POLLIN 普通或优先级带数据可读
POLLRDNORM 普通数据可读
POLLRDBAND 优先级带数据可读
POLLPRI 高优先级数据可读
POLLOUT 普通数据可写
POLLWRNORM 普通数据可写
POLLWRBAND 优先级带数据可写
POLLERR 发生错误
POLLHUP 发生挂起
POLLNVAL 描述字不是一个打开的文件

如果我们要设置两个事件,就使用 | 操作;如果要查看事件是否发生时,可以使用revents & 事件,若结果大于1,则证明有事件就绪。

参数nfds:用来监视文件描述符的数目。

参数timeout:与select的timeout一致,依据值的不同含义如下:

  参数 说明
    -1 以阻塞的方式等待某个事件发生
     0 非阻塞轮询方式,不断检测fd的状态,然后立即返回
   >0 每隔一段时间等待一次

poll的返回值:成功返回就绪事件的个数,超时返回0,失败返回-1。

poll的缺陷

即使poll是select的plus版本,但是还是遗留了select的一个缺点,poll在返回时,需要轮询pollfd来获取就绪的文件描述符,这是select的历史遗留问题,而poll也没能改变。

其次,poll自身也带来了冗余,大量的fd的数组被整体复制于用户态与内核地址空间之间,而无论这样的复制是否有意义。

poll网络服务器

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:I/O多路复用(二):poll | 术与道的分享
1024do.com导航_术与道导航平台

发表评论


表情