epoll模型要点总结

news2024/11/16 11:39:04

 

(图是网上的,懒得自己画了)

1 epoll_ctl是向红黑树rbr插入、删除、修改fd。epoll_wait在双向链表rdllist中查询IO可读、可写、错误事件。 

为什么使用红黑树?从插入、删除考虑。

2 epoll_ctl插入新fd时,新建epitem会设置回调函数ep_poll_callback,把pwq->wait(等待队列)跟socket的等待队列关联起来。网卡有事件到来,直接插入到rdllist中,所以epoll不需要像select一样遍历事件。

3 epoll模型也需要把数据从内核态拷贝到用户态。

4 LT水平模型,默认的,数据没有读完,epoll_wait还能读到数据。ET边缘模式,只能在非阻塞模式下,使用者需要自己处理完所有可读数据。

zlm怎么做?

try {} catch (std::exception &ex) {}

5 几个结构体的关系

//eventpoll,epitem相互包括,
struct eventpoll { 
/** This mutex is used to ensure that files are not removed
	 * while epoll is using them. This is held during the event
	 * collection loop, the file cleanup path, the epoll file exit
	 * code and the ctl operations. */
struct mutex  mtx;
wait_queue_head_t wq; //重要变量—等待队列
/* Wait queue used by file->poll() */
wait_queue_head_t poll_wait;
struct  list_head  rdllist; //List of ready file descriptors
struct  rb_root  rbr; // RB tree root used to store monitored fd structs
rwlock_t  lock; //Lock which protects rdllist and ovflist //自旋锁:得不到锁不会引起进程休眠
struct epitem *ovflist;
struct file *file;
}


struct epitem {
	struct  rb_node  rbn;
	struct  list_head  rdllink; //跟eventpoll同变量
   /* List containing poll wait queues */
   struct eppoll_entry *pwqlist; //重要,其中结构体wait有回调函数
   struct  eventpoll *ep;
   struct epoll_event event;
}

struct eppoll_entry {
struct epitem *base; //有epitem
wait_queue_entry_t wait;
wait_queue_head_t *whead;
}
typedef struct wait_queue_entry wait_queue_entry_t;
struct wait_queue_entry {
	unsigned int		flags;
	void			*private;
	wait_queue_func_t	func; //ep_poll_callback
	struct list_head	entry;
};

6 epoll惊群(指在accept下):多个线程或多进程等待同一事件,比如accept,系统会唤醒所有线程,但只有一个线程得到该事件,导致效率低。设置epoll_event的events EPOLLEXCLUSIVE属性,可以解决该问题。

7 epmutex、ep->mtx、ep->lock、 三把锁的区别?

epmutex:用得少。This mutex is used to serialize ep_free() and eventpoll_release_file().

ep->mtx:保护结构体eventpoll的数据。

rwlock_t  lock; //Lock which protects rdllist and ovflist.

epoll_wait事件主要是可读事件,可写只回调一次。通过写日志知道的。

9 sock有poll函数,需要实现,如tcp_poll、udp_poll。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年第五届清洁能源与智能电网国际会议(CCESG 2023)

2023年第五届清洁能源与智能电网国际会议(CCESG 2023) 重要信息 会议网址:www.ccesg.org 会议时间:2023年4月21-23日 召开地点:广西-南宁 截稿时间:2023年2月28日 录用通知:投稿后2周内 收…

结合代谢组学和网络药理学研究康复消炎栓治疗慢性盆腔炎作用机制

文章标题:Integrated Metabolomics and Network Pharmacology Study on the Mechanism of Kangfuxiaoyan Suppository for Treating Chronic Pelvic Inflflammatory Disease 发表期刊:Frontiers in Pharmacology 影响因子:5.988 发表年份&…

读书:《好奇心:保持对未知世界永不停息的热情》

刚看到《好奇心》这本书的书名,我对《好奇心》还是有点好奇心的。 为什么小孩的好奇心比大人多?也不一定,如果家长或老师没有足够好的引导的话,孩子也会对周围的世界没有兴趣。 好奇心为两种:消遣性好奇、认识性好奇…

【go-zero】在微服务架构中是否要使用分布式事务 如何避免分布式的耦合 微服务与分布式事务的对立

微服务要不要引入分布式事务讨论问题:微服务要不要引入分布式事务?1、分布式事务的场景分析2、分析利与弊3、如何优化分布式事务3.1 什么是CAP理论3.2 方式一:避免使用分布式事务1)同步阻塞2)异步调用3)粗粒…

Linux中的Nginx平滑升级与回退

目录 一、平滑升级概述 1.平滑升级的定义 2.平滑升级的思路 (1)关于版本和备份 (2)向旧的Nginx的master进程发送USR2信号 (3)向旧的master进程发送winch信号,旧的worker子进程退出 &…

【疑难杂症】allennlp安装报错:Installing build dependencies ... error

背景: 配置PURE的算法环境,安装allennlp 0.9.0 (pip install allennlp0.9.0)报错,如图所示: 探索: 发现allennlp的依赖中有spacy,是在安装spacy 2.1.9的依赖时报错了。 此时我尝试…

PCB如何添加SMT定位孔经验总结

🏡《总目录》 目录1, 什么是SMT定位孔2,SMT定位孔有什么特征3,添加SMT定位孔的经验原则4,其他注意事项1, 什么是SMT定位孔 SMT定位孔是指在PCBA的SMT贴片焊接阶段,为了准确固定和定位板卡的机械…

【OpenGL学习】颜色和光照

颜色和光照 一、颜色的物理解释 颜色(英语:colour,color)又称色彩、色泽,是眼、脑和我们的生活经验对光的颜色类别描述的视觉感知特。这种对颜色的感知来自可见光谱中的电磁辐射对人眼视锥细胞的刺激。颜色是由光反射…

boost搜索引擎

文章目录1.项目介绍2.搜索引擎技术栈和项目环境3.正排索引和倒排索引 - 搜索引擎具体原理4.编写数据去标签和数据清洗模块Parser5.编写建立索引模块Index6.编写搜索引擎模块Searcher7.编写http_server8.效果展示1.项目介绍 Boost官网没有对应的搜索引擎,不方便我们…

04 frameset-iframe【尚硅谷JavaWeb教程】

04 frameset-iframe【尚硅谷JavaWeb教程】 frameset、iframe这个标签基本上已经不用了。 frameset标签 一个大的网页由很多个小的网页组成,会用到frameset。 frameset 表示页面框架,这个标签已经淘汰,了解,不需要掌握。 frame表…

Element ui Avatar头像管理组件 实现当用户没有头像时 以名称最后一个字为头像

el-avatar是一个比较方便的头像管理组件 src控制他的图片展示 <el-avatarclass "avatar":src"item.images" ></el-avatar>样式的话 可以用avatar控制 <style> .avatar{width: 18px;height: 18px;line-height: 18px; } .avatar img{b…

【可解释性机器学习】TextExplainer: 调试黑盒文本分类器

TextExplainer: 调试黑盒文本分类器示例问题&#xff1a;20个新闻组数据集的LSA SVM模型TextExplainer文本解释器的工作原理我们应该相信这个解释吗&#xff1f;让它们犯错吧让它们再次犯错吧自定义TextExplainer: 采样过程自定义TextExplainer&#xff1a;分类器参考资料尽管…

记录每日LeetCode 237.删除链表中的节点 Java实现

题目描述&#xff1a; 有一个单链表的 head&#xff0c;我们想删除它其中的一个节点 node。 给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。 链表的所有值都是 唯一的&#xff0c;并且保证给定的节点 node 不是链表中的最后一个节点。 删除给定的节点。注…

Kotlin之使用DSL构建专有的语法结构

DSL的全称是领域特定语言(Domain Specific Language)&#xff0c;它是编程语言赋予开发者的一种特殊能力&#xff0c;通过它我们可以编写出一些看似脱离其原始语法结构的代码&#xff0c;从而构建出一种专有的特殊结构。 Kotlin也是支持DSL的&#xff0c;并且在Kotlin中实现DSL…

CF——1766C - Hamiltonian Wall

题目链接 1766C - Hamiltonian Wall Rating&#xff1a;1300 题目描述 Sir Monocarp Hamilton is planning to paint his wall. The wall can be represented as a grid, consisting of 2 rows and m columns. Initially, the wall is completely white. Monocarp wants to p…

Leetcode力扣秋招刷题路-0101

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1…

[LeetCode周赛复盘] 第 330 场周赛20230129

[LeetCode周赛复盘] 第 330 场周赛20230129 一、本周周赛总结二、 [Easy] 6337. 统计桌面上的不同数字1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6338. 猴子碰撞的方法数1. 题目描述2. 思路分析3. 代码实现四、[Hard] 6339. 将珠子放入背包中1. 题目描述2. 思路分析3. 代…

过年了,给网站加个灯笼+飘雪效果!

过年了&#xff0c;下面分享一个网站的特效&#xff0c;给网站添加一个新春灯笼和飘雪的效果&#xff0c;过年期间多一点年味。灯笼特效下面是css样式&#xff0c;可以放在公共样式中&#xff1a;.deng-box{position:fixed;top:-40px;right:150px;z-index:9999;pointer-events:…

【音视频工具】前端屏幕录制工具 + 录制<video>标签内容

一、录制的实现思路 1.开始录制、停止录制、下载视频 2.Blob介绍 3.概念 var mediaRecord //用于录制视频 var mediaStream //视频流 var videoBuffer [] //保存的视频数据二、屏幕录制工具 下载地址&#xff1a; https://chrome.google.com/webstore/detail/tampermonkey…

k8s之POD资源限制和健康监测

写在前面 本文一起看下POD的资源限制配置和健康监测的相关内容。 1&#xff1a;资源限制 如果是不对POD设置资源限制的话&#xff0c;若任由其占用系统资源&#xff0c;可能会造成非常严重的后果&#xff0c;所以我们需要根据具体情况来设置资源限制&#xff0c;如使用多少内…