1 linux的poll操作

linux文件的poll操作有两个主要目的:第一,主动查看该文件上是否有读写事件;第二,提供操作waitqueue的接口给epoll等上层接口使用,比如epoll可以通过直接调用其所监视的文件的poll操作来注册自己的回调到该文件的waitqueue中,所谓的回调就是waitqueue entry中的function,这样的话,当epoll所监视的文件有数据到来的话,注册到waitqueue中的回调就回被调用,然后该文件就可以被放入epoll的rdllist中。

2 ep_item_poll和ep_poll_callback

ep_item_poll中将ep_poll_callback作为waitqueue entry的function注册给所监视的文件的waitqueue。

3 rdllist和ovflist

有读写事件的文件都放在rdllist这个队列中。在用户epoll_wait的时候,需要将rdllist拷贝到用户空间并且加锁,这个时候如果来了新的事件,就先放在ovflist中,在rdllist不忙的时候再放入其中。

4 epoll_create、epoll_ctl和epoll_wait

epoll_create是为当前线程创建一个epoll实体来监视所需要监视的文件,epoll_ctl是往epoll中加入需要监视的文件,epoll_wait是查看是否有事件到来,并且进行相应的处理,因为要一直监视,所以,需要一个死循环不断的进行epoll_wait。

如果当前线程上没有读写事件,epoll_wait会被挂起,醒来策略和timeout时间的设置有关,如果是正的t,那么就等待这个时间t之后醒来,如果是0,那么立即返回,如果是负数,那么一直等到至少有一个事件到来,或者有error了醒来。

之所以需要设置timeout,是因为epoll_wait如果没有发现事件会挂起的,如果没有信号没有事件到来,如果不弄一个timeout,线程就死在这里了。当然,有新的事件到来会唤醒它的。

linux epoll的实现原理的更多相关文章

  1. Java网络编程和NIO详解6:Linux epoll实现原理详解

    Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO h ...

  2. Windows完成端口与Linux epoll技术简介

    收藏自:http://www.cnblogs.com/cr0-3/archive/2011/09/09/2172280.html WINDOWS完成端口编程1.基本概念2.WINDOWS完成端口的特点 ...

  3. 源码剖析Linux epoll实现机制及Linux上惊群

    转载:https://blog.csdn.net/tgxallen/article/details/78086360 看源码是对一个技术认识最直接且最有效的方式了,之前用Linux Epoll做过一个 ...

  4. Windows完成端口与Linux epoll技术简介(能看懂)

    WINDOWS完成端口编程1.基本概念2.WINDOWS完成端口的特点3.完成端口(Completion Ports )相关数据结构和创建4.完成端口线程的工作原理5.Windows完成端口的实例代码 ...

  5. 深入理解NIO(四)—— epoll的实现原理

    深入理解NIO(四)—— epoll的实现原理 本文链接:https://www.cnblogs.com/fatmanhappycode/p/12362423.html 终于来到最后了,万里长征只差最 ...

  6. Server Develop (六) Linux epoll总结

    Linux  epoll epoll是Kernel 2.6后新加入的事件机制,在高并发条件下,远优于select.epoll最大的好处在于它不会随着监听fd数目的增长而降低效率.因为在内核中的sele ...

  7. Linux数据包路由原理、Iptables/netfilter入门学习

    相关学习资料 https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html http://zh.wik ...

  8. Linux Epoll介绍和程序实例

    Linux Epoll介绍和程序实例 1. Epoll是何方神圣? Epoll但是当前在Linux下开发大规模并发网络程序的热门人选,Epoll 在Linux2.6内核中正式引入,和select类似, ...

  9. Linux epoll总结

    Linux epoll总结 Linux  epoll epoll是Kernel 2.6后新加入的事件机制,在高并发条件下,远优于select.epoll最大的好处在于它不会随着监听fd数目的增长而降低 ...

随机推荐

  1. CSS3---变形与动画效果

    1.旋转rotate()函数通过指定的角度参数使元素相对原点进行旋转.它主要在二维空间内进行操作,设置一个角度值,用来指定旋转的幅度.如果这个值为正值,则元素相对原点中心顺时针旋转:如果这个值为负值, ...

  2. ARM Linux 3.x的设备树(Device Tree)(转)

    http://blog.csdn.net/21cnbao/article/details/8457546

  3. Java学习之理解递归

    Java支持递归.递归是根据自身定义内容的过程.就Java编程而言,递归是一个允许方法调用自身的特性.调用自身的方法被称为递归.典型的例子就是阶乘的计算,N的阶乘就是从1到N之间所有整数的乘积. 当方 ...

  4. 一个jboss启动shell脚本

    脚本1: #!/bin/sh # paulo@evencom.com.br #JBOSS_HOME JBOSS_HOME="/opt/app/jboss-eap-6.3" JAVA ...

  5. DataTable 转JSON数据

    /// <summary> /// 将datatable转换为json /// </summary> /// <param name="dtb"> ...

  6. POJ 3177 边双连通求连通量度的问题

    这道题的总体思路就是找到连通量让它能够看作一个集合,然后找这个集合的度,度数为1的连通量为k,那么需要添加(k+1)/2条边才可以保证边双连通 这里因为一个连通量中low[]大小是相同的,所以我们用a ...

  7. [luoguP3092] [USACO13NOV]没有找零No Change(状压DP + 二分)

    传送门 先通过二分预处理出来,每个硬币在每个商品处最多能往后买多少个商品 直接状压DP即可 f[i]就为,所有比状态i少一个硬币j的状态所能达到的最远距离,在加上硬币j在当前位置所能达到的距离,所有的 ...

  8. IPython的常见用法

    IPython :交互式的Python命令行 安装: pip install ipython 使用(命令行中启动): ipython # 与Python解释器的使用方法一致 IPython高级功能: ...

  9. Wannafly挑战赛2_D Delete(拓扑序+最短路+线段树)

    Wannafly挑战赛2_D Delete Problem : 给定一张n个点,m条边的带权有向无环图,同时给定起点S和终点T,一共有q个询问,每次询问删掉某个点和所有与它相连的边之后S到T的最短路, ...

  10. iOS 混合变换旋转 CGAffineTransform

    在ios 中, Core Graphics 提供了一系列的函数可以在一个变换的基础上做深层次的变换,如果做一个既要缩放又要旋转的变换,以下的方法比较实用. CGAffineTransformScale ...