码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 你觉得好的代码可能并不是最优的解决方案


    晚上我看到了JeffXie 写了一篇关于内存屏障的文章,后面又看到Linus对一次内存屏障修改的建议,所以就有了这篇文章。

    https://mp.weixin.qq.com/s/H7Pw8xCKcNu41UGaYB648w

    在我看来,内存屏障谁为了让计算机做更加正确的事情,不希望计算机对计算进行排序导致结果不符合预期。

    1189418272966bfc605ec1eacb345421.png

    因为是多核计算机,所以会对上面的计算进行指令排序,说指令排序可能觉得拗口,可以认为多核计算的顺序是随机的,随机的执行就会导致随机的结果。

    随机的执行结果肯定不符合我们的预期。

    —— 所以就出现了内存屏障

    内存屏障如果理解简单一些,可以认为是写优先,读次之,因为是对同一片内存「同一个变量」操作。

    加了内存屏障的标志,多个cpu之间互相可见,比如cpu1要对变量a操作,如果加了内存屏障其他cpu也会看到cpu1的这个执行指令,就会先等cpu1完成后再去读。

    f0a2645efa77cd57ada643b032fdfcba.png

    最近的一个关于内存屏障的提交,被Linus驳回重写

    提交的理由和代码修改如下

    Mikulas是这部分的代码的修改提交,他首先提出了自己的疑问,在wait_on_bit这个函数里面加上内存屏障是否合适?

    他觉得应该加上内存屏障的原因是因为这个函数在其他地方要调用,在一些weak memory ordering架构上,这个函数有可能返回无效的值。

    关于weak memory ordering 我认为是对指令的一种排序,如果在排序不恰当的架构上,就有可能引起问题。

    之后就是

    ed0a51af11cbfc6fdd353613a87b084a.png

    之后就是Linus的建议

    首先这是一个基础的接口函数,这个问题在x86上是没有问题的。

    之后又说明了内存屏障是不能轻易使用的,要正确的使用它,你为什么还视图提交这方面的comments。

    b05ca5cd08467da1dae08464dbc59949.png

    其中提到的修改建议最后被使用在最新的内核代码中,就是重新写一个test_bit_acquire()函数。

    而新的函数里面有一个函数是 smp_load_acquire(),这个函数我查了很多资料,最后我自己的理解是,获取这个地址是否有在被其他cpu写,如果没有,就表示当前的cpu可以使用这个地址的值。

    可以认为是内存屏障更加精细的函数操作。

    9d899883b9e9538c916b0f256a0ee3cc.png

    ——最后的修改如下

    c3f98287ec7a309e921990d867279654.png

    695feb17b2aa6cb94c171f36aed19919.png

    关于如何正确只用内存屏障,下面的文章会非常适合大家

    https://mp.weixin.qq.com/s/d8UwmHzTxKICN3HvGnbdHQ

    参考:

    https://lkml.org/lkml/2022/8/25/1225

    https://www.kernel.org/doc/Documentation/memory-barriers.txt

    http://vh21.github.io/linux/2015/04/25/linux-barrier-api.html

    63aa2939ccdc7ed2cc0b7c66f1d65056.jpeg

    56831ed2c1e57eddc67b62dc634c95aa.gif

  • 相关阅读:
    天锐绿盾加密软件——企业数据防泄密-CAD图纸、文档、源代码加密管理系统@德人合科技
    Arduino框架下通过TFT_eSPI库驱动ESP32+合宙1.54“ 电子墨水屏(e-paper)显示
    第八章 动态规划 5 AcWing 1591. 快速排序
    【C++】继承 -- 详解
    MIT6.5830 Lab0-Go tutorial实验记录(三)
    C++ Reference: Standard C++ Library reference: C Library: cctype: isgraph
    竞赛选题 身份证识别系统 - 图像识别 深度学习
    【原创】解决Kotlin无法使用@Slf4j注解的问题
    技术科普:汽车开放系统架构AUTOSAR
    C语言工程调用C++库解决方案
  • 原文地址:https://blog.csdn.net/weiqifa0/article/details/126576743
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号