对于select和poll,其主要原理跟epoll不同

poll和select的共同点就是,对全部指定设备(fd)都做一次poll,当然这往往都是还没有就绪的,那就会通过回调函数把当前进程注册到设备的等待队列,如果所有设备返回的掩码都没有显示任何的事件触发,就去回调函数的函数指针,进入有限时的睡眠状态,再恢复和不断做poll,再作有限时的睡眠,直到其中一个设备有事件触发为止。

总结:首先遍历所有监控的FD,对每个fd进行poll操作,所谓的poll操作包括把当前current进程挂fd的等待队列上(如果在之后的睡眠时间内,此fd就绪的话,会唤醒睡眠的进程(这是通过回调函数实现的??)),设置mask。如第一次对所有fd进行poll操作之后,没有任何fd就绪的,则进程进去schedule_timeout,即睡眠,如果睡眠时钟到,再次唤醒进程,重新对所有的FD,进行poll操作。

在设备收到一条消息(网络设备)或填写完文件数据(磁盘设备)后,会唤醒设备等待队列上睡眠的进程,这时current便被唤醒了。

__pollwait()函数中填充poll_table_entry结构体时注册的唤醒回调函数pollwake(),

进程被唤醒的条件有2:一是上面说的“一定时间”到了,二是被驱动程序唤醒。驱动程序发现条件就绪时,就把“某个队列”上挂着的进程唤醒,这个队列,就是前面通过poll_wait把本进程挂过去的队列。

总结:select和poll的缺点

1.每次要调用select和poll,意味着每次调用都要将fd列表从用户态拷贝到内核态,当fd数目很多时,这会造成低效。

2.每次做一次这样的系统调用都得轮询所有FD,次数是设备数*(睡眠次数-1),也就是时间复杂度是O(n),还得做几次O(n)呢。可见,对于现在普遍的服务器程序,需要同时并发监听数千个连接,并且连接需要重复使用的情况,poll和select就存在这样的性能瓶颈。

3、调用结束之后,需要遍历所有的FD,才能得到结果,即是select返回的是含有整个句柄的数组,应用程序需要遍历整个数组才能发现哪些句柄发生了事件,而epoll返回的是仅仅是就绪的数组

最新文章

  1. Entity Framework 教程——创建实体数据模型
  2. linux下遇见mysql启动报2002错误解决办法
  3. Spring系列之依赖注入的方式
  4. hadoop的概念
  5. linux 相关系列安装
  6. Tomcat遇到”Error listenerStart”或”Error filterStart”问题且无详细日志时的log配置.
  7. Java基础--访问权限控制符
  8. python selenium启动浏览器打开百度搜索
  9. hdu5044 Tree 树链拆分,点细分,刚,非递归版本
  10. MSSQL2008 中文乱码问题 (引自ljg888的专栏)
  11. 开源内容管理系统Joomla正式发布3.5版本 基于PHP 7
  12. SQL中的Join和Where的区别
  13. Redis 实现安全队列
  14. BZOJ1299 巧克力棒
  15. operator new和operator delete
  16. Centos 7.x nginx隐藏版本号
  17. DJango 基础 (2)
  18. 转载:configure执行流程(1.5.2)《深入理解Nginx》(陶辉)
  19. Newtonsoft.Json 转换DateTime类型为字符串时,串内部会有一个T。解决方案
  20. [1.16更新B14特征处理]津南数字制造题目解读及部分思路~~有趣的特征

热门文章

  1. java--构造器与static
  2. 线性表的链式存储——C语言实现
  3. DAY13-前端之JavaScript
  4. 如何边遍历集合边删除元素--使用Iterator中的remove()方法
  5. loader的简单使用过程分析
  6. MMSeg中文分词算法
  7. The Apache Tomcat installation at this directory is version 8.5.24 Tomcat 8.0 installation is expect
  8. HDOJ 1121 Complete the Sequence
  9. Java Swing 创建转圈的进度提示框
  10. CodeForces 566D Restructuring Company (并查集+链表)