gpt4 book ai didi

memory-management - 确定障碍物(栅栏)的使用位置

转载 作者:行者123 更新时间:2023-12-05 02:23:36 29 4
gpt4 key购买 nike

x86指令lfence/sfence/mfence用于实现Linux内核中的rmb()/wmb()/mb()机制。很容易理解,这些用于序列化内存访问。但是,在遇到运行时行为中的错误之前,在编写代码时确定何时何地使用它们要困难得多。

我很想知道在编写/审查代码时是否存在可以检查的已知警告,这可以帮助我们确定必须在何处插入障碍。我知道这太复杂了,但是是否有经验法则或 list 可以帮助我们确定需要这些的代码位置?

最佳答案

我的经验(不是在 Linux 内核中)是两种模式涵盖了绝大部分的防护需求。

模式“发送/接收”:线程 1 向线程 2 发送数据,并且有一个内存位置以某种方式指示“数据已准备好”。线程 1 至少需要在数据存储和存储到“数据已准备好”之间有一个屏障。线程 2 需要在表示“数据已准备好”的数据加载和数据加载之间建立一个 lfence。

如果传输中只涉及常规(不是非临时的,DMA 设备等)加载/存储,则只需要编译器栅栏。此外,以 LOCK 为前缀的指令意味着栅栏。例如,有时“数据已准备好”位置不仅仅是一个标志,而是一个原子计数器,用于操作它的以 LOCK 为前缀的增量/减量可以作为栅栏。

此模式还涵盖了自旋锁。释放锁是一个“发送”。获取锁是“receive”。

模式“共识”:两个线程必须就某事达成共识。必须有一个 mfence(或一个由 LOCK 前缀的指令暗示的)。围栏必须在“我发表了我的投票”和“我阅读了其他线程的投票”之间。 Dekker's protocol是一个例子。困难的部分是发现这种模式。我们曾经错过了 TBB 内部深处的一个问题,其中共识问题是“是否抛出了异常?”最终我们意识到这是一个共识问题,因此需要一个围栏。

以上两种模式是经验法则,并不能涵盖所有情况,但我发现它们涵盖了 99% 的情况。

关于memory-management - 确定障碍物(栅栏)的使用位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20446982/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com