epoll()无论涉及wait队列分析
事件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
版权声明:本文博客原创文章。博客,未经同意,不得转载。
epoll()无论涉及wait队列分析的更多相关文章
- 我理解的epoll(一)——实现分析
epoll项目中用了几次,但是对于其原理只是一知半解.我希望通过几篇blog能加深对她的理解. 我认为epoll是同步IO,因为他在调用epoll_wait时,内核在有I/O就绪前是阻塞的,虽然可以将 ...
- BlockingQueue(阻塞队列)分析
如果读者还有一点印象,我们在实现线程池时,用了队列这种数据结构来存储接收到的任务,在多线程环境中阻塞队列是一种非常有用的队列,在介绍BlockingQueue之前,我们先解释一下Queue接口. Qu ...
- (转)彻底学会使用epoll(一)——ET模式实现分析
注:之前写过两篇关于epoll实现的文章,但是感觉懂得了实现原理并不一定会使用,所以又决定写这一系列文章,希望能够对epoll有比较清楚的认识.是请大家转载务必注明出处,算是对我劳动成果的一点点尊重吧 ...
- Kafka 和 ZooKeeper 的分布式消息队列分析
1. Kafka 总体架构 基于 Kafka-ZooKeeper 的分布式消息队列系统总体架构如下: 如上图所示,一个典型的 Kafka 体系架构包括若干 Producer(消息生产者),若干 bro ...
- Linux queue.h之TAILQ队列分析
转自 这两天想看看memcached的实现,所以先学习了libevent,使用起来还是比较简单的,其实是对select/poll/kqueue等的封装,学习libevent过程中又遇到了linux下队 ...
- java常用队列分析
一.ArrayBlockingQueue 首先看一段源码: public class ArrayBlockingQueue<E> extends AbstractQueue<E> ...
- linux下select,poll,epoll的使用与重点分析
好久没用I/O复用了,感觉差点儿相同都快忘完了.记得当初刚学I/O复用的时候花了好多时间.可是因为那会不太爱写博客,导致花非常多时间搞明确的东西,依旧非常easy忘记.俗话说眼过千遍不如手过一遍,的确 ...
- TCP三次握手过程中涉及的队列知识的学习
先上一张图 (图片来源:http://www.cnxct.com/something-about-phpfpm-s-backlog/) 如上图所示,这里有两个队列:syns queue(半连接队列): ...
- Nginx源码分析--epoll模块
Nginx采用epoll模块实现高并发的网络编程,现在对Nginx的epoll模块进行分析. 定义在src/event/modules/ngx_epoll_module.c中 1. epoll_cre ...
随机推荐
- Socket编程实践(12) --UDP编程基础
UDP特点 无连接,面向数据报(基于消息,不会粘包)的传输数据服务; 不可靠(可能会丢包, 乱序, 反复), 但因此普通情况下UDP更加高效; UDP客户/服务器模型 UDP-API使用 #inclu ...
- cocos2d-x3.0 实现HTTP请求GET、POST
HTTP请求实现 把以下代码拷贝到新创建的project中就能看到效果 HelloWorldScene.h #include "cocos2d.h" /*记得要引头文件*/ #in ...
- 初识缓存以及ehcache初体验
1.缓存的意义 缓存机制就是将数据库中经常使用的数据取出放入内存中.程序调用时直接从内存中取,丌用每次使用 数据都訪问数据库,这样提高了效率. 2.缓存须要关注的问题 1) 缓存的更新 缓存中的数 ...
- html中返回上一页
<a href="<a href="javascript :history.back(-1)">返回上一页</a>或<a href=& ...
- Ubuntu在下面LAMP(Linux+Apache+MySQL+PHP) 开发环境的搭建
LAMP在行业是一个非常流行的词.此4字母代表Linux.Apache,MySQL和PHP. LAMP其高效.灵活的特点已经成为中小企业的首选. 它已经推出了快速构建LAMP道路. 1 在Ubuntu ...
- WPF Delegate委托整理
那啥,是从这里整理出来的,感谢Rising_Sun,整理的过于简单,看不明白的戳这里 using System; using System.Collections.Generic; using Sys ...
- Spring常见问题解决办法汇总
解决The prefix 'context' for element 'context:component-scan' is not bound<beans xmlns="http:/ ...
- 4pdf
http://www.cnblogs.com/haocool/archive/2013/03/16/2962547.html
- CSharp SQLServer 登陆
=======后台SQLServer存储过程================ --创建数据库create database Stu; --创建表use MyShool;if exists(select ...
- Java 并发专题 : Semaphore 实现 互斥 与 连接池
继续并发方面的知识.今天介绍Semaphore,同样在java.util.concurrent包下. 本来准备通过例子,从自己实现到最后使用并发工具实现,但是貌似效果并不是很好,有点太啰嗦的感觉,所有 ...