范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

深入剖析LinuxRCU原理(二)渐入佳境

  说明:Kernel版本:4.14 ARM64处理器,Contex-A53,双核 使用工具:Source Insight 3.5, Visio 1. 概述
  我会假设你已经看过了深入剖析《Linux RCU原理(一)-初窥门径》
  本文将进一步去探索下 RCU 背后的机制。2. 基础概念2.1Grace Period
  继续贴出深入剖析《Linux RCU原理(一)-初窥门径》 中的图片:
  中间的黄色部分代表的就是 Grace Period ,中文叫做宽限期,从Removal 到Reclamation ,中间就隔了一个宽限期;只有当宽限期结束后,才会触发回收的工作,宽限期的结束代表着Reader都已经退出了临界区,因此回收工作也就是安全的操作了; 宽限期是否结束,与处理器的执行状态检测有关,也就是检测静止状态 Quiescent Status ;RCU的性能与可扩展性依赖于它是否能有效的检测出静止状态( Quiescent Status ),并且判断宽限期是否结束。
  来一张图:
  2.2Quiescent Status
  Quiescent Status ,用于描述处理器的执行状态。当某个CPU正在访问RCU保护的临界区时,认为是活动的状态,而当它离开了临界区后,则认为它是静止的状态。当所有的CPU都至少经历过一次QS后,宽限期将结束并触发回收工作。
  在时钟tick中检测CPU处于 用户模式 或者idle模式 ,则表明CPU离开了临界区;在不支持抢占的RCU实现中,检测到CPU有context切换,就能表明CPU离开了临界区;
  更多linux内核视频教程文档资料免费领取后台私信【内核】自行获取.
  3. 数据结构RCU实际是一个大型的状态机,它的数据结构维护着状态,可以让RCU读者快速执行,同时也可以高效和灵活的处理RCU写者请求的宽限期。 RCU的性能和可扩展性依赖于采用什么机制来探测宽限期的结束; RCU使用位图 cpumask 去记录CPU经历静止状态,在经典RCU(Classic RCU )实现中,由于使用了全局的cpumask 位图,当CPU数量很大时锁争用会带来很大开销(GP开始时设置对应位,GP结束时清除对应位),因此也促成了Tree RCU 的诞生;Tree RCU 以树形分层来组织CPU,将CPU分组,本小组的CPU争用同一个锁,当本小组的某个CPU经历了一个静止状态QS后,将其对应的位从位图清除,如果该小组最后一个CPU经历完静止状态QS后,表明该小组全部经历了CPU的QS状态,那么将上一层对应该组的位从位图清除;RCU有几个关键的数据结构: struct rcu_state ,struct rcu_node ,struct rcu_data ;
  图来了:
  struct rcu_state :用于描述RCU的全局状态,它负责组织树状层级结构,系统中支持不同类型的RCU状态:rcu_sched_state , rcu_bh_state ,rcu_preempt_state ;struct rcu_node :Tree RCU 中的组织节点;struct rcu_data :用于描述处理器的RCU状态,每个CPU都维护一个数据,它归属于某一个struct rcu_node ,struct rcu_data 检测静止状态并进行处理,对应的CPU进行RCU回调,__percpu 的定义也减少了同步的开销;
  看到这种描述,如果还是在懵逼的状态,那么再来一张拓扑图,让真相更白一点:
  层状树形结构由 struct rcu_node 来组成,这些节点在struct rcu_state 结构中是放置在数组中的,由于struct rcu_node 结构有父节点指针,因此可以构造树形;CPU分组后,对锁的争用就会大大减少,比如 CPU0/CPU1 就不需要和CPU6/CPU7 去争用锁了,逐级以淘汰赛的形式向上;
  关键点来了:Tree RCU使用rcu_node节点来构造层级结构,进而管理静止状态Quiescent State和宽限期Grace Period,静止状态信息QS是从每个CPU的rcu_data往上传递到根节点的,而宽限期GP信息是通过根节点从上往下传递的,当每个CPU经历过一次QS状态后,宽限期结束
  关键字段还是有必要介绍一下的,否则岂不是耍流氓? struct rcu_state { 	struct rcu_node node[NUM_RCU_NODES];        // rcu_node节点数组,组织成层级树状 	struct rcu_node *level[RCU_NUM_LVLS + 1];   //指向每层的首个rcu_node节点,数组加1是为了消除编译告警 	struct rcu_data __percpu *rda;		                //指向每个CPU的rcu_data实例 	call_rcu_func_t call;			                        //指向特定RCU类型的call_rcu函数:call_rcu_sched, call_rcu_bh等 	int ncpus;				                                // 处理器数量         	unsigned long gpnum;			                //当前宽限期编号,gpnum > completed,表明正处在宽限期内 	unsigned long completed;		                //上一个结束的宽限期编号,如果与gpnum相等,表明RCU空闲      ...         unsigned long gp_max;                                   //最长的宽限期时间,jiffies             ... }   /*  * Definition for node within the RCU grace-period-detection hierarchy.  */ struct rcu_node {     	raw_spinlock_t __private lock;	        //保护本节点的自旋锁      	unsigned long gpnum;			        //本节点宽限期编号,等于或小于根节点的gpnum         unsigned long completed;		        //本节点上一个结束的宽限期编号,等于或小于根节点的completed         unsigned long qsmask;                       //QS状态位图,某位为1,代表对应的成员没有经历QS状态         unsigned long qsmaskinit;                //正常宽限期开始时,QS状态的初始值     ...     	int	grplo;		//该分组的CPU最小编号 	int	grphi;		//该分组的CPU最大编号 	u8	grpnum;		//该分组在上一层分组里的编号 	u8	level;		//在树中的层级,Root为0     ...              struct rcu_node *parent; //指向父节点 }   /* Per-CPU data for read-copy update. */ struct rcu_data { 	unsigned long	completed;	    //本CPU看到的已结束的宽限期编号 	unsigned long	gpnum;		    //本CPU看到的最高宽限期编号 	union rcu_noqs cpu_no_qs;       //记录本CPU是否经历QS状态 	bool core_need_qs;		        //RCU需要本CPU上报QS状态 	unsigned long grpmask;		//本CPU在分组的位图中的掩码 	struct rcu_segcblist;		        //回调函数链表,用于存放call_rcu注册的延后执行的回调函数     ... }4. RCU更新接口
  从《深入剖析Linux RCU原理(一)-初窥门径》 的示例中,我们看到了RCU的写端调用了synchronize_rcu/call_rcu 两种类型的接口,事实上Linux内核提供了三种不同类型的RCU,因此也对应了相应形式的接口。
  来张图:
  RCU 写者,可以通过两种方式来等待宽限期的结束,一种是调用同步接口等待宽限期结束,一种是异步接口等待宽限期结束后再进行回调处理,分别如上图的左右两侧所示;从图中的接口调用来看,同步接口中实际会去调用异步接口,只是同步接口中增加了一个 wait_for_completion 睡眠等待操作,并且会将wakeme_after_rcu 回调函数传递给异步接口,当宽限期结束后,在异步接口中回调了wakeme_after_rcu 进行唤醒处理;目前内核中提供了三种RCU: 可抢占RCU: rcu_read_lock/rcu_read_unlock 来界定区域,在读端临界区可以被其他进程抢占;不可抢占RCU (RCU-sched) :rcu_read_lock_sched/rcu_read_unlock_sched 来界定区域,在读端临界区不允许其他进程抢占;关下半部RCU (RCU-bh) :rcu_read_lock_bh/rcu_read_unlock_bh 来界定区域,在读端临界区禁止软中断;从图中可以看出来,不管是同步还是异步接口,最终都是调到 __call_rcu 接口,它是接口实现的关键,所以接下来分析下这个函数了;5.__call_rcu
  函数的调用流程如下:
  __call_rcu 函数,第一个功能是注册回调函数,而回调的函数的维护是在rcu_data 结构中的struct rcu_segcblist cblist 字段中;rcu_accelerate_cbs/rcu_advance_cbs ,实现中都是通过操作struct rcu_segcblist 结构,来完成回调函数的移动处理等;__call_rcu 函数第二个功能是判断是否需要开启新的宽限期GP;
  链表的维护关系如下图所示:
  实际的设计比较巧妙,通过一个链表来链接所有的回调函数节点,同时维护一个二级指针数组,用于将该链表进行分段,分别维护不同阶段的回调函数,回调函数的移动方向如图所示,关于回调函数节点的处理都围绕着这个图来展开;
  那么通过 __call_rcu 注册的这些回调函数在哪里调用呢?答案是在RCU_SOFTIRQ 软中断中:
  当 invoke_rcu_core 时,在该函数中调用raise_softirq 接口,从而触发软中断回调函数rcu_process_callbacks 的执行;涉及到与宽限期GP相关的操作,在 rcu_process_callbacks 中会调用rcu_gp_kthread_wake 唤醒内核线程,最终会在rcu_gp_kthread 线程中执行;涉及到RCU注册的回调函数执行的操作,都在 rcu_do_batch 函数中执行,其中有两种执行方式:1)如果不支持优先级继承的话,直接调用即可;2)支持优先级继承,在把回调的工作放置在rcu_cpu_kthread 内核线程中,其中内核为每个CPU都创建了一个rcu_cpu_kthread 内核线程;6. 宽限期开始与结束
  既然涉及到宽限期GP的操作,都放到了 rcu_gp_kthread 内核线程中了,那么来看看这个内核线程的逻辑操作吧:
  内核分别为 rcu_preempt_state, rcu_bh_state, rcu_sched_state 创建了内核线程rcu_gp_kthread ;rcu_gp_kthread 内核线程主要完成三个工作:1)创建新的宽限期GP;2)等待强制静止状态,设置超时,提前唤醒说明所有处理器经过了静止状态;3)宽限期结束处理。其中,前边两个操作都是通过睡眠等待在某个条件上。7. 静止状态检测及报告
  很显然,对这种状态的检测通常都是周期性的进行,放置在时钟中断处理中就是情理之中了:
  rcu_sched/rcu_bh 类型的RCU中,当检测CPU处于用户模式或处于idle 线程中,说明当前CPU已经离开了临界区,经历了一个QS静止状态,对于rcu_bh 的RCU,如果没有出去softirq 上下文中,也表明CPU经历了QS静止状态;在 rcu_pending 满足条件的情况下,触发软中断的执行,rcu_process_callbacks 将会被调用;在 rcu_process_callbacks 回调函数中,对宽限期进行判断,并对静止状态逐级上报,如果整个树状结构都经历了静止状态,那就表明了宽限期的结束,从而唤醒内核线程去处理;顺便提一句,在 rcu_pending 函数中,rcu_pending->__rcu_pending->check_cpu_stall->print_cpu_stall 的流程中,会去判断是否有CPU stall的问题,这个在内核中有文档专门来描述,不再分析了;8. 状态机变换
  如果要观察整个状态机的变化,跟踪一下 trace_rcu_grace_period 接口的记录就能发现:/*  * Tracepoint for grace-period events.  Takes a string identifying the  * RCU flavor, the grace-period number, and a string identifying the  * grace-period-related event as follows:  *  *	"AccReadyCB": CPU acclerates new callbacks to RCU_NEXT_READY_TAIL.  *	"AccWaitCB": CPU accelerates new callbacks to RCU_WAIT_TAIL.  *	"newreq": Request a new grace period.  *	"start": Start a grace period.  *	"cpustart": CPU first notices a grace-period start.  *	"cpuqs": CPU passes through a quiescent state.  *	"cpuonl": CPU comes online.  *	"cpuofl": CPU goes offline.  *	"reqwait": GP kthread sleeps waiting for grace-period request.  *	"reqwaitsig": GP kthread awakened by signal from reqwait state.  *	"fqswait": GP kthread waiting until time to force quiescent states.  *	"fqsstart": GP kthread starts forcing quiescent states.  *	"fqsend": GP kthread done forcing quiescent states.  *	"fqswaitsig": GP kthread awakened by signal from fqswait state.  *	"end": End a grace period.  *	"cpuend": CPU first notices a grace-period end.  */
  大体流程如下:
  9. 总结本文提纲挈领的捋了一下RCU的大体流程,主要涉及到RCU状态机的轮转,从开启宽限期GP,到宽限期GP的初始化、静止状态QS的检测、宽限期结束、回调函数的调用等,而这部分主要涉及到软中断 RCU_SOFTIRQ 和内核线程rcu_gp_kthread 的动态运行及交互等;内部的状态组织是通过 rcu_state, rcu_node, rcu_data 组织成树状结构来维护,此外回调函数是通过rcu_data 中的分段链表来批处理,至于这些结构中相关字段的处理(比如gpnum, completed 字段的设置来判断宽限期阶段等),以及链表的节点移动等,都没有进一步去分析跟进了;RCU的实现机制很复杂,很多其他内容都还未涉及到,比如SRCU(可睡眠RCU)、可抢占RCU,中断/NMI对RCU的处理等,只能说是蜻蜓点水了; 在阅读代码过程中,经常会发现一些巧妙的设计,有时会有顿悟的感觉,这也是其中的乐趣之一了;
  首页 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛
  转载地址:深入剖析Linux RCU原理剖析(二)-渐入佳境 - 圈点 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛

突然关闭线上旗舰店,所有产品下架!好丽友最新回应!近日,有人爆料好丽友居然闭店了!记者打开淘宝ORION好丽友旗舰店,原本应该是铺满商品的首页,只剩下闭店公告12月23日下架店铺所有产品,12月24日暂停运营。公告里还称之前的订单我心目中的年度榜单数码篇头条创作挑战赛已经临近2022的尾声了,这里花些篇幅给大家整理一个2022年的总结,选出各个类目中,我心中的最佳供大家参考。1尽量选择发布在2022年的,但生命周期长到可以干掉20OPPO千元产品线又要上新了!A56s被披露,支持5G主打大电池好音质眼看着马上就要到年底了,每年这个时候国内手机市场都会热闹上一阵,新款手机一个挨着一个上市,从千元机到旗舰机全方位覆盖,用户可以选择的范围极宽。就拿OPPO来说,最近上市的新机就有面资生堂第三次中招,安热沙金灿倍护防晒乳等抽检不合格!昨天国家药监局发布了关于53批次不符合规定化妆品的通告,其中资生堂的安热沙金灿倍护防晒乳安热沙水能户外防晒乳均在列。安热沙金灿倍护防晒乳显示产品经销者为,资生堂(中国)投资有限公司今晚圣诞夜,穿的漂亮点,去赴约吧!今儿晚就是圣诞夜你们都准备好漂亮的衣服了吗?代表圣诞蠢的三个颜色红黄绿。穿上这具有圣诞气息的颜色,搭配的漂亮一些,去赴一场美丽的约会!1红色既喜庆又很靓丽迷人,红色的单品是首选了。打补丁的乞丐牛仔裤搭配黑色选修,吴昕变身街头女王!其实每个人都有着每个人独有的时尚,在我们的生活当中,大多数人也是一直在追求时尚,这两个字,特别是对于女孩儿们来说,时尚这两个字更显得格外地重要。首先,女孩儿们只有让自己保持时尚,才网红潮人都爱的丝绒裙,氛围感绝了!洋气又精致,谁穿谁好看着装的精致感和美感,成为每一个时尚达人追求的最终效果。真正能够领略时尚美感的人,并不会一味地追求花里胡哨的设计,有时候一件连衣裙,一款纯色系的点缀,就足以让你展示出不俗的气质感。挑郎平国外生活养得好!61岁素颜染黄发神清气爽,穿一身黑也不显老郎平自从退休之后,就开始了她休闲惬意的国外生活,但是在社交平台上,还是可以经常看到郎平的身影,她和自己的家人在国外生活得非常幸福,61岁了染一头黄发就算是素颜出镜,也显得神清气爽状今年火了北欧风,简约慵懒,营造出冬日的温暖与随性感嗨,我是柒作作。提起北欧,我们就会想起那个自带仙气,神秘高冷的北欧神话,那千里冰封,万里雪飘国度。提起北欧风格穿搭,我们也会想起两个词简约和有质感。与其他主流行风格不同,北欧风格那冬天穿衣当然要个性!跟着博主选皮裤,美飒带感还不容易撞款冬天穿衣当然要个性,这是我一直以来跟朋友和粉丝姐妹常说的一句话,不过这次我们不是老生常谈的,为了满足绝大多数人的穿衣需求,也为了给大家提供合理的搭配方案,这篇文章我们主推的是皮裤。王朔的年终总结2022,一言难尽流年似水,又至年末,因为疫情防控政策的改变,2022年的年末注定成为一个沉重的转折点,至于有什么感想,一言难尽。每到年终,总难免回顾一下这一年的生活经历。人类应该是这个星球上唯一看
为什么学车都选择C1手动挡,买车都选择C2自动挡?虽然说手动挡不会淘汰,但是汽车大半部的天下都是自动挡了。先来普及一下,首先我们说的的C1车型就是我们的手动挡车型,C2车型就是我们通常可以驾驶自动挡的车型,有C1驾照的可以开手动挡红烧肉怎么才能做得红亮好看?糖是关键放糖如果要找一种食材代表中餐的话,红烧肉,绝对可以排到前十名的位置。而声名显赫的毛氏红烧肉也不仅仅是伟人爱吃而得了名,更成了一系列餐馆的招牌菜。红烧肉,肥瘦相间,香甜松软,在昆明,你最推荐值得入住的酒店有哪些?我们为大家分成了高档型酒店和普通酒店为您推荐。高档酒店我们推荐昆明古滇名城皇冠假日酒店,普通酒店我们推荐昆明和颐至尊酒店。古滇名城皇冠假日酒店七彩云南古滇名城皇冠假日酒店位于昆明市vivox9为何卖这么贵?VivoX9是去年10大畅销手机之一,从这个上面看,其实vivoX9的价格并不是很贵,要不然也不会有这么多人买单了。不过对于手机的价格每个人的看法都不一样,有的人觉得贵有的人觉得便父亲和母亲有时说汉语有时说英语,这是否有助于孩子掌握2种语言?你放心好啦,不会影响孩子的。我以我的亲身经历来告诉你。我的小孩还没够两个月的时候我们就叫他讲英语了。当然,同时我们也教他讲汉语,包括我们这里的方言和普通话。回到奶奶家,那你讲的是客大家都说不要以贷养贷,但是逾期怎么办?现在逾期和以贷养贷到50万再逾期,你选一个?其实很多人都是被逼没有办法,最后资金链断裂才逾期的,然后总结出来了一个血的教训不要以贷养贷。大多数人都明白这个道理,就是做不到,为啥?因全国教育看江苏,江苏教育看南通,有一定的道理吗?就升学率和考入名校人数来说,江苏省的南通市确实可以称的上是江苏的领头羊!众所周知,江苏省是我国的教育大省,素有全国中小学教育看向标之称,那作为在江苏高考中屡次出镜的南通,不可避免的想问一下大家,时至今日,能被称为盛世美颜的男明星都有谁?有好几位呢,目前我比较欣赏盛世美颜的是德云社相声演员张云雷,特点突出,相貌公子,才艺全方位,因此选择他。邓伦!韩范,像花儿一样俊美。远看他有些高冷,五官立体精致,眼神深邃。近看他透小学古诗词背完,再背什么?不妨趁热打铁!挑一些简短易懂的初高中必背古诗词,鼓励孩子背诵。在语文课标中,112年级必背古诗词有155首。其中,小学阶段75首,初中阶段40首,高中阶段40首。初中40首必背古诗针对新闻摄影,尼康与佳能相比,哪个更好?很多年前,在单位做宣传干事的时候,办公室里我和我的对桌,也就是我们两个专门的摄影记者,一个用尼康,一个佳能,我就是那个用尼康的。离开后,我的另一位同事接替了我的工作,今年上半年回去有什么手机软件可以把文字转换成语音?要免费的,有没有,怎么样?现在市面上文字转语音的工具非常多,大家在功能上也区别不大,主要是声音角色不同。推荐一款我自己用过的在线文字转语音的工具标贝悦读。他家声音上的特色是有很多模仿明星的声音,有沈腾周星驰