应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

一文读懂Kernel同步机制的底层实现(超详细)

  原子操作
  通常我们代码中的aa1这样的一行语句,翻译成汇编后蕴含着3条指令:ldrx0,aaddx0,x0,1strx0,a
  即(1)从内存中读取a变量到X0寄存器(2)X0寄存器加1(3)将X0写入到内存a中
  既然是3条指令,那么就有可能并发,也就意味着返回的结果可能不是预期的。
  然后在linuxkernel的操作系统中,提供访问原子变量的函数,用来解决上述问题。其中部分原子操作的API如下:
  atomicreadatomicaddreturn(i,v)atomicadd(i,v)atomicinc(v)atomicaddunless(v,a,u)atomicincnotzero(v)atomicsubreturn(i,v)atomicsubandtest(i,v)atomicsub(i,v)atomicdec(v)atomiccmpxchg(v,旧,新)
  那么操作系统(仅仅是软件而已)是如何保证原子操作的呢?(还是得靠硬件),硬件原理是什么呢?
  以上的那些API函数,在底层调用的其实都是如下lseatomicaddreturnname宏的封装,这段代码中最核心的也就是ldadd指令了,这是armv8。1增加的LSE(LargeSystemExtension)feature。(linuxarcharm64includeasmatomiclse。h)staticinlineintlseatomicaddreturnname(inti,atomictv){u32tmp;asmvolatile(LSEPREAMBLEldaddmbw〔i〕,w〔tmp〕,〔v〕addw〔i〕,w〔i〕,w〔tmp〕:〔i〕r(i),〔v〕Q(vcounter),〔tmp〕r(tmp):r(v):cl);returni;}
  那么系统如果没有LSE扩展呢,即armv8。0,其实现的原型如下所示,这段代码中最核心的也就是ldxr、stxr指令了。(linuxarcharm64includeasmatomicllsc。h)staticinlinevoidllscatomicop(inti,atomictv){unsignedlongtmp;intresult;asmvolatile(atomicopLLSCFALLBACK(prfmpstl1strm,21:ldxrw0,2asmopw0,w0,w3stxrw1,w0,2cbnzw1,1b):r(result),r(tmp),Q(vcounter):stringify(constraint)r(i));}
  那么在armv8。0之前呢,如armv7是怎样实现的?如下所示,这段代码中最核心的也就是ldrex、strex指令了。(linuxarcharmincludeasmatomic。h)staticinlinevoidatomicop(inti,atomictv){unsignedlongtmp;intresult;prefetchw(vcounter);asmvolatile(atomicop1:ldrex0,〔3〕asmop0,0,4strex1,0,〔3〕teq1,0bne1b:r(result),r(tmp),Qo(vcounter):r(vcounter),Ir(i):cc);}总结:
  在很早期,使用arm的exclusive机制来实现的原子操作,exclusive相关的指令也就是ldrex、strex了,但在armv8后,exclusive机制的指令发生了变化变成了ldxr、stxr。但是又由于在一个大系统中,处理器是非常多的,竞争也激烈,使用独占的存储和加载指令可能要多次尝试才能成功,性能也就变得很差,在armv8。1为了解决该问题,增加了ldadd等相关的原子操作指令。
  更多linux内核视频教程文档资料免费领取后台私信【内核】自行获取。
  Linux内核源码内存调优文件系统进程管理设备驱动网络协议栈学习视频教程腾讯课堂自旋锁早期旋锁的设计
  早期的spinlock的设计是锁的拥有者加锁时将锁的值设置为1,释放锁时将锁的值设置为0,这样做的缺点是会出现先来抢占锁的进程一直抢占不到锁,而后来的进程可能一来就能获取到锁。导致这个原因的是先抢占的进程和后抢占的进程在抢占锁时并没有一个先后关系,最终就是离锁所在的内存最近的cpu节点就有更多的机会抢占锁,离锁所在内存远的节点可能一直抢占不到。新版旋锁设计
  为了解决这个spinlock的不公平问题,linux2。6。25内核以后,spinlock采用了一种FIFOticketbased算法的spinlock机制,可以很好的实现先来先抢占的思想。具体的做法如下:spinlock的核心字段有owner和next,在初始时,ownernext0当第一个进程抢占spinlock时,会在进程函数本地保存下next的值,也就是next0,并将spinlock的next字段加1;当获取spinlock的进程的本地next和spinlock的owner相等时,该进程就获取到spinlock;由于第一个进程本地的next0,并且spinlock的owner为0,所以第一个CPU获取到spinlock;接着当第二个进程抢占spinlock,此时spinlock的next值为1,保存到本地,然后将spinlock的next字段加1。而spinlock的owner字段依然为0,第二个进程的本地next不等于spinlock的owner,所以一直自旋等待spinlock;第三个进程抢占spinlock,得到本地next值为2,然后将spinlock的next字段加1。此时spinlock的owner字段还是为0,所以第三个进程自旋等待。当第一个进程处理完临界区以后,就释放spinlock,执行的操作是将spinlock的owner字段加1;由于第二个进程和第三个进程都还在等待spinlock,他们会不停第获取spinlock的owner字段,并和自己本地的next值进行比较。当第二个进程发现自己的next值和spinlock的owner字段相等时(此时nextowner2),第二个进程就获取到spinlock。第三个进程的本地next值是3,和spinlock的owner字段不相等,所以继续等待;只有在第二个进程释放了spinlock,就会将spinlock的owner字段加1,第三个进程才有机会获取spinlock。
  我在举个例子,如下:
  T1:进程1调用spinlock,此时next0,owner0获得该锁,在archspinlock()底层实现中,会nextT2:进程2调用spinlock,此时next1,owner0没有获得该锁,while(1)中调用wfe指令standby在那里,等待ownernext成立。T3:进程3调用spinlock,此时next2,owner0没有获得该锁,while(1)中调用wfe指令standby在那里,等待ownernext成立。T4T5:进程1调用spinunlock,此时owner,即owner1,接着调用sev指令,让进程2和进程3退出standby状态,走while(1)流程,重新检查ownernext条件。此时进程2条件成立,进程3继续等待。进程2获得该锁,进程3继续等待。LinuxKernel中的SpinLock的实现
  (linuxincludelinuxspinlock。h)staticalwaysinlinevoidspinunlock(spinlocktlock){rawspinunlock(lockrlock);}staticalwaysinlinevoidspinlock(spinlocktlock){rawspinlock(lockrlock);}(linuxincludelinuxspinlock。h)definerawspinlockirq(lock)rawspinlockirq(lock)definerawspinlockbh(lock)rawspinlockbh(lock)definerawspinunlock(lock)rawspinunlock(lock)definerawspinunlockirq(lock)rawspinunlockirq(lock)definerawspinlock(lock)rawspinlock(lock)(linuxkernellockingspinlock。c)ifdefCONFIGUNINLINESPINUNLOCKvoidlockfuncrawspinunlock(rawspinlocktlock){rawspinunlock(lock);}EXPORTSYMBOL(rawspinunlock);endififndefCONFIGINLINESPINLOCKvoidlockfuncrawspinlock(rawspinlocktlock){rawspinlock(lock);}EXPORTSYMBOL(rawspinlock);endif(linuxincludelinuxspinlockapismp。h)staticinlinevoidrawspinunlock(rawspinlocktlock){spinrelease(lockdepmap,RETIP);dorawspinunlock(lock);preemptenable();}staticinlinevoidrawspinlock(rawspinlocktlock){preemptdisable();spinacquire(lockdepmap,0,0,RETIP);LOCKCONTENDED(lock,dorawspintrylock,dorawspinlock);}(linuxincludelinuxspinlock。h)staticinlinevoiddorawspinunlock(rawspinlocktlock)releases(lock){mmiowbspinunlock();archspinunlock(lockrawlock);release(lock);}staticinlinevoiddorawspinlock(rawspinlocktlock)acquires(lock){acquire(lock);archspinlock(lockrawlock);mmiowbspinlock();}
  对于archspinlock()、archspinunlock()的底层实现,不同的kernel版本也一直在变化。
  对于kernel4。4这个版本,还是比较好理解的,最核心的也就是ldaxr、ldaxr独占指令,以及stlrhrelease指令(linuxarcharm64includeasmspinlock。h)staticinlinevoidarchspinlock(archspinlocktlock){unsignedinttmp;archspinlocktlockval,newval;asmvolatile(Atomicallyincrementthenextticket。ARM64LSEATOMICINSN(LLSCprfmpstl1strm,31:ldaxrw0,3addw1,w0,w5stxrw2,w1,3cbnzw2,1b,LSEatomicsmovw2,w5ldaddaw2,w0,3nopnopnop)Didwegetthelock?eorw1,w0,w0,ror16cbzw1,3fNo:spinontheowner。Sendalocaleventtoavoidmissinganunlockbeforetheexclusiveload。sevl2:wfeldaxrhw2,4eorw1,w2,w0,lsr16cbnzw1,2bWegotthelock。Criticalsectionstartshere。3::r(lockval),r(newval),r(tmp),Q(lock):Q(lockowner),I(1TICKETSHIFT):memory);}staticinlinevoidarchspinunlock(archspinlocktlock){unsignedlongtmp;asmvolatile(ARM64LSEATOMICINSN(LLSCldrhw1,0addw1,w1,1stlrhw1,0,LSEatomicsmovw1,1nopstaddlhw1,0):Q(lockowner),r(tmp)::memory);}

Hiber为用户生成的网络游戏平台筹集了225万美元Hiber在其网络平台的第二轮种子融资中筹集了225万美元,该平台可轻松创建用户生成的游戏。该公司表示,它处于互联设备,人工智能和以创作者为中心的娱乐的交汇处。这家总部位……星二代女孩任达华女儿18岁名下三十套房产,黄磊女儿16岁当导现如今,娱乐圈的星二代越来越多,他们不仅遗传了父母的优良基因,而且还凭借自身的优势踏足在各个领域。今天就让我们我们来认识一下几位优秀的星二代女儿,他们当……Google正在使用卫星图像和地图可视化野火的大小和行为ldquo;如果我出现或听起来很累,就必须原谅我;众所周知,在该州,我们着火了很多。rdquo;加利福尼亚州州长紧急服务办公室(CalOES)的负责人艾比middot;布朗宁(……Cobalt融资2900万美元将其最薄即服务平台带给更多软件Cobalt。io是一个ldquo;以服务为中心rdquo;的平台,该平台可让任何企业访问道德黑客对他们的软件进行压力测试,该公司已在由HighlandEurope牵头的B轮融……三月游戏基金为游戏初创公司募集了6000万美元MarchCapital推出了其6000万美元的March游戏基金,用于投资游戏初创公司。该基金由常务董事格雷戈里middot;米尔肯(GregoryMilken)领导,自该基……陆毅和郭京飞一对连襟,两种性格,都是丈母娘的好女婿有一年,汪涵采访到郭京飞。问他:你和陆毅,谁更受丈母娘待见。郭京飞回答说:以前是他,现在是我了,因为现在我们夫妻和丈母娘生活在一起。而有媒体采访陆毅时,陆毅则……韦德谈詹姆斯言论不明白他为何要贬低队友,湖人的阵容非常强大湖人队在输给鹈鹕之后双方的排名发生了逆转,不过差距不大,好消息是在下个月的二号双方还有一次正面交手的机会,湖人可以在那个时候洗刷耻辱,让人意外的是詹姆斯在当时比赛结束之后直接抨……护肤的顺序是怎样的,涂完护肤品脸上油油的怎么办?护肤的顺序是怎样的1。首先使用成分温和的洗面奶对肌肤进行清洁,确保表面污渍及多余的油脂被清理干净,再使用爽肤水进行保湿,将爽肤水轻轻拍打在肌肤上,可以起到二次清洁和镇定的……iFarm融资400万美元利用AI和无人机实现城市农业自动化iFarm已经筹集了400万美元用于扩展其自动化系统,该系统使用AI和无人机在封闭空间内种植水果和蔬菜。加加林资本(GagarinCapital)领导了这一轮融资,其中包括Ma……Xwing推出用于支线飞机的自动飞行系统自动飞行启动公司Xwing今天推出了用于全自动飞行的系统。自公司成立以来,这是Xwing公开共享的第一个系统。Xwing创建于2016年,由Stripe联合创始人John和Pa……冰雪正版传奇兑换码攻略热血传奇怒火一刀手游内容嗨,各位玩家们大家好,欢迎来到【朝阳游戏】,冰雪传奇怒火一刀游戏有哪些内容呢,怒火一刀手游内容跟随小编一起来看看吧,希望能够给大家带来帮助哦!本文转载自共重耗【朝阳游戏】……我国在研究疫苗等相关产业上的生物化学技术依然存在巨大最近一条全新的消息,让不少的人心中又充满了担忧。对于这次影响全世界的新冠肺炎疫情来说,人们都在期盼着特效生物化学疫苗能够早日研制成功。但是,最近国外医学家表示,即使新疫苗研制成……
奚梦瑶生完二胎复工,一袭ElieSaab黑色连衣裙,超模气场奚梦瑶工作室分享了一组奚梦瑶出席活动的美照,着黑色长裙搭配盘发,优雅有气场。这也是奚梦瑶生下二胎女儿四个月后正式复工的活动。晒出的照片里,奚梦瑶妆发精致,身穿深V款式裙装……传音入密再现江湖!无需耳机只有你能听到,这音箱怎么做到?目前,我们收听手机或电脑的声音,只有两种方法:要么通过扬声器大声广播,在干扰旁人的同时也暴露了隐私,要么佩戴耳机,时间一长也会不舒服。多亏了科技的不断进步,我们有了第三种选择,……时尚史上最昂贵的8件连衣裙无论是在时装博览会上展示,还是披在最富有的新娘的肩膀上,还是披在最颓废的电影明星身上,最昂贵的礼服总是定义最时尚的女士。这是我们有史以来最昂贵的8件连衣裙的清单。8。黑色纪梵希……忌口生冷寒凉包括哪些阳虚患者需要忌口以下生冷寒凉食物,否则会影响药物疗效。生冷、寒凉食物包括哪些?一、生冷食物就是字面上理解的生、冷,如生的瓜果蔬菜;从冰箱直接拿出来的冒冷气的饮……今天是全国爱肝日,警惕这些吃出来的肝病3月18日是全国爱肝日,今年的爱肝日主题是全民参与、主动筛查、规范诊疗、治愈肝炎。提起肝病,很多人会想到甲肝、乙肝、丙肝等病毒性肝病,但很少听说戊肝。其实,人群知晓率较低……国家能源局2021年我国光伏发电新增并网容量5488万千瓦【精品能源内容,点击右上角加关注】国家能源局日前公布2021年光伏发电建设运行情况,数据显示,2021年我国光伏发电新增并网容量5488万千瓦,其中集中式光伏电站2560……早春自驾菱智PLUS旅行版早春自驾菱智PLUS旅行版,和三五好友一起尽情游玩早春之行,必须约上三五好友一起去周边城市尽情游玩你的多面担当已就位菱智PLUS旅行版就是你的早春……RedmiK50价格大猜测,卢伟冰会保持初心吗?纵观RedmiK50系列的整体预热,可以用惊喜来形容。因为这一次官方的预热一直围绕在联发科天玑9000版本进行,谁也没有想到卢伟冰会堆料这么狠。很多元器件已经超出行业和网友的预……旅行的意义,并不是告诉别人这里我来过,而是一种改变旅行就像小马过河一样,如果你不亲身体验、亲眼见识一下,你永远不知道旅行对你来说意味着什么?永远都不会知道自己其实有无限可能!旅行是人生中的养分,通过离开自己所熟悉的环境去……截至今年10月末全国涉农贷款余额48。54万亿元央视网消息:银保监会最新消息,今年以来,银行业保险业不断提高三农金融服务的覆盖面、可得性和均衡性。到10月底,全国涉农贷款余额已接近50万亿元。数据显示,截至今年10月末……女人过了50岁,不一定非要剪短发,这三款长卷发时尚洋气又显年很多女人过了50岁后,都选择了留短发。选择留短发的原因很多,比如发量逐渐减少,白发越来越多,发质越来越差,自身的气质以及体型发生改变等等。但也不是说每个人都适合留长发,比如颅顶……医生提醒面部衰老一般有以下表现,看看自己占了几个面部衰老,是一个令人害怕的词语。我们害怕老去,害怕变丑,害怕衰老。而面部衰老,却是一个不得不面对的事情。今天我们跟大家来聊一聊面部衰老的知识,谈一谈面部抗衰老可以用到的方法,到……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网