zoukankan      html  css  js  c++  java
  • DPDK(二):准备知识3 ---内存屏障

    一、简介
    1、什么是内存屏障?
    它是一个CPU指令。
    2、为什么使用内存屏障?
    CPU硬件设计为了提高指令的运行速度,增设了两个缓冲区(store buffer, invalidate queue)。这个两个缓冲区能够避免CPU在某些情况下进行不必要的等待,从而提快速度,可是这两个缓冲区的存在也同一时候带来了新的问题。

    编译器和CPU可以在保证输出结果一样的情况下对指令重排序,使性能得到优化。比如有的值在一个循环中,保存在寄存器中,没有被推倒cashe或者主内存中,这样其他进程根本看不到这个值。插入一个内存屏障,相当于告诉CPU和编译器先于这个命令的必须先执行,后于这个命令的必须后执行。
    3、作用
    a)确保一些特定操作执行的顺序; b)影响一些数据的可见性(可能是某些指令执行后的结果,强制更新一次不同CPU的缓存)。例如,一个写屏障会把这个屏障前写入的数据刷新到缓存,这样任何试图读取该数据的线程将得到最新值,而不用考虑到底是被哪个cpu核心或者哪颗CPU执行的。

    我们在定义volatile变量时,写操作后插入一个写屏障指令,在读操作前插入一个读屏障指令。
    4、对性能的影响
    内存屏障作为另一个CPU级的指令,没有锁那样大的开销。内核并没有在多个线程间干涉和调度。但凡事都是有代价的。内存屏障的确是有开销的——编译器/cpu不能重排序指令,导致不可以尽可能地高效利用CPU,另外刷新缓存亦会有开销。所以不要以为用volatile代替锁操作就一点事都没。

  • 相关阅读:
    父子组件的数据传递
    前端处理:elementUI 表格索引代表第几条数据
    qt的moc,uic,rcc命令的使用
    支持无限精度无限大数的类BigNumber实现
    二进制的妙用
    C#实现任意大数的计算和简单逻辑命题的证明——前言
    打磨程序员的专属利器——文本
    打磨程序员的专属利器——快捷键
    打磨程序员的专属利器——命令行&界面
    Linux命令全集
  • 原文地址:https://www.cnblogs.com/xiaomayi-cyj/p/10542946.html
Copyright © 2011-2022 走看看