linux 内核同步互斥技术之cache 伪共享和隐含内存屏障

2023-12-20

隐含内存屏障

内核的有些函数隐含内存屏障。
(1)获取和释放函数。
(2)中断禁止函数。

1.获取和释放函数
获取( acquire)函数包括如下。
(1)获取锁的函数。锁包括自旋锁、读写自旋锁、互斥锁、信号量和读写信号量。
(2) smp_load_acquire(p):加载获取。
(3) smp_cond_load_acquire(ptr, cond_expr):带条件的加载获取。

获取操作隐含如下。
(1)获取操作后面的内存访问操作只能在获取操作完成之后被观察到。
(2)获取操作前面的内存访问操作可能在获取操作完成之后被观察到。

释放(release)函数包括如下。
(1)释放锁的函数。
(2) smp_store_release(p, v):存储释放。

释放操作隐含如下。
(1)释放操作前面的内存访问操作必须在释放操作完成之前被观察到。
(2)释放操作后面的内存访问操作可能在释放操作完成之前被观察到。

获取操作和释放操作都是单向屏障。

有返回值的atomic操作
主要指以下方法:
xchg();
cmpxchg();
atomic_cmpxchg();
atomic_inc_return();
atomic_dec_return();
atomic_add_return();
atomic_sub_return();
atomic_inc_and_test();
atomic_dec_and_test();
atomic_sub_and_test();
atomic_add_negative();
atomic_add_unless();    /* when succeeds (returns 1) */
test_and_set_bit();
test_and_clear_bit();
test_and_change_bit();
而这些方法是不隐含内存屏障的:
atomic_set();
set_bit();
clear_bit();
change_bit();
atomic_add();
atomic_sub();
atomic_inc();
atomic_dec();

2.中断禁止函数
禁止中断和开启中断的函数只充当编译器优化屏障。

cache 伪共享

我们熟悉了MESI状态的转换的之后,我们来看cache伪共享就简单多了。什么是cache伪共享呢?其实,我们知道一个cache line的大小是32字节或者64字节,如果两个频繁访问的数据A和B,他们共处在一个cache line里面,然后不同的CPU都在频繁的访问A或者B的数据,那么就会带来性能上的问题,可能这个cache line的状态要频繁的变来变去,造成一种无畏的颠簸,我们知道MESI本质上是要消耗系统内部总线的带宽的,你一个cache line的状态老是频繁的变来变去,总线带宽都被你消耗了不少,当然会引起性能的问题,所以,这个叫做cache伪共享(英文叫做false sharing)。
伪共享的避免:
第一个案例是cache的伪共享的避免。避免的方法主要有两个。
第一个是:一些常用的数据结构在定义时就约定数据结构以一级缓存对齐。例如使用如下的宏来让数据结构首地址以L1 cache对齐。下面这个宏是利用了GCC的特性,_attribute的属性,来让数据结构的起始地址以某个数字对齐,这里是以L1 cache对齐。

第二个是:数据结构中频繁访问的成员可以单独占用一个高速缓存行,或者相关的成员在高速缓存行中彼此错开,以提高访问效率。
例如struct zone数据结构使用ZONE_PADDING技术(填充字节的方式)来让频繁访问的成员在不同的cache line中。

所以,cache伪共享,在有些情况下是性能杀手,而且你又比较难去发现它,所以需要我们编程的时候,特别注意。你写的数据结构里,有没有可能出现 不同的CPU核心频繁访问某些成员,导致cache伪共享的?这个需要写程序的时候就要思考清楚。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux 内核同步互斥技术之cache 伪共享和隐含内存屏障 的相关文章

  • 我应该使用哪个 Linux 发行版作为 Xen 主机? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我为家庭办公室订购了一台服务器 我想用 Xen 对其进行分区 我认为这将使事情保持干净并且更容易维护 我将运行 MySQL PostgreSQL
  • 无关的库链接

    我有一个可能有点愚蠢的问题 因为我很确定我可能已经知道答案了 假设你有静态库A 动态共享库B和你的linux下的程序C 假设库 A 调用库 B 中的函数 并且您的程序调用库 A 中的函数 现在假设 C 在 A 中调用的所有函数都不使用 B
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 如何确保 numpy BLAS 库可用作动态加载库?

    The theano安装文档 http www deeplearning net software theano install html troubleshooting make sure you have a blas library指
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • python:numpy 运行脚本两次

    当我将 numpy 导入到 python 脚本中时 该脚本会执行两次 有人可以告诉我如何阻止这种情况 因为我的脚本中的所有内容都需要两倍的时间 这是一个例子 usr bin python2 from numpy import print t
  • 如何成功使用RDAP协议代替whois

    我对新的 RDAP 协议有点困惑 也不知道何时进一步追求它有意义 在我看来 每个人都同意它是 whois 的继承者 但他们的数据库似乎是空的 在 ubuntu 上我尝试了 rdapper nicinfo 甚至他们的 RESTful API
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 如何让 clangd 转向 c++20

    当没有其他信息时 如何让 clangd 回退到 c 20 例如 在第一次构建之前 cmake 可以生成一个 这是在带有最新 LLVM 的 Arch Linux 上 这是通过 Emacs LSP 运行的 但这应该没有什么区别 你可以加 Com
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • Composer 安装要求

    我正在尝试将 Composer 安装到 Laravel 项目中 当我做的时候sudo composer install在项目目录中它显示了两个错误 Problem 1 Installation request for simplesoftw
  • Docker:处理 tar 文件时出错(退出状态 1):设置枢轴目录时出错:不是目录

    我是 Docker 新手 不知道是什么原因导致此错误或如何诊断它 任何有关此问题的具体帮助或有关首先检查何处以诊断此类问题的提示将不胜感激 我的 Dockerfile FROM java 8 Install maven RUN apt ge
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7

随机推荐

  • nuxt学习笔记

    主要看的课程1 课程1 课程2 上手简化版 初始化 1 创建项目 使用官方推荐的npx来安装 npm的5 2 x版本后默认安装了npx 首先 确保您已经安装了 yarn npx 默认包含在 npm v5 2 中 或 npm v6 1 使用
  • 性能测试:Jmeter压测过程中的短信验证码读取

    问题背景 现如今国内的大部分软件或者网站应用 普遍流行使用短信业务 比如登录 注册以及特定的业务通知等 对于这些业务 在使用Jmeter进行性能测试的过程中 就会需要自动获取和填入短信验证码 否则性能流程无法进行下去 由于绝大多数的系统其短
  • Python_Tkinter和OpenCV模拟行星凌日传输光度测定

    传输光度测定 在天文学中 当相对较小的天体直接经过较大天体的圆盘和观察者之间时 就会发生凌日 当小物体移过较大物体的表面时 较大物体会稍微变暗 最著名的凌日是水星和金星对太阳的凌日 借助当今的技术 天文学家可以在凌日事件期间探测到遥远恒星光
  • 异步FIFO设计之格雷码

    目录 二进制转格雷码 格雷码转二进制 相邻的格雷码只有1bit的差异 因此格雷码常常用于异步fifo设计中 保证afifo的读地址 或写地址 被写时钟 或读时钟 采样时最多只有1bit发生跳变 在不考虑路径延时的情况下 因为源数据 读写地址
  • JMeter 性能测试基本过程及示例

    jmeter 为性能测试提供了一下特色 jmeter 可以对测试静态资源 例如 js html 等 以及动态资源 例如 php jsp ajax 等等 进行性能测试 jmeter 可以挖掘出系统最大能处理的并发用户数 jmeter 提供了一
  • 【已解决】Redis序列化反序列化不一致 - String类型值多了双引号问题

    在项目中使用spring 的RedisTemplate从redis中获取数据的时候 发现字符串的value多了双引号 如下图所示 产生的原因可以分一下几个方面 一 采用的序列化对象不同 多服务之间调用时候 序列化服务A 向redis中写数据
  • 微服务常见的配置中心简介

    微服务架构中 常见的配置中心包括以下几种 Spring Cloud Config Spring Cloud Config是官方推荐的配置中心解决方案 它支持将配置文件存储在Git SVN等版本控制系统中 通过提供RESTful API 各个
  • 漏洞复现-亿赛通任意文件读取漏洞(附漏洞检测脚本)

    免责声明 文章中涉及的漏洞均已修复 敏感信息 均已做打码处理 文章仅做 经验分享 用途 切勿当真 未授权的攻击属于非法行为 文章中 敏感信息 均已做多层打马处理 传播 利用本文章所提供的信息而造成的任何直接或者间接的后果及损失 均由使用者本
  • 行业追踪,2023-12-20

    自动复盘 2023 12 20 凡所有相 皆是虚妄 若见诸相非相 即见如来 k 线图是最好的老师 每天持续发布板块的rps排名 追踪板块 板块来开仓 板块去清仓 丢弃自以为是的想法 板块去留让市场来告诉你 跟踪板块总结 成交额超过 100
  • 加速Scrum敏捷转型的必选培训机构

    针对敏捷转型培训 有一些知名的培训公司提供专业的敏捷培训课程和认证 以下是几家备受认可的敏捷转型培训公司 Leangoo领歌 Leangoo领歌是一款 永久免费的专业的敏捷开发管理工具 提供端到端敏捷研发管理解决方案 包括 小型团队敏捷开发
  • 【开题报告】基于SpringBoot的工资管理系统

    1 研究背景 基于SpringBoot的工资管理系统的选题背景主要可以从以下几个方面来考虑 1 企业运营管理需求 在现代企业中 薪资管理是人力资源管理的重要组成部分 直接影响到员工的工作积极性和企业的运营成本 随着企业规模的扩大和业务复杂性
  • Docker:容器化技术的革命者

    Docker介绍 随着云计算和虚拟化技术的不断发展 容器化技术逐渐成为了一种主流的部署和运行应用的方式 而在这个领域中 Docker无疑是最具影响力和最受欢迎的容器化技术之一 本文将介绍Docker的基本概念 优势以及应用场景 一 Dock
  • 基于SpringBoot的网上订餐系统的设计与实现

    一 选题背景 国内研究背景 互联网的发展为人们的生产 生活带来了许多便利 传统餐饮业和产业服务采用互联网技术 让整个餐饮业在转型过程中少走了弯路 取得了更好的发展 1 发达国家的 O2O 模式已经非常成熟 OpenTable 是美国目前市场
  • Temu诉讼为公关手段?出海警惕恶性竞争!

    在国内流量见顶 人口红利接近尾声时 国内企业出海谋发展 已是必然 因此 以Temu与Shein为代表的跨境电商平台 也成为这个赛道的新生力量 正在带领我国企业奔向星辰大海 不过 虽然各大巨头角逐的市场更为宽广 但是面临的市场竞争同样激烈 例
  • 如何有效获取APP新增用户

    在提升APP用户获取效果方面 有几个关键策略可以考虑 市场定位与目标用户明确 在推广过程中 确保清晰地了解你的目标用户是谁 以便有针对性地开展推广活动 对用户的需求和偏好有深入了解 可以更好地制定吸引用户的策略 引人入胜的营销策略 设计有吸
  • 【知识分享】Java实现“羊了个羊”的思路和代码

    羊了个羊 是一款近期流行的消除类游戏 其核心玩法是通过交换两张卡片来使三张相同的卡片连成一条线进行消除 以下是一个简单的Java实现思路和代码示例 首先 我们需要定义一个表示卡片的类 public class Card private St
  • 使用ASPOSE在一个word文件的自定义标记处插入另一个word

    package mycmf office import java io File import java io FileInputStream import java io IOException import java io InputS
  • 业界翘楚!百望云斩获钛媒体“年度最佳企业服务品牌”大奖

    近日 由钛媒体集团主办的2023 T EDGE全球创新大会暨EDGE AWARDS创新评选在北京隆重举办 会上 钛媒体重磅发布了2023 EDGE AWARDS全球创新评选榜单 百望云凭借 据全球知名咨询公司弗若斯特沙利文报告 百望云在20
  • 基于Python+django短视频推荐系统

    1 1 研究背景和意义 社会经济水平的发展带动了网络技术的发展 网上的信息越来越多 在如今人们基本离不开互联网 人们在网上浏览各种信息 眼花缭乱 很难从这种背景下找到自己感兴趣的信息 既浪费人们的大量时间 也没有任何体验感 信息也越来越难展
  • linux 内核同步互斥技术之cache 伪共享和隐含内存屏障

    隐含内存屏障 内核的有些函数隐含内存屏障 1 获取和释放函数 2 中断禁止函数 1 获取和释放函数 获取 acquire 函数包括如下 1 获取锁的函数 锁包括自旋锁 读写自旋锁 互斥锁 信号量和读写信号量 2 smp load acqui