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 的文件指针.

poll 和 select 底层的数据结构的更多相关文章

  1. 【Pyhton Network】使用poll()或select()实现非阻塞传输

    通常情况下,socket上的I/O会阻塞.即除非操作结束,否则程序不会照常进行.而以下集中情况需要在非阻塞模式下进行:1. 网络接口在等待数据时是活动的,可以做出相应:2. 在不使用线程或进程的情况下 ...

  2. poll和select

    都允许进程决定是否可以对一个或者多个打开的文件做非阻塞的读取或写入.这些调用也会阻塞进程,直到给定的文件描述符集合中的任何一个可读取或写入.常常用于那些要使用多个输入或输出流而又不会阻塞与其中任意一个 ...

  3. poll() 与 select()比较

    比较poll() 与select() 尽管poll()和select()所做的是相同的工作,不过poll()优于select(),原因:    1.poll()不需要用户计算并传递作为参数的最高编号的 ...

  4. linux epoll,poll,select

    epoll函数用法,还有点poll和select 1,LT的epoll是select和poll函数的改进版. 特点是,读完缓冲区后,如果缓冲区还有内容的话,epoll_wait函数还会返回,直到把缓冲 ...

  5. 四、poll()、select()和epoll()

    在用户程序中,poll()和select()系统调用用于对设备进行无阻塞访问.poll()和select()最终会调用设备驱动中的poll()函数,在我所使用的Linux内核中,还有扩展的poll() ...

  6. linux poll 和 select

    使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一 ...

  7. 多路转接之poll和select

    先看poll(): #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

  8. [转] Epoll 相对Poll和Select的优点

    http://blog.csdn.net/summerhust/article/details/18260117 PS: 相对select来说,Poll的监听列表比select更短,并且Poll的监听 ...

  9. Linux中的sleep、usleep、nanosleep、poll和select

    在进行Linux C/C++编程时,可调用的sleep函数有好多个,那么究竟应当调用哪一个了?下表列出了这几个函数间的异同点,可作为参考: 性质 精准度 线程安全 信号安全 sleep libc库函数 ...

随机推荐

  1. python中sort排序

    排序并且改变自身结果: nums.sort()

  2. 使用 Swift 构建自定义的ActivityIndicator View

    目前在自己的个人项目里,已经开始使用Swift去编写代码.这篇文章把项目中自己设计的一个ActivityIndicator View展示给大家. 在开始之前,我们先看看最终的效果,如下图: 我建议大家 ...

  3. day4_python之名称空间与作用域、闭包函数、嵌套函数

    一.名称空间与作用域 名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方 内置名称空间:在python解释器启动时产生,存放一些python内置的名字 全局名称空间:在执行文件 ...

  4. 初始化Redis密码

    在配置文件/etc/redis/redis.conf中有个参数: requirepass 这个就是配置redis访问密码的参数: 比如 requirepass test123: (需重启Redis才能 ...

  5. vim删除行

    0,vim filename 1,显示行号 :set number 2,跳转到第1000行 1000G (跳转到文件末尾:“G”) 3,删除1-1000行 :1,.d 4,删除所有行 先跳转到文件最后 ...

  6. 括号序列问题 uva 1626 poj 1141【区间dp】

    首先考虑下面的问题:Code[VS] 3657 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合 ...

  7. 三级分销会员一次查询出来的SQL语句

    SELECT p.id AS partyId, p.parent_id AS parentId, pul.username AS userName, p.city, p.birth_date AS b ...

  8. 动态设置iframe高度

    <%//动态设置iframe高度 %><script language="javascript" type="text/javascript" ...

  9. Datagrid添加右键菜单 标签: 三层EasyUI 2015-08-14 19:57 1029人阅读 评论(22)

    最近的一个项目前台使用的EasyUI,每个界面都有DataGrid控件,按照我们的想法,应该做出来的效果是单击选中,双击可编辑,当然右键也应该出现这些菜单按钮,想的挺好,那么该如何实现呢?一开始不知道 ...

  10. Java练习 SDUT-1149_计算题

    计算题 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个简单的计算,你需要计算f(m,n),其定义如下: 当m=1时 ...