当前位置:网站首页>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
边栏推荐
- Cobra 快速入门 - 专为命令行程序而生
- 趣-关于undefined的问题
- Video fusion cloud platform easycvr adds multi-level grouping, which can flexibly manage access devices
- 测试1234
- 关于这次通信故障,我想多说几句…
- 【Android】Kotlin代码编写规范化文档
- Maixll dock camera usage
- Redis的五种数据结构
- 微信为什么使用 SQLite 保存聊天记录?
- The latest financial report release + tmall 618 double top, Nike energy leads the next 50 years
猜你喜欢
递归的方式
Getting started with pytest ----- allow generate report
SAP Fiori 应用索引大全工具和 SAP Fiori Tools 的使用介绍
Olivetin can safely run shell commands on Web pages (Part 1)
Heavy! Ant open source trusted privacy computing framework "argot", flexible assembly of mainstream technologies, developer friendly layered design
李書福為何要親自掛帥造手機?
【.NET CORE】 请求长度过长报错解决方案
The integrated real-time HTAP database stonedb, how to replace MySQL and achieve nearly a hundredfold performance improvement
Jerry's access to additional information on the dial [article]
Distill knowledge from the interaction model! China University of science and Technology & meituan proposed virt, which combines the efficiency of the two tower model and the performance of the intera
随机推荐
Getting started with pytest ----- test case rules
Release of the sample chapter of "uncover the secrets of asp.net core 6 framework" [200 pages /5 chapters]
Video fusion cloud platform easycvr adds multi-level grouping, which can flexibly manage access devices
Pourquoi Li shufu a - t - il construit son téléphone portable?
UDP protocol: simple because of good nature, it is inevitable to encounter "city can play"
TCP packet sticking problem
Take you through ancient Rome, the meta universe bus is coming # Invisible Cities
SQL优化问题的简述
趣-关于undefined的问题
Compilation Principle -- C language implementation of prediction table
DNS hijacking
Markdown grammar - better blogging
FMT open source self driving instrument | FMT middleware: a high real-time distributed log module Mlog
30 minutes to understand PCA principal component analysis
重磅硬核 | 一文聊透对象在 JVM 中的内存布局,以及内存对齐和压缩指针的原理及应用
STM32+ENC28J60+UIP协议栈实现WEB服务器示例
J'aimerais dire quelques mots de plus sur ce problème de communication...
[swoole series 2.1] run the swoole first
C language exchanges two numbers through pointers
Maixll dock camera usage