当前位置:网站首页>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
边栏推荐
- STM32+MFRC522完成IC卡号读取、密码修改、数据读写
- Open source and safe "song of ice and fire"
- UDP协议:因性善而简单,难免碰到“城会玩”
- Nodejs developer roadmap 2022 zero foundation Learning Guide
- Principle and usage of extern
- Introduction to the usage of model view delegate principal-agent mechanism in QT
- Heavy! Ant open source trusted privacy computing framework "argot", flexible assembly of mainstream technologies, developer friendly layered design
- MSF horizontal MSF port forwarding + routing table +socks5+proxychains
- Interview shock 62: what are the precautions for group by?
- 队列的实现
猜你喜欢

Ms-tct: INRIA & SBU proposed a multi-scale time transformer for motion detection. The effect is SOTA! Open source! (CVPR2022)...

Why does wechat use SQLite to save chat records?

Take you through ancient Rome, the meta universe bus is coming # Invisible Cities

The integrated real-time HTAP database stonedb, how to replace MySQL and achieve nearly a hundredfold performance improvement

2019 Alibaba cluster dataset Usage Summary

IP, subnet mask, gateway, default gateway

小程序在产业互联网中的作用

Recursive way

1700C - Helping the Nature

Top command details
随机推荐
Today in history: the mother of Google was born; Two Turing Award pioneers born on the same day
【剑指 Offer】 60. n个骰子的点数
2022暑期项目实训(二)
C语言高校实验室预约登记系统
队列的实现
[Android] kotlin code writing standardization document
FMT open source self driving instrument | FMT middleware: a high real-time distributed log module Mlog
STM32+MFRC522完成IC卡号读取、密码修改、数据读写
FMT开源自驾仪 | FMT中间件:一种高实时的分布式日志模块Mlog
C语言指针*p++、*(p++)、*++p、*(++p)、(*p)++、++(*p)对比实例
HMS Core 机器学习服务打造同传翻译新“声”态,AI让国际交流更顺畅
SQL优化问题的简述
STM32+ENC28J60+UIP协议栈实现WEB服务器示例
MarkDown语法——更好地写博客
当保存参数使用结构体时必备的开发技巧方式
高精度运算
declval(指导函数返回值范例)
Jielizhi obtains the currently used dial information [chapter]
This article discusses the memory layout of objects in the JVM, as well as the principle and application of memory alignment and compression pointer
J'aimerais dire quelques mots de plus sur ce problème de communication...