membarrier(个人学习理解)

本文介绍了Linux内核中的membarrier机制,它用于解决多核环境中内存访问顺序的问题,防止乱序执行导致的数据不一致。通过举例说明了writer和reader线程在循环队列操作中可能遇到的问题,强调了内存屏蔽的重要性。同时解释了乱序执行的概念,以CPU执行指令的类比来阐述其工作原理。最后,讨论了membarrier如何确保屏障后的指令不会提前执行,确保内核同步。
摘要由CSDN通过智能技术生成

memebarrier是实现Linux内核同步的机制,是一种保证内存访问顺序的一种方法;与上锁的功能类似。

实例:

现有两个线程writer、reader运行在Linux的不同核上,他们都对同一循环队列进行操作。

writer_index为写标记位,每次写前先writer_index+1再写;初值位0;

reader_index为读标记位,每次读前reader_index+1再读;初值为0;

条件:reader_index-writer_index!=1  可写

writer_index-reader_index!=0 可读

若CPU进行乱序执行:

(默认初始index都为0)

writer检查reader_index - writer_index != 1首先writer_index+1, 再进行写操作,而在写之前 reader发现writer_index-reader_index!=0 ,认为可以进行读操作,但此时队列里并没有任何可读数据。

(默认初始reader_index - writer_index = 1)

同理读时先进行reader_index-1,此时writer发现reader_index - writer_index != 1认为存在可写的空间便进行写操作,则会造成reader并未读出数据被writer进行了写覆盖。

补充知识:乱序执行:乱序执行(out-of-order execution)是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理的技术。比方Core乱序执行引擎说程序某一段有7条指令,此时CPU将根据各单元电路的空闲状态和各指令能否提前执行的具体情况分析后,将能提前执行的指令立即发送给相应电路执行。

这好比请A、B、C三个名人为晚会题写横幅“春节联欢晚会”六个大字,每人各写两个字。如果这时在一张大纸上按顺序由A写好"春节"后再交给B写"联欢",然后再由C写"晚会",那么这样在A写的时候,B和C必须等待,而在B写的时候C仍然要等待而A已经没事了。

但如果采用三个人分别用三张纸同时写的做法, 那么B和C都不必须等待就可以同时各写各的了,甚至C和B还可以比A先写好也没关系(就象乱序执行),但当他们都写完后就必须重新在横幅上(自然可以由别人做,就象CPU中乱序执行后的重新排列单元)按"春节联欢晚会"的顺序排好才能挂出去。

由于上述原因,内核中引进了内存屏蔽(membarrier)的概念,在多核中有某一核发出来内存屏蔽,则其他核对该内存段的所有读写操作全部停止,也有barrier之后的c代码对应的汇编,不能跑到barrier之前去。(上述为老版本的membarrier,新版本的membarrier在每个内核中存在可选择性的遵循该规则。)

某一内核在进行读和写之后都进行一个类似fence的指令,待所有操作完成后进行解除。

若有偏差希望指出,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

What’smean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值