幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

Linux内核中原子操作及实现原理

  所谓原子操作,就是不可中断的一个或一系列操作。
  硬件级的原子操作:在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是原子操作,因为中断只发生在指令边缘。在多处理器结构中(SymmetricMultiProcessor)就不同了,由于系统中有多个处理器独立运行,即使能在单条指令中完成的操作也有可能受到干扰。在X86平台生,CPU提供了在指令执行期间对总线加锁的手段。CPU上有一根引线HLOCKpin连到北桥,如果汇编语言的程序中在一条指令前面加上前缀LOCK,经过汇编以后的机器代码就使CPU在执行这条指令的时候把HLOCKpin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性。对于其他平台的CPU,实现各不相同,有的是通过关中断来实现原子操作(sparc),有的通过CMPXCHG系列的指令来实现原子操作(IA64)。本文主要探讨X86平台下原子操作的实现。
  一。整型原子操作
  详细教程资料课件关注后台私信;资料;两个字可以免费视频领取文档各大厂面试题资料内容包括:CC,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,嵌入式等。
  原子操作通常针对int或bit类型的数据,但是Linux并不能直接对int进行原子操作,而只能通过atomict的数据结构来进行。目前了解到的原因有两个。定义于include分为定义,获取,加减,测试,返回。voidatomicset(atomictv,inti);设置原子变量v的值为iatomictvATOMICINIT(0);定义原子变量v,并初始化为0;atomicread(atomictv);返回原子变量v的值;voidatomicadd(inti,atomictv);原子变量v增加i;voidatomicsub(inti,atomictv);voidatomicinc(atomictv);原子变量增加1;voidatomicdec(atomictv);intatomicincandtest(atomictv);先自增1,然后测试其值是否为0,若为0,则返回true,否则返回false;intatomicdecandtest(atomictv);intatomicsubandtest(inti,atomictv);先减i,然后测试其值是否为0,若为0,则返回true,否则返回false;注意:只有自加,没有加操作intatomicaddreturn(inti,atomictv);v的值加i后返回新的值;intatomicsubreturn(inti,atomictv);intatomicincreturn(atomictv);v的值自增1后返回新的值;intatomicdecreturn(atomictv);
  二。原子位操作的实现
  详细教程资料课件关注后台私信;资料;两个字可以免费视频领取文档各大厂面试题资料内容包括:CC,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,嵌入式等。定义于include分为设置,清除,改变,测试voidsetbit(intnr,volatilevoidaddr);设置地址addr的第nr位,所谓设置位,就是把位写为1;voidclearbit(intnr,volatilevoidaddr);清除地址addr的第nr位,所谓清除位,就是把位写为0;voidchangebit(intnr,volatilevoidaddr);把地址addr的第nr位反转;inttestbit(intnr,volatilevoidaddr);返回地址addr的第nr位;inttestandsetbit(intnr,volatilevoidaddr);测试并设置位;若addr的第nr位非0,则返回true;若addr的第nr位为0,则返回false;inttestandclearbit(intnr,volatilevoidaddr);测试并清除位;inttestandchangebit(intnr,volatilevoidaddr);测试并反转位;上述操作等同于先执行testbit(nr,voidaddr)然后在执行xxxbit(nr,voidaddr)举个简单例子:
  详细教程资料课件关注后台私信;资料;两个字可以免费视频领取文档各大厂面试题资料内容包括:CC,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,嵌入式等。
  为了实现设备只能被一个进程打开,从而避免竞态的出现staticatomictscullavailableATOMICINIT(1);initatomic在scullopen函数和scullclose函数中:intscullopen(structinodeinode,structfilefilp){structsculldevdev;deviceinformationdevcontainerof(inodeicdev,structsculldev,cdev);filpprivatedatadev;forothermethodsif(!atomicdecandtest(scullavailable)){atomicinc(scullavailable);returnEBUSY;}return0;success}intscullrelease(structinodeinode,structfilefilp){atomicinc(scullavailable);return0;}
  假设原子变量的底层实现是由一个汇编指令实现的,这个原子性必然有保障。但是如果原子变量的实现是由多条指令组合而成的,那么对于SMP和中断的介入会不会有什么影响呢?我在看ARM的原子变量操作实现的时候,发现其是由多条汇编指令(ldrexstrex)实现的。在参考了别的书籍和资料后,发现大部分书中对这两条指令的描诉都是说他们是支持在SMP系统中实现多核共享内存的互斥访问。但在UP系统中使用,如果ldrexstrex和之间发生了中断,并在中断中也用ldrexstrex操作了同一个原子变量会不会有问题呢?就这个问题,我认真看了一下内核的ARM原子变量源码和ARM官方对于ldrexstrex的功能解释,总结如下
  一、ARM构架的原子变量实现结构
  对于ARM构架的原子变量实现源码位于:archarmincludeasmatomic。h
  其主要的实现代码分为ARMv6以上(含v6)构架的实现和ARMv6版本以下的实现。
  该文件的主要结构如下:
  详细教程资料课件关注后台私信;资料;两个字可以免费视频领取文档各大厂面试题资料内容包括:CC,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,嵌入式等。ifLINUXARMARCH6。。。。。。(通过ldrexstrex指令的汇编实现)elseARMARCH6ifdefCONFIGSMPerrorSMPnotsupportedonpreARMv6CPUsendif。。。。。。(通过关闭CPU中断的C语言实现)endifLINUXARMARCH。。。。。。ifndefCONFIGGENERICATOMIC64。。。。。。(通过ldrexdstrexd指令的汇编实现的64bit原子变量的访问)else!CONFIGGENERICATOMIC64includeendifinclude
  这样的安排是依据ARM核心指令集版本的实现来做的:
  (1)在ARMv6以上(含v6)构架有了多核的CPU,为了在多核之间同步数据和控制并发,ARM在内存访问上增加了独占监测(Exclusivemonitors)机制(一种简单的状态机),并增加了相关的ldrexstrex指令。请先阅读以下参考资料(关键在于理解localmonitor和Globalmonitor):
  1。2。2。Exclusivemonitors
  4。2。12。LDREX和STREX
  2)对于ARMv6以前的构架不可能有多核CPU,所以对于变量的原子访问只需要关闭本CPU中断即可保证原子性。对于(2),非常好理解。
  但是(1)情况,我还是要通过源码的分析才认同这种代码,以下我仅仅分析最具有代表性的atomicadd源码,其他的API原理都一样。如果读者还不熟悉C内嵌汇编的格式,请参考CCLinux服务器开发后台架构师【零声教育】学习视频教程腾讯课堂
  二、内核对于ARM构架的atomicadd源码分析
  详细教程资料课件关注后台私信;资料;两个字可以免费视频领取文档各大厂面试题资料内容包括:CC,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,嵌入式等。ARMv6UP和SMP安全原子操作。我们是用独占载入和独占存储来保证这些操作的原子性。我们可能会通过循环来保证成功更新变量。staticinlinevoidatomicadd(inti,atomictv){unsignedlongtmp;intresult;asmvolatile(atomicadd1:ldrex0,〔3〕add0,0,4strex1,0,〔3〕teq1,0bne1b:r(result),r(tmp),Qo(vcounter):r(vcounter),Ir(i):cc);}
  源码分析:
  注意:根据内联汇编的语法,result、tmp、vcounter对应的数据都放在了寄存器中操作。如果出现上下文切换,切换机制会做寄存器上下文保护。(1)ldrex0,〔3〕
  意思是将vcounter指向的数据放入result中,并且(分别在Localmonitor和Globalmonitor中)设置独占标志。(2)add0,0,4resultresulti(3)strex1,0,〔3〕
  意思是将result保存到vcounter指向的内存中,此时Exclusivemonitors会发挥作用,将保存是否成功的标志放入tmp中。(4)teq1,0
  测试strex是否成功(tmp0??)(5)bne1b
  如果发现strex失败,从(1)再次执行。
  通过上面的分析,可知关键在于strex的操作是否成功的判断上。而这个就归功于ARM的Exclusivemonitors和ldrexstrex指令的机制。以下通过可能的情况分析ldrexstrex指令机制。(请阅读时参考4。2。12。LDREX和STREX)
  1、UP系统或SMP系统中变量为非CPU间共享访问的情况
  详细教程资料课件关注后台私信;资料;两个字可以免费视频领取文档各大厂面试题资料内容包括:CC,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,嵌入式等。
  此情况下,仅有一个CPU可能访问变量,此时仅有Localmonitor需要关注。
  假设CPU执行到(2)的时候,来了一个中断,并在中断里使用ldrexstrex操作了同一个原子变量。则情况如下图所示:
  A:处理器标记一个物理地址,但访问尚未完毕B:再次标记此物理地址访问尚未完毕(与A重复)C:进行存储操作,清除以上标记,返回0(操作成功)D:不会进行存储操作,并返回1(操作失败)
  也就是说,中断例程里的操作会成功,被中断的操作会失败重试。
  2、SMP系统中变量为CPU间共享访问的情况
  详细教程资料课件关注后台私信;资料;两个字可以免费视频领取文档各大厂面试题资料内容包括:CC,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,嵌入式等。
  此情况下,需要两个CPU间的互斥访问,此时ldrexstrex指令会同时关注Localmonitor和Globalmonitor。
  (i)两个CPU同时访问同个原子变量(ldrexstrex指令会关注Globalmonitor。)
  详细教程资料课件关注后台私信;资料;两个字可以免费视频领取文档各大厂面试题资料内容包括:CC,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,嵌入式等。
  A:将该物理地址标记为CPU0独占访问,并清除CPU0对其他任何物理地址的任何独占访问标记。B:标记此物理地址为CPU1独占访问,并清除CPU1对其他任何物理地址的任何独占访问标记。C:没有标记为CPU0独占访问,不会进行存储,并返回1(操作失败)。D:已被标记为CPU1独占访问,进行存储并清除独占访问标记,并返回0(操作成功)。
  也就是说,后执行ldrex操作的CPU会成功。
  (ii)同一个CPU因为中断,嵌套访问同个原子变量(ldrexstrex指令会关注Localmonito)详细教程资料课件关注后台私信;资料;两个字可以免费视频领取文档各大厂面试题资料内容包括:CC,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,嵌入式等。
  A:将该物理地址标记为CPU0独占访问,并清除CPU0对其他任何物理地址的任何独占访问标记。B:再次标记此物理地址为CPU0独占访问,并清除CPU0对其他任何物理地址的任何独占访问标记。C:已被标记为CPU0独占访问,进行存储并清除独占访问标记,并返回0(操作成功)。D:没有标记为CPU0独占访问,不会进行存储,并返回1(操作失败)。
  也就是说,中断例程里的操作会成功,被中断的操作会失败重试。
  (iii)两个CPU同时访问同个原子变量,并同时有CPU因中断嵌套访问改原子变量(ldrexstrex指令会同时关注Localmonitor和Globalmonitor)详细教程资料课件关注后台私信;资料;两个字可以免费视频领取文档各大厂面试题资料内容包括:CC,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,嵌入式等。
  虽然对于人来说,这种情况比较BT。但是在飞速运行的CPU来说,BT的事情随时都可能发生。A:将该物理地址标记为CPU0独占访问,并清除CPU0对其他任何物理地址的任何独占访问标记。B:标记此物理地址为CPU1独占访问,并清除CPU1对其他任何物理地址的任何独占访问标记。C:再次标记此物理地址为CPU0独占访问,并清除CPU0对其他任何物理地址的任何独占访问标记。D:已被标记为CPU0独占访问,进行存储并清除独占访问标记,并返回0(操作成功)。E:没有标记为CPU1独占访问,不会进行存储,并返回1(操作失败)。F:没有标记为CPU0独占访问,不会进行存储,并返回1(操作失败)。总结:
  当然还有其他许多复杂的可能,也可以通过ldrexstrex指令的机制分析出来。从上面列举的分析中,我们可以看出:ldrexstrex可以保证在任何情况下(包括被中断)的访问原子性。所以内核中ARM构架中的原子操作是可以信任的。
  详细教程资料课件关注后台私信;资料;两个字可以免费视频领取文档各大厂面试题资料内容包括:CC,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCPIP,协程,DPDK,嵌入式等。

林正英冷门电影黄大仙,看看沿海地区的人,对黄大仙的尊崇很多港片迷提到林正英,都会不自觉地用九叔这一称呼,原因无他,林正英的茅山道长形象太过经典。但要知道,林正英17岁从影做龙虎武师,到33岁时,凭《僵尸先生》红遍影坛,期间自……想吃野菜换换口味,糖友不妨试试田里的这些野菜,可清热解毒利水我国是野菜利用历史悠久的地区之一,野菜资源很丰富。很多野菜不仅有食用价值,还有药用价值。上几期杂志,我们为大家介绍了荠菜、车前草、香椿等春季野菜。本期,我们继续为大家介绍几款夏……2022即将播出的4部古装剧,流量明星在榜,你最期待哪一部先1、《与君初相识》主演:迪丽热巴任嘉伦肖顺尧郭晓婷这部剧是根据小说改编,选角方面,我个人认为没什么问题,因为男女主的颜值都挺高,迪丽热巴饰演记云禾,和阿兰若比较像,阿兰若……罗永浩即将重返科技行业新公司不会再叫锤子IT之家3月17日消息,OPPO今日邀请了罗永浩、罗翔,和刘作虎进行了一场对话。slogan为回归本行,回顾初心,直面质疑,感受勇敢。一开场,刘作虎就点出罗永浩回归科技行……别盲目地追求慵懒风,掌握好松紧这个技巧,视觉效果拉满Hi,我是BOKA姐,一天一个小技巧。我采访过很多大学生和二十来岁的小姐姐,对于服装穿搭这方面,我听到最多的就是喜欢慵懒风,港风这两个词。但是每次叫他们描述一下这类风格怎……注意!这14款App违法!快看你手机里有没有国家计算机病毒应急处理中心近期通过互联网监测发现14款移动应用存在隐私不合规行为,违反《网络安全法》《个人信息保护法》相关规定,涉嫌超范围采集个人隐私信息。1。在App首……请不要再以各种名义给孩子配手机了孩子对手机的沉迷和依赖,日渐成为教育的一大难题。甚至,越来越多悲剧因此发生。一个高中生因为两次玩手机被抓,凌晨从学校宿舍坠楼;一个15岁女孩因为父亲给不够钱买手机,……中国天问一号,火星任务的一周年中国首次独立进行的天问一号火星探测任务,在2021年2月10日进入火星轨道,目前已经成功在火星工作了一年时间。天问一号到达火星,只是火星探测的一个阶段,三个月后,祝融号火……就在今天,德罗赞创59年唯一奇迹!乔丹做不到,詹姆斯也做不到今日NBA比赛中有多位球员表现出色,不过最让人惊叹的当属公牛的德罗赞,在公牛vs马刺的比赛中,三节战罢后公牛落后6分,这时德罗赞又站了出来,他在第四节9投8中轰下19分,强行接……雪花纷飞中赏香山卧佛寺腊梅花(2022年2月13日)早晨醒来望窗外白雪皑皑兴奋了!匆忙吃点东西乘公交车直奔香山植物园。目的里一睹雪中腊梅花的尊容。大雪纷飞中的植物园研究所里的小亭子。途径……海水制取绿氢的现状如何?水是一种充足的自然资源,其约占地球表面的71。其中,海水占地球全部水量的96。5,与淡水不同,其成分非常复杂,涉及的化学物质及元素有92种。氢是地球上已知的能量密度最高的……男人65岁之后,睡前养成这些习惯,一般都会长寿前言:人过了65岁之后,就已经进入老年状态,在这个时候,必须有良好的习惯,如果没有良好的习惯,我们的身体各方面都会出现问题,活着,就需要过上舒服的日子,如果日子过得不开心……
大爆冷!国羽亚锦赛2人被淘汰,日本小将21逆转新科全英赛冠军北京时间4月27日,羽毛球亚锦赛正在进行。率先开始的是单项资格赛,以及男双,混双16强席位争夺战。刚刚结束的比赛中,国羽奥运冠军黄东萍王懿律出场,两人直落两局,以21:10,2……欧国联精彩1夜!荷兰克罗地亚晋级法国输球保级威尔士奥地利降级北京时间9月26日,欧国联A1和A4小组的比赛全部结束,荷兰和丹麦晋级决赛圈,奥地利和威尔士则降入B级。丹麦20法国法国客场02负于丹麦。第34分钟,达姆斯高左路传……定了!这些勾兑酒大户全是香精假酒,快看你家里有没有如果问起买什么酒最心痛,敢说肯定是假酒,这假酒光提起来都让人恨的牙痒痒!尤其现在社会如此发达,更是有人明目张胆的卖假酒,而且商家的套路一天一个样,根本不重样,作为消费者的……孕妇睡觉的时候为什么不能够平躺在准妈妈知道自己初为人母的欣喜时刻,也千万不要忘记注意孕妇的一些注意事项哦!在睡觉的时候尤其要注意孕妇在怀孕期间特别容易因为腹部受到本该不是这个身体受到的挤压而失眠,尤其……糖吃多了会加速衰老,大人小孩记得要少吃噢糖吃多了会加速衰老吗?糖果品冰茶冰淇淋奶茶糖果片糖果糖是维持生命活动的主要能量来源,起着非常重要的作用。食品中的新鲜果蔬含有单糖和多糖……人在难熬的时候,做好这件事,往往是涅槃重生的开始知乎上有一个很火的问题:你认为一个体面的人,他(她)是什么样子?有人说:体不体面,不要看他顺风顺水时的状态,而要看他遭遇困厄时的样子,在难熬的日子里,坚守底线,从容不迫,……放射性元素钴60制成的钴弹威力究竟有多恐怖?传闻中的一枚毁灭地球又是否言过其实呢?在1959年,物理学家利奥希拉德提出来一个末日武器概念,即使将一颗氢弹装进一层钴59的外壳,加工成为一枚加重辐射氢弹,当氢弹被引爆,外壳的……没本事的男人通常有哪些特征?1、喜欢自吹自擂,把面子看得太重男人都好面子,这是毋庸置疑的,他们往往会把自尊心看得太重,不愿意在外人面前露了怯。好面子不是一件坏事,但是我们都应该知道面子是靠自己的实力……徐璐穿白色连帽卫衣配牛仔裤,秒变青春美少女,街头潮范十足秋日生活打卡季点击上方蓝字关注我们白色的连帽卫衣干净靓丽,自带青春活力感,又很不失百搭性,配上创意的牛仔裤,相信在这个秋天很多女生都会很青睐。徐璐用一件基础款衬肤色……一个人,顺应自己的直觉,做事通常很准天道,是变化与平衡之道,是阴阳的动与守一的静之完美结合。当人之道,事之发,与天道不一致,是顺天行事,还是顺自己行事?这是一个值得思考和实践的问题。分享我最近的实践心……输美国遗憾更自豪!三替补可圈可点小宝最风骚,对手称赞球迷大爱输了,中国女篮没有创造奇迹,征服美利坚,遗憾但更有自豪!遗憾,最好年华,最棒球员,最出色教练,仍没打赢美国!如果决赛有詹姆斯梦,或许期待更多,机会更多!自豪,小组赛……防线形同虚设,滕哈格自废武功,曼联被打回原形万众瞩目的曼市德比最终以曼城63曼联结束,其中上半场曼城就以4球领先,如果不是有射中门框的情况,至少已经5球领先。半场之后就已经有曼联球迷不忍直视球队的表现离开球场。本场……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网