epoll()无论涉及wait队列分析

epoll()无论涉及wait队列分析

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

事件1. epfd-file->eventpoll->wq:

  struct eventpoll {

    …

    wait_queue_head_t wq;     //用于epoll_pwait()事件的等待队列 情况1分析

    struct list_head rdllist; //就绪的fd队列 ready list

    struct rb_root rbr;       //红黑树根,epitem->rbn为红黑树结构的节点

    struct file *file;        //epoll文件系统中构建的虚拟文件

    …

  };

  主要用于epoll_pwait()时候,判定epfd-file->eventpoll->rdlist(就绪fd)是否为空。假设为空而且epoll_pwait()为堵塞调用。那么将当前进程将被挂到epfd-file->eventpoll->wq中,而且当前进程进入堵塞等待,直到rdlist非空的时候唤起epfd-file->eventpoll->poll_wait链表中的进程(相互排斥唤起和非相互排斥唤起?)唤起的回调函数默觉得wake_up_interruptible或者wake_up

情况2.被监听的fd->poll_wait

  将被监听套接字fd在epoll期间构建的epitem和eppoll_entry

  epitem{

    struct rb_node rbn;       //epitem挂在rbtree上的节点信息

    struct list_head rdllink; //假设fd就绪,将挂入ready list

    struct eventpoll *ep;     //所属主eventpoll(维护rbtree rdllist poll_wait队列…)

    struct epoll_event event; //fd上监听的事件

  }

 

  struct eppoll_entry {

   struct list_head llink;

   struct epitem *base; //所属epitem

   wait_queue_t wait;   //作为一元素挂入被监听fd的wait队列中

   wait_queue_head_t *whead; //被监听fd的等待队列。假设fd为socket。那么whead为sock->sk_sleep

  };

 

  eppoll_entry主要完毕epitem和epitem事件发生时的callback函数之间的关联。

  首先将eppoll_entry的whead指向fd的设备等待队列(同select中的wait_address)。

  然后初始化eppoll_entry的base变量指向epitem。

  最后通过add_wait_queue将epoll_entry挂载到fd的设备等待队列上。

  当在设备硬件数据到来时,硬件中断处理函数中会唤醒该等待队列上等待的进程时,会调用唤醒函数ep_poll_callback(ep_poll_callback: 当fd上出发事件后。将epitem中的rdllink节点增加到readlist中(epfd-file->eventpoll->rdlist))

对照:

       1和2对照,主要是等待队列的回调函数用处不同,1的回调是为了唤起处于等待事件而处于休眠的进程,2的回调是为了将epitem中的rdllink结构增加到ready list中。

參考:

http://www.cnblogs.com/apprentice89/archive/2013/05/09/3068274.html

http://www.cnblogs.com/apprentice89/p/3234677.html

版权声明:本文博客原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117402.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java中两个list对象取交集、差集

    java中两个list对象取交集、差集在一般操作中,对于list集合取交集、差集、并集,比较简单,网上有很多例子,如:今天我们来说一下对于两个list集合该如何取交集与并集:如下两个集合:groupEntityList、saveEntities,groupEntityList是组织集合,saveEntities是组织用户集合,即saveEntities包含groupEntityList中的数据。交集:差集:saveEntities-groupEntityList表达式中谁在前,谁就是减数。希望对大家有所帮助,我是空谷有来人,感谢

    2022年9月27日
    2
  • 列表中字符串按照某种规则排序的方法(python)

    列表中字符串按照某种规则排序的方法(python)

    2021年11月19日
    59
  • Oracle DBA 路途遥远「建议收藏」

    Oracle DBA 路途遥远「建议收藏」好用的OracleDBA为什么这么难找? 这不但是很多CIO的痛,也是很多IT主管搅尽脑汁也解决不了的问题。可那么多从ORACLE培训班拿到OCP认证的人跑哪里去了呢? 小白是一个拥有OCP证照,且对数据库本身的架构、运作原理有一定了解的数据库管理员。原以为一切都没问题的,无奈小白刚一就任,就面临到替换公司数据库系统主机的问题。小白没有程序开发与主机系统管理等经验,小白是那种一毕

    2022年9月26日
    2
  • setTimeout 与 setTimeinterval的区别「建议收藏」

    setTimeout 与 setTimeinterval的区别「建议收藏」原文地址:setTimeout与setTimeinterval的区别作者:心之影这两天一直在ajax的东西,昨天做一个小例子的时候发现了setTimeout这个函数,以前只知道setTimeinterval,发现这两个函数是有一些差别的。在网上搜了一下,作为备忘就转贴一下了。window对象有两个主要的定时方法,分别是setTimeout和setIntev…

    2022年10月5日
    4
  • ubuntu怎么安装vim编辑器_vim配置大全

    ubuntu怎么安装vim编辑器_vim配置大全1.linux默认自带vi,一般使用升级版vim2.第一次使用需要安装vimsudoaptinstallvim如果没有安装的话会提示安装vim执行安装sudoaptinstallvim测试vima.txt出现下面界面则安装成功3.vim的三种模式1.普通模式当vim打开的时候就直接进入普通模式,在…

    2022年9月16日
    2
  • grep 命令详解_grep命令详解

    grep 命令详解_grep命令详解一:grep命令的基本概念和用途grep命令是linux中一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。在一个或多个文件中搜素字符串模式,如果字符串模式包括空格,也必须被引用,模式后的所有字符串被看作文件名。搜索的结果被送到标准输出(stdout),不影响原文件内容。grep也可以用于shell脚本,因为grep通过返回一个状态值来说明搜索的结果,如果模式搜索成功,则返回0;如果搜索不成功,则返回1;如果搜索的文件不存在,则返回2;我们利用这些返回值就可以进行一些自动化的文

    2022年8月30日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号