博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
epoll()无论涉及wait队列分析
阅读量:5369 次
发布时间:2019-06-15

本文共 1592 字,大约阅读时间需要 5 分钟。

事件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://www.cnblogs.com/yxwkf/p/4681105.html

你可能感兴趣的文章
BZOJ4652 [Noi2016]循环之美 【数论 + 莫比乌斯反演 + 杜教筛】
查看>>
BZOJ3462 DZY Loves Math II 【多重背包 + 组合数】
查看>>
项目管理学习笔记之四.风险管理
查看>>
写给大数据开发初学者的话
查看>>
实现getElementsByClassName
查看>>
OpenCv 012---视频文件读写
查看>>
洛谷P3690 Link Cut Tree (模板)
查看>>
5.Python基础 缩进与选择的关系
查看>>
ACS蚁群算法求解对称TSP旅行商问题的JavaScript实现
查看>>
「学习笔记」类欧几里得算法
查看>>
读书笔记-HBase in Action-第二部分Advanced concepts-(1)HBase table design
查看>>
《程序猿的自我修养》系列技术文章整理收藏
查看>>
Android网络开发之用tcpdump抓包
查看>>
无法识别的属性“targetFramework”。请注意属性名称区分大写和小写。错误解决的方法...
查看>>
站点防止攻击
查看>>
TFS(Team Foundation Server)介绍和入门
查看>>
编程算法基础-一刀切法
查看>>
双slave的server_uuid同样问题
查看>>
node-exporter cpu使用率为负数
查看>>
互联网广告的效果真实性
查看>>