Linux 内核缓存一致性相关机制和接口梳理

From 程序员秘书

缓存一致性是一个非常关键的问题,特别是在多核处理器和直接内存访问(DMA)场景下。原因如下:

  • 多核CPU与cache的缓存一致性问题:每个CPU core都有自己的cache,由于cache的写回机制,部分数据可能没有及时更新到内存,就会导致出现不同线程访问同一个变量时出现值不一致的情况。
  • DMA与cache的缓存一致性问题:DMA对内存的访问不需要经过CPU,因此如果DMA修改了内存上的数据,而CPU的cache中并不知道内存已经修改了,从而会导致出现缓存不一致的情况。

因此就需要有机制和接口来确保缓存的一致性。

应对策略

  • 写传播(Write Propagation):当某个CPU core里的Cache数据更新时,必须传播到其他core的Cache,以确保数据的一致性。
  • 事务的串行化(Transaction Serialization):确保不同核心看到的其他core对于代码的执行顺序是一致的。通常通过引入“锁”来实现,只有获得锁的CPU core才能对数据进行更新。
  • 实现uncached​:针对特定硬件,特定场景不进行cached​,可以理解为bypass cache,从而避免缓存一致性问题出现​。

应对机制

  • 缓存一致性互联(如CCI-400):在Linux+ARM 架构平台中,会通过如CCI-400等硬件提供互联和一致性功能,确保不同处理器和I/O设备之间的数据一致性。其通过缓存一致性协议MESI实现互联。MESI代表四种状态:Modified(修改)、Exclusive(独占)、Shared(共享)和Invalid(无效),该协议通过状态机机制降低了总线带宽压力。

  • DMA一致性映射:Linux内核提供了dma_alloc_coherent等函数来申请一片uncached的内存,这样DMA和CPU可以直接访问该内存区域,无需考虑数据一致性问题。

  • IO空间映射:对于寄存器地址空间,Linux内核可以通过ioremap等函数将其映射到内核空间,并配置为uncached,以确保CPU读取的是最新的寄存器值。

  • 缓存刷新和失效:在Linux内核中,可以通过部分机制(如内存屏障、锁等)来间接确保缓存的一致性。另外,某些硬件平台可能也提供了缓存刷新和失效的指令或接口,在实际应用中,应该根据具体的硬件平台和需求选择合适的机制和接口来确保缓存的一致性。

From 程序员秘书

数据缓存(DCache)刷新接口

  • flush_dcache_page: 用于刷新指定页的高速缓存,确保CPU缓存与主存数据一致。通常用于直接内存访问(DMA)前的操作。
  • flush_cache_mm, flush_cache_range, flush_cache_vmap: 这些函数分别用于刷新整个内存描述符(mm_struct)关联的缓存、指定地址范围内的缓存以及虚拟映射区域的缓存。这些操作在特定的硬件交互和内存管理操作中非常有用。
  • 如部分ARM架构平台,如果已经支持和提供了刷新缓存的指令,我们就可以通过内联汇编自己封装实现一个函数。内联汇编可参见之前文章《Linux+ARM内联汇编》

=========================

From 程序员秘书

附,其他一些缓存概念和机制

syncsync_file_range

  • sync: 此系统调用会将所有修改过的缓冲区数据(包括文件系统元数据和脏页缓存)同步到磁盘上。它是一个同步操作,确保所有写操作已经完成,这对于确保数据持久性非常重要。在C程序中,可以通过调用 sync() 函数实现。

  • sync_file_range: 提供了更细粒度的控制,允许指定某个文件描述符和文件内的偏移范围进行同步。这对于大型文件的部分更新非常有用,可以减少不必要的I/O操作。使用时,需要包含 <linux/fs.h> 头文件,并调用 sync_file_range(fd, offset, nbytes, flags) 函数。

Inode和页缓存刷新

  • invalidate_inode_pages: 用于标记inode关联的页缓存无效,通常在删除文件或重命名操作前使用,确保后续读取时不会使用到已废弃的缓存数据。
  • writeback_invalidate_inode_pages: 强制inode关联的脏页回写到磁盘并从页缓存中移除,适用于需要立即释放文件占用资源的场景。

Slab分配器缓存刷新

  • kmem_cache_flush: 清理slab分配器管理的小对象缓存,这在模块卸载或需要清空特定缓存池时很有用。

工作队列刷新

  • flush_workqueue: 刷新指定工作队列中的所有待处理任务,有助于清理由这些任务管理的状态或缓存。这对于确保任务执行的即时性和一致性很重要。

Drop Caches机制

  • /proc/sys/vm/drop_caches: 通过向这个文件写入特定值(如1、2或3),可以分别丢弃页面缓存、目录项缓存(dentries)和inode缓存。这是一个非常激进的措施,通常仅在非常清楚其后果的情况下使用,以应对极端的内存压力情况。

使用注意事项

  • 使用这些接口和机制时,必须谨慎,因为它们可能对系统性能产生严重影响,特别是在I/O密集型应用中。
  • 对于生产环境,除非明确知道所需的效果和潜在风险,否则不推荐直接使用这些底层接口。
  • 在进行任何刷新操作前,确保理解其对系统状态和性能的潜在影响,并考虑是否有必要采取其他优化措施来缓解内存或I/O问题。

From 程序员秘书

=========================

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI助力科研:自动化科学构思生成系统初探

科学研究作为推动创新和知识进步的关键活动&#xff0c;在解决复杂问题和提升人类生活水平方面发挥着至关重要的作用。然而&#xff0c;科学研究的固有复杂性、缓慢的进展速度以及对专业专家的需求&#xff0c;限制了其生产力的提升。为了增强科研效率&#xff0c;本文提出了一…

力扣78 子集

给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1,2],[3],…

Linux使用pthread多线程时cmake新增语句

https://cmake.org/cmake/help/latest/module/FindThreads.html 在子文件夹中的CMakeList.txt&#xff1a; aux_source_directory(. DIR_SUB_SRCS) add_library(echatlib SHARED ${DIR_SUB_SRCS}) # STATIC SHARED# 方法一 find_package(Threads REQUIRED) target_link_librar…

鸿蒙开发Ability Kit(程序框架服务):【FA模型绑定Stage模型ServiceExtensionAbility】

FA模型绑定Stage模型ServiceExtensionAbility 本文介绍FA模型的三种应用组件如何绑定Stage模型的ServiceExtensionAbility组件。 PageAbility关联访问ServiceExtensionAbility PageAbility关联访问ServiceExtensionAbility和PageAbility关联访问ServiceAbility的方式完全相同…

重学java 84.Java枚举

那些你暗自努力的时光&#xff0c;终究会照亮你前行的路 —— 24.6.24 一、枚举介绍&#xff08;开发中表示状态&#xff09; 1.概述&#xff1a; 五大引用数据类型&#xff1a;类型、数组、接口、注解、枚举 2.定义&#xff1a; public enum 枚举类名{} 所有的枚举类父类…

集成Stata分布式事务

一.事务协调器TC 1&#xff0e;安装Seata-server 下载&#xff1a;https://github.com/seata/seata/tags 启动&#xff1a;seata-server.bat -p 8091 -h 127.0.0.1 -m file 关闭其他服务&#xff0c;先启动它 2&#xff0e;配置文件修改 二.主业务端TM 1&#xff0e;导入依赖…

贝锐花生壳内网穿透

贝锐花生壳内网穿透使用步骤 首先你得去官网购买一个域名配置一下内网穿透映射官网下载一个客户端修改代码配置 首先你得去官网购买一个域名 配置一下内网穿透映射 官网下载一个客户端 注意&#xff0c;一定要下载客户端&#xff0c;不然用不了 当然&#xff0c;本地我已经提前…

SpringBoot-配置文件中使用随机值和使用变量

1、配置文件中使用随机值 2.在配置文件使用引用变量 如果没定义还可以设置默认值

NIO(三) Selector使用(NIO综合)

Selector&#xff08;选择器&#xff09;能够管理一到多个Channel&#xff08;通道&#xff09;&#xff0c;监听通道是否为事件做好准备。 一&#xff0c;使用Selector的好处 只需少量线程来处理多个通道&#xff0c; 从而管理多个网络连接。 二&#xff0c;Selector示例 服务…

环境安装-GIT

下载 git官网下载 https://git-scm.com/ 安装 点击下载的安装包&#xff0c;并点击下一步 选择安装路径&#xff0c;照例改选自定义路径 选择默认的即可 选择GIT编辑器&#xff0c;默认选择vim即可 设置初始化新项目(本地仓库)的主分支名&#xff0c;按默认即可&#xff0c;点…

keysight 34901A (安捷伦)多路复用器

34970A 数据采集/开关单元的 Keysight 34901A&#xff08;安捷伦&#xff09;模块是通用扫描中最通用的多路复用器。它将密集的多功能开关与 60 通道/秒的扫描速率相结合&#xff0c;可满足广泛的数据采集应用。两线和四线通道可以混合在同一模块上。两个额外的保险丝输入&…

Hadoop 面试题(八)

1. 在 Hadoop 集群的配置文件中有如下两个配置&#xff0c;请问假如集群中有一个节点宕机&#xff0c;主节点 namenode 需要多长时间才能感知到&#xff08;&#xff09; &#xff1f; dfs.heartbeat.interval 3heartbeat.recheck.interval 2000A&#xff1a;26秒 B&#xff1…

音频傅里叶变换(基于开源kissffs)

主要参考资料&#xff1a; 深入浅出的讲解傅里叶变换&#xff08;真正的通俗易懂&#xff09;: https://zhuanlan.zhihu.com/p/19763358 推荐开源项目&#xff1a;KISS FFT&#xff1a; https://blog.csdn.net/gitblog_00031/article/details/138840117 数字硅麦数据的处理&…

基于Java蛋糕甜品商城系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

LLama 3的各种微调:拿我司七月的paper-review数据集微调LLama 3

前言 llama 3出来后&#xff0c;为了通过paper-review的数据集微调3&#xff0c;有以下各种方式 不用任何框架 工具 技术&#xff0c;直接微调原生的llama 3&#xff0c;毕竟也有8k长度了 效果不期望有多高&#xff0c;纯作为baseline通过PI&#xff0c;把llama 3的8K长度扩展…

EDU学校漏洞sql注入挖掘记录

某搜索框 biaoti参数单引号报错 双引号正常 经过我的不断测试&#xff0c;’||exp(710)||’报错&#xff0c;exp函数就是执行e的多少次方&#xff0c;709不会报错&#xff0c;710会导致这个数太大报错 709正常,这里说明一下&#xff0c;因为这个数是小数所以返回200&#xff0c…

awk脚本监控

awk脚本监控 使用脚本监控内存&#xff0c;cpu和硬盘的根目录&#xff0c;超过80%提示用户&#xff0c;写成函数库的行&#xff0c;每天早上 的8.50分&#xff0c;执行一次脚本 现在脚本中写需要的内容 cpuu () {aa$(top -b -n 1 |awk NR3 {printf "%.F",$2$4})if …

Spring容器启动流程——refresh()单个方法分析

文章目录 Spring启动过程this()方法refresh()prepareRefresh()obtainFreshBeanFactory()prepareBeanFactory()postProcessBeanFactory()invokeBeanFactoryPostProcessorsregisterBeanPostProcessorsinitMessageSource()initApplicationEventMulticaster()onRefresh()registerLi…

Pycharm利用Anaconda环境

创建环境 conda create --name d2l python3.11 -y 激活环境 conda activate d2l 配置环境 以torch环境为例 我们可以按如下⽅式安装PyTorch的CPU或GPU版本&#xff1a; pip install torch pip install torchvision 我们的下⼀步是安装d2l包&#xff0c;以⽅便调取本书中经…

WPF 数据分组显示

WPF 数据分组显示 效果展示&#xff1a; Student类&#xff1a; public class Student {public string Name { get; set; }public string Class { get; set; }public int Age { get; set; } }MainWindow.xaml.cs public partial class MainWindow : Window {private Observ…