当前位置:网站首页>epoll()无论涉及wait队列分析
epoll()无论涉及wait队列分析
2022-07-06 10:20:00 【全栈程序员站长】
大家好,又见面了,我是全栈君。
事件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.cn/117402.html原文链接:https://javaforall.cn
边栏推荐
猜你喜欢
Compilation principle - top-down analysis and recursive descent analysis construction (notes)
Jerry is the custom background specified by the currently used dial enable [chapter]
李書福為何要親自掛帥造手機?
编译原理——预测表C语言实现
Ms-tct: INRIA & SBU proposed a multi-scale time transformer for motion detection. The effect is SOTA! Open source! (CVPR2022)...
Open source and safe "song of ice and fire"
F200——搭载基于模型设计的国产开源飞控系统无人机
Grafana 9.0 正式发布!堪称最强!
FMT开源自驾仪 | FMT中间件:一种高实时的分布式日志模块Mlog
Appium automated test scroll and drag_ and_ Drop slides according to element position
随机推荐
The integrated real-time HTAP database stonedb, how to replace MySQL and achieve nearly a hundredfold performance improvement
Kivy tutorial: support Chinese in Kivy to build cross platform applications (tutorial includes source code)
最新财报发布+天猫618双榜第一,耐克蓄力领跑下个50年
Jerry is the custom background specified by the currently used dial enable [chapter]
Interesting - questions about undefined
虚拟机VirtualBox和Vagrant安装
Virtual machine VirtualBox and vagrant installation
从交互模型中蒸馏知识!中科大&美团提出VIRT,兼具双塔模型的效率和交互模型的性能,在文本匹配上实现性能和效率的平衡!...
模板于泛型编程之declval
当保存参数使用结构体时必备的开发技巧方式
This article discusses the memory layout of objects in the JVM, as well as the principle and application of memory alignment and compression pointer
Cocos2d Lua 越来越小样本 内存游戏
Getting started with pytest ----- test case rules
OpenEuler 会长久吗
图片缩放中心
std::true_type和std::false_type
STM32+ESP8266+MQTT协议连接OneNet物联网平台
Maixll-Dock 摄像头使用
Wchars, coding, standards and portability - wchars, encodings, standards and portability
递归的方式