作为编写驱动程序代码的一部分,我遇到过使用内存屏障(fencing)的代码。通过Google阅读和浏览后,了解了它在SMP中的使用和帮助原因。考虑到这一点,在多线程编程中,我们会发现许多存在记忆竞争的实例,并且在所有地方放置屏障将花费系统CPU。我想知道如何:
我知道使用公共内存访问数据的特定代码路径,在所有这些地方是否需要内存屏障?
任何可以帮我识别这些陷阱的具体技巧或提示?
这是非常通用的问题,但希望深入了解其他人的经历以及有助于识别此类陷阱的任何提示。
答案 0 :(得分:1)
设备硬件通常对设备寄存器的写入顺序很敏感。现代系统是弱耦合的,并且通常在CPU和存储器之间具有写入组合硬件。
假设您编写了32位对象的单个字节。写组合硬件中的内容现在是A _ _ _。硬件不是立即启动读/修改/写周期来更新A字节,而是设置定时器。希望CPU在定时器到期之前发送B,C和D字节。定时器到期,写入组合寄存器中的数据被转储到内存中。
设置屏障会导致写入组合硬件使用它所具有的功能。如果仅占用插槽A,则只写入插槽A.
现在假设硬件期望以严格的顺序A,C,B,D写入字节。没有预防措施,硬件寄存器以错误的顺序写入。结果就是你所期望的:准备好了!火!瞄准!
应明智地放置障碍,因为不正确的使用会严重影响性能。并非每个设备写入都需要屏障;要求做出判断。