专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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

  说明:Kernel版本:4。14ARM64处理器,ContexA53,双核使用工具:SourceInsight3。5,Visio1。概述
  我会假设你已经看过了深入剖析《LinuxRCU原理(一)初窥门径》
  本文将进一步去探索下RCU背后的机制。2。基础概念2。1GracePeriod
  继续贴出深入剖析《LinuxRCU原理(一)初窥门径》中的图片:
  中间的黄色部分代表的就是GracePeriod,中文叫做宽限期,从Removal到Reclamation,中间就隔了一个宽限期;只有当宽限期结束后,才会触发回收的工作,宽限期的结束代表着Reader都已经退出了临界区,因此回收工作也就是安全的操作了;宽限期是否结束,与处理器的执行状态检测有关,也就是检测静止状态QuiescentStatus;RCU的性能与可扩展性依赖于它是否能有效的检测出静止状态(QuiescentStatus),并且判断宽限期是否结束。
  来一张图:
  2。2QuiescentStatus
  QuiescentStatus,用于描述处理器的执行状态。当某个CPU正在访问RCU保护的临界区时,认为是活动的状态,而当它离开了临界区后,则认为它是静止的状态。当所有的CPU都至少经历过一次QS后,宽限期将结束并触发回收工作。
  在时钟tick中检测CPU处于用户模式或者idle模式,则表明CPU离开了临界区;在不支持抢占的RCU实现中,检测到CPU有context切换,就能表明CPU离开了临界区;
  更多linux内核视频教程文档资料免费领取后台私信【内核】自行获取。
  3。数据结构RCU实际是一个大型的状态机,它的数据结构维护着状态,可以让RCU读者快速执行,同时也可以高效和灵活的处理RCU写者请求的宽限期。RCU的性能和可扩展性依赖于采用什么机制来探测宽限期的结束;RCU使用位图cpumask去记录CPU经历静止状态,在经典RCU(ClassicRCU)实现中,由于使用了全局的cpumask位图,当CPU数量很大时锁争用会带来很大开销(GP开始时设置对应位,GP结束时清除对应位),因此也促成了TreeRCU的诞生;TreeRCU以树形分层来组织CPU,将CPU分组,本小组的CPU争用同一个锁,当本小组的某个CPU经历了一个静止状态QS后,将其对应的位从位图清除,如果该小组最后一个CPU经历完静止状态QS后,表明该小组全部经历了CPU的QS状态,那么将上一层对应该组的位从位图清除;RCU有几个关键的数据结构:structrcustate,structrcunode,structrcudata;
  图来了:
  structrcustate:用于描述RCU的全局状态,它负责组织树状层级结构,系统中支持不同类型的RCU状态:rcuschedstate,rcubhstate,rcupreemptstate;structrcunode:TreeRCU中的组织节点;structrcudata:用于描述处理器的RCU状态,每个CPU都维护一个数据,它归属于某一个structrcunode,structrcudata检测静止状态并进行处理,对应的CPU进行RCU回调,percpu的定义也减少了同步的开销;
  看到这种描述,如果还是在懵逼的状态,那么再来一张拓扑图,让真相更白一点:
  层状树形结构由structrcunode来组成,这些节点在structrcustate结构中是放置在数组中的,由于structrcunode结构有父节点指针,因此可以构造树形;CPU分组后,对锁的争用就会大大减少,比如CPU0CPU1就不需要和CPU6CPU7去争用锁了,逐级以淘汰赛的形式向上;
  关键点来了:TreeRCU使用rcunode节点来构造层级结构,进而管理静止状态QuiescentState和宽限期GracePeriod,静止状态信息QS是从每个CPU的rcudata往上传递到根节点的,而宽限期GP信息是通过根节点从上往下传递的,当每个CPU经历过一次QS状态后,宽限期结束
  关键字段还是有必要介绍一下的,否则岂不是耍流氓?structrcustate{structrcunodenode〔NUMRCUNODES〕;rcunode节点数组,组织成层级树状structrcunodelevel〔RCUNUMLVLS1〕;指向每层的首个rcunode节点,数组加1是为了消除编译告警structrcudatapercpurda;指向每个CPU的rcudata实例callrcufunctcall;指向特定RCU类型的callrcu函数:callrcusched,callrcubh等intncpus;处理器数量unsignedlonggpnum;当前宽限期编号,gpnumcompleted,表明正处在宽限期内unsignedlongcompleted;上一个结束的宽限期编号,如果与gpnum相等,表明RCU空闲。。。unsignedlonggpmax;最长的宽限期时间,jiffies。。。}DefinitionfornodewithintheRCUgraceperioddetectionhierarchy。structrcunode{rawspinlocktprivatelock;保护本节点的自旋锁unsignedlonggpnum;本节点宽限期编号,等于或小于根节点的gpnumunsignedlongcompleted;本节点上一个结束的宽限期编号,等于或小于根节点的completedunsignedlongqsmask;QS状态位图,某位为1,代表对应的成员没有经历QS状态unsignedlongqsmaskinit;正常宽限期开始时,QS状态的初始值。。。intgrplo;该分组的CPU最小编号intgrphi;该分组的CPU最大编号u8grpnum;该分组在上一层分组里的编号u8level;在树中的层级,Root为0。。。structrcunodeparent;指向父节点}PerCPUdataforreadcopyupdate。structrcudata{unsignedlongcompleted;本CPU看到的已结束的宽限期编号unsignedlonggpnum;本CPU看到的最高宽限期编号unionrcunoqscpunoqs;记录本CPU是否经历QS状态boolcoreneedqs;RCU需要本CPU上报QS状态unsignedlonggrpmask;本CPU在分组的位图中的掩码structrcusegcblist;回调函数链表,用于存放callrcu注册的延后执行的回调函数。。。}4。RCU更新接口
  从《深入剖析LinuxRCU原理(一)初窥门径》的示例中,我们看到了RCU的写端调用了synchronizercucallrcu两种类型的接口,事实上Linux内核提供了三种不同类型的RCU,因此也对应了相应形式的接口。
  来张图:
  RCU写者,可以通过两种方式来等待宽限期的结束,一种是调用同步接口等待宽限期结束,一种是异步接口等待宽限期结束后再进行回调处理,分别如上图的左右两侧所示;从图中的接口调用来看,同步接口中实际会去调用异步接口,只是同步接口中增加了一个waitforcompletion睡眠等待操作,并且会将wakemeafterrcu回调函数传递给异步接口,当宽限期结束后,在异步接口中回调了wakemeafterrcu进行唤醒处理;目前内核中提供了三种RCU:可抢占RCU:rcureadlockrcureadunlock来界定区域,在读端临界区可以被其他进程抢占;不可抢占RCU(RCUsched):rcureadlockschedrcureadunlocksched来界定区域,在读端临界区不允许其他进程抢占;关下半部RCU(RCUbh):rcureadlockbhrcureadunlockbh来界定区域,在读端临界区禁止软中断;从图中可以看出来,不管是同步还是异步接口,最终都是调到callrcu接口,它是接口实现的关键,所以接下来分析下这个函数了;5。callrcu
  函数的调用流程如下:
  callrcu函数,第一个功能是注册回调函数,而回调的函数的维护是在rcudata结构中的structrcusegcblistcblist字段中;rcuacceleratecbsrcuadvancecbs,实现中都是通过操作structrcusegcblist结构,来完成回调函数的移动处理等;callrcu函数第二个功能是判断是否需要开启新的宽限期GP;
  链表的维护关系如下图所示:
  实际的设计比较巧妙,通过一个链表来链接所有的回调函数节点,同时维护一个二级指针数组,用于将该链表进行分段,分别维护不同阶段的回调函数,回调函数的移动方向如图所示,关于回调函数节点的处理都围绕着这个图来展开;
  那么通过callrcu注册的这些回调函数在哪里调用呢?答案是在RCUSOFTIRQ软中断中:
  当invokercucore时,在该函数中调用raisesoftirq接口,从而触发软中断回调函数rcuprocesscallbacks的执行;涉及到与宽限期GP相关的操作,在rcuprocesscallbacks中会调用rcugpkthreadwake唤醒内核线程,最终会在rcugpkthread线程中执行;涉及到RCU注册的回调函数执行的操作,都在rcudobatch函数中执行,其中有两种执行方式:1)如果不支持优先级继承的话,直接调用即可;2)支持优先级继承,在把回调的工作放置在rcucpukthread内核线程中,其中内核为每个CPU都创建了一个rcucpukthread内核线程;6。宽限期开始与结束
  既然涉及到宽限期GP的操作,都放到了rcugpkthread内核线程中了,那么来看看这个内核线程的逻辑操作吧:
  内核分别为rcupreemptstate,rcubhstate,rcuschedstate创建了内核线程rcugpkthread;rcugpkthread内核线程主要完成三个工作:1)创建新的宽限期GP;2)等待强制静止状态,设置超时,提前唤醒说明所有处理器经过了静止状态;3)宽限期结束处理。其中,前边两个操作都是通过睡眠等待在某个条件上。7。静止状态检测及报告
  很显然,对这种状态的检测通常都是周期性的进行,放置在时钟中断处理中就是情理之中了:
  rcuschedrcubh类型的RCU中,当检测CPU处于用户模式或处于idle线程中,说明当前CPU已经离开了临界区,经历了一个QS静止状态,对于rcubh的RCU,如果没有出去softirq上下文中,也表明CPU经历了QS静止状态;在rcupending满足条件的情况下,触发软中断的执行,rcuprocesscallbacks将会被调用;在rcuprocesscallbacks回调函数中,对宽限期进行判断,并对静止状态逐级上报,如果整个树状结构都经历了静止状态,那就表明了宽限期的结束,从而唤醒内核线程去处理;顺便提一句,在rcupending函数中,rcupendingrcupendingcheckcpustallprintcpustall的流程中,会去判断是否有CPUstall的问题,这个在内核中有文档专门来描述,不再分析了;8。状态机变换
  如果要观察整个状态机的变化,跟踪一下tracercugraceperiod接口的记录就能发现:Tracepointforgraceperiodevents。TakesastringidentifyingtheRCUflavor,thegraceperiodnumber,andastringidentifyingthegraceperiodrelatedeventasfollows:AccReadyCB:CPUaccleratesnewcallbackstoRCUNEXTREADYTAIL。AccWaitCB:CPUacceleratesnewcallbackstoRCUWAITTAIL。newreq:Requestanewgraceperiod。start:Startagraceperiod。cpustart:CPUfirstnoticesagraceperiodstart。cpuqs:CPUpassesthroughaquiescentstate。cpuonl:CPUcomesonline。cpuofl:CPUgoesoffline。reqwait:GPkthreadsleepswaitingforgraceperiodrequest。reqwaitsig:GPkthreadawakenedbysignalfromreqwaitstate。fqswait:GPkthreadwaitinguntiltimetoforcequiescentstates。fqsstart:GPkthreadstartsforcingquiescentstates。fqsend:GPkthreaddoneforcingquiescentstates。fqswaitsig:GPkthreadawakenedbysignalfromfqswaitstate。end:Endagraceperiod。cpuend:CPUfirstnoticesagraceperiodend。
  大体流程如下:
  9。总结本文提纲挈领的捋了一下RCU的大体流程,主要涉及到RCU状态机的轮转,从开启宽限期GP,到宽限期GP的初始化、静止状态QS的检测、宽限期结束、回调函数的调用等,而这部分主要涉及到软中断RCUSOFTIRQ和内核线程rcugpkthread的动态运行及交互等;内部的状态组织是通过rcustate,rcunode,rcudata组织成树状结构来维护,此外回调函数是通过rcudata中的分段链表来批处理,至于这些结构中相关字段的处理(比如gpnum,completed字段的设置来判断宽限期阶段等),以及链表的节点移动等,都没有进一步去分析跟进了;RCU的实现机制很复杂,很多其他内容都还未涉及到,比如SRCU(可睡眠RCU)、可抢占RCU,中断NMI对RCU的处理等,只能说是蜻蜓点水了;在阅读代码过程中,经常会发现一些巧妙的设计,有时会有顿悟的感觉,这也是其中的乐趣之一了;
  首页内核技术中文网构建全国最权威的内核技术交流分享论坛
  转载地址:深入剖析LinuxRCU原理剖析(二)渐入佳境圈点内核技术中文网构建全国最权威的内核技术交流分享论坛

NBA新生代三大狂人和成就最高的四人NBA历史上向来不缺乏天赋和狂人。有的狂人狂言不仅不让人反感,反倒是成为了美谈。最著名的例子,可能就是大鸟拉里伯德当年参加三分球大赛,走进更衣室直接指着其他选手问你们都是来争第二的一枪打出10。9满环!中国16岁天才美少女让世界瞩目,已获2金1银2022年射击世锦赛在埃及开罗激战正酣,来自中国的一位年仅16岁的小姑娘让人眼前一亮,她就是黄雨婷。在中国射击队队内选拔赛中,正是她击败东京奥运会双金王杨倩。本次世锦赛,黄雨婷用自球场情场都得意!内马尔与前女友复合,女友身材丰满突出嘴唇性感今天凌晨进行的法甲国家德比中,内马尔接应姆巴佩的助攻攻入全场唯一进球,帮助巴黎圣日耳曼10击败马赛,继续领跑积分榜。本赛季,内马尔的状态极其出色,他出场16次,打进12球助攻10次吴丹红律师为劳荣枝辩护遭网暴并有人向司法部门投诉他,人性可怕作者纳兰唐儿相逢是一首歌,无论是与人的相逢,还是与山河草木的相逢,都是一首荡气回肠,振奋人心的歌谣。世间所有相遇都是久别重逢,前世已经认识今生再见。封尘的记忆便在瞬间奔涌而出,海棠情人,是命中的注定,是缘分的因果文觅北缘分有因果,所以情人能够在今生相遇爱情有注定,所以情人能够成为彼此心中的最爱。人生在世,爱情是一种很美妙的东西。能够在今生今世遇见一个自己爱的人,同时也爱着自己的人,是一件很你许我一生所爱皆我,我许你一世满眼是你你许我一生所爱皆我,我许你一世满眼是你我知道,你是那么喜欢在我身边的那个人,不管是在什么时候,不管是什么人的心里,我都会想要和你在一起。所以,这一世许诺都没有白费。你许我一生所爱皆傻傻的爱,傻傻的等待为了这份爱,我们赞时的分开,我傻傻的爱,傻傻的等待!你在身边的时候,你就是整个世界,你不在身边的时候,整个世界都是你!我给不了你多少温暖,但有个词叫尽我所能,愿有生之年,只诉温暖不一滴水珠的梦我在头条搞创作第二期一滴水珠从梅花树上浸落,变成一片汪洋,汪洋泛着阵阵香雾,香雾聚尘变成一个曼妙的绝佳女子,见到女子的人都惊她为天人,所到之处涟漪阵阵,最终她被王子软硬手段征服,然40岁的男人明白这些人生道理还不晚头条创作挑战赛以下是总结的24条关于聪明男人的生活建议。当然,也许你也会发现,这其中也有些100年前,甚至1000年前的人们总结出来的经验之谈。不过,如果你会费尽心力去找到这些话究壮志凌云(小说连载之七)作者李吉华序言一个青年人的崎岖曲折坎坷的道路,饱经酸甜苦辣的生活,历经坎坷情感的丰富人生,仍然充满对祖国的热爱,胸怀大志,追求梦想,成就大业,以喜乐哀怒作为人生的伴侣。经历风雨,方见彩虹。你晚秋神韵晚秋神韵作者吴世清诵读黎敏生命中时常会出现那一片片红的熟透了的带着成长记忆阅历的晚秋的叶子绽放着永恒的美丽那是用生命的力量滋养将无限延伸的故事魅力般的传遍大江南北让这晚秋的风采一季
如何选择肉类鸡鸭鱼猪牛羊虽然都是肉,但各自的营养价值都有所不同!那怎么吃这些肉才最健康?根据WHO定义,肉可分为2种类型红肉所有来自哺乳动物的肉,都是红肉,比如猪牛羊等白肉其他肉,包括禽类和水乳腺增生子宫内膜增生,到底哪个更可怕?摘要又到体检季,乳腺增生子宫内膜增生成为高频词。随着近两年来新冠疫情的常态化,大家健康意识不断提高,体检养生保健成为现在人们的基本话题。体检报告一出后,总会听到几个女生讨论增生问题可转债投资知识13可转债的纯债价值怎么计算呢?死磕倒数第54天,深圳今天多云且小雨有些小可爱一直弄不清楚可转债的保底纯债价值怎么计算,今天我们就来捣鼓捣鼓可转债作为纯债来说计算收益的方法,分2种情况可转债一直持有到期6年的纯债自我关怀的力量有时候,你有没有觉得自己过得特别不舒坦,特别拧巴?做错一件事,能想上好几天。偶尔春风得意,仔细一想又觉得自己一无是处,没感受到幸福?比如有时候,工作做得挺好的,就因为一个小错,老板看完心服口服,承认自己烂了,失败是必然的1。别抱怨周围人素质差,别抱怨总遇到烂人小学生跟不上大学生的课,农民工进不了教授的群,你的振动频率会共振吸引同频的,烂人是自己招来的,是同频共振吸引来的,你爱打牌碰到三缺一的赌徒走有想我吗?我有想你喔每天的问候虽平淡,但那是我真诚的祝福!送给你最美的祝福平安健康身体好,笑容甜甜,快乐天天。亲爱的好朋友,可有想我?我有想你喔!祝你一早好心情,一天都如意顺心。时钟在走,日历在翻,岁晨读登临三清山滕王阁散记早就想游览三清山,也错过了几次机会。去年下决心要在有生之年登临此山,今秋终于实现了这一夙愿。果真名不虚传,但见山峰云雾缭绕,时隐时现,山峦层层叠叠,一片青翠。恰如宋代诗人吴沆所描写银川羊杂碎的魔性传奇每次从西藏拉萨回到银川,不管再晚,当代艺术家蒋勇急慌慌做的第一件事,就是和接他的朋友找一家羊杂碎馆,来上一大碗羊杂碎。碗里飘的是又红又香而不太辣的辣椒与羊尾巴油合制的羊油辣子,绿的东胜这些场所将临时关闭尊敬的广大市民朋友们为贯彻落实上级部门对新型冠状病毒感染肺炎疫情联防联控工作的要求,有效避免因人群聚集可能带来的传染风险,最大限度保障广大市民朋友的身体健康和生命安全,东胜区各旅游国庆假期旅行,台州周边游,推荐5处风景优美,游山玩水自然氧吧台州是山,海,水和谐的生态福地,台州位于浙江中部沿海,地势由西向东倾斜,西部山脉连绵素有走遍苏杭,不如温黄之说孕育着多处风景名胜。江南长城神仙居琼台仙谷台州有哪些好玩的?推荐5处风二十大代表风采丨施金通续写十八洞村的山乡巨变施金通。湖南日报全媒体记者辜鹏博李健摄湖南日报全媒体记者陈奕樊档案施金通,党的二十大代表,湖南省花垣县双龙镇副镇长,十八洞村党支部书记村委会主任。他带领十八洞村在全县率先整村脱贫,
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网