poll 和 select 系统调用的真正实现是相当地简单, 对那些感兴趣于它如何工作的人; epoll 更加复杂一点但是建立在同样的机制上. 无论何时用户应用程序调用 poll, select, 或者 epoll_ctl,[24]24 内核调用这个系统调用所引用的所有文件的 poll 方法, 传递相同的 poll_table 到每个. poll_table 结构只是对一个函数的封装, 这个函数建 立了实际的数据结构. 那个数据结构, 对于 poll和 select, 是一个内存页的链表, 其中 包含 poll_table_entry 结构. 每个 poll_table_entry 持有被传递给 poll_wait 的 struct file 和 wait_queue_head_t 指针, 以及一个关联的等待队列入口. 对 poll_wait 的调用有时还添加这个进程到给定的等待队列. 整个的结构必须由内核维护以 至于这个进程可被从所有的队列中去除, 在 poll 或者 select 返回之前.

如果被轮询的驱动没有一个指示 I/O 可不阻塞地发生, poll 调用简单地睡眠直到一个它 所在的等待队列(可能许多)唤醒它.

在 poll 实现中有趣的是驱动的 poll 方法可能被用一个 NULL 指针作为 poll_table 参 数. 这个情况出现由于几个理由. 如果调用 poll 的应用程序已提供了一个 0 的超时值 (指示不应当做等待), 没有理由来堆积等待队列, 并且系统简单地不做它. poll_table 指针还被立刻设置为 NULL 在任何被轮询的驱动指示可以 I/O 之后. 因为内核在那一点 知道不会发生等待, 它不建立等待队列链表.

当 poll 调用完成, poll_table 结构被去分配, 并且所有的之前加入到 poll 表的等待 队列入口被从表和它们的等待队列中移出.

我们试图在图 poll 背后的数据结构中展示包含在轮询中的数据结构; 这个图是真实数据 结构的简化地表示, 因为它忽略了一个 poll 表地多页性质并且忽略了每个 poll_table_entry 的文件指针.

最新文章

  1. Zookeeper学习笔记
  2. Photoshop的评价
  3. JavaScript数组与对象的关系
  4. iOS Core Animation
  5. 【解决方案】VS2013外部工具中添加ildasm.exe
  6. [转]highcharts图表入门之:如何让highcharts图表自适应浏览器窗体的大小或者页面大小
  7. C# 中请求数据方式
  8. Android:Android SDK Manager顺利下载
  9. PAT 1018
  10. iOS之苹果和百度地图的使用
  11. shell脚本操作mysql数据库—创建数据库,在该数据库中创建表(插入,查询,更新,删除操作也可以做)
  12. 每一个Servlet只有一个实例,多个线程
  13. 多线程异步编程示例和实践-Thread和ThreadPool
  14. SQL Server查看视图定义总结
  15. 给 vue项目添加ESLint
  16. Java总结:开发环境
  17. 《JAVA与模式》之简单工厂与工厂方法
  18. cocos2d-x 3.2 关闭按钮点击立马销毁自己报错
  19. 赋值运算与深浅copy
  20. CentOS7.5安装notepadqq

热门文章

  1. java8的stream系列教程之filter过滤集合的一些属性
  2. 浅谈JavaScript的面向对象和它的封装、继承、多态
  3. Django1.11使用命令makemigrations提示No Changes
  4. datepicker插件的使用
  5. 部署zabbix3.2.7,升级到3.4、proxy部署
  6. hdu1503 LCS
  7. @RequestBody对象为空,异常Required request body is missing错误解决
  8. SpringMVC的简单传值总结
  9. jQuery,javascript获得网页的高度和宽度$(document).height / $(window).height
  10. Java练习 SDUT-2670_3-1 Point类的构造函数