内核中与驱动相关的内存操作之十(内存屏障)

2024-03-15 07:48

本文主要是介绍内核中与驱动相关的内存操作之十(内存屏障),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   虽然实际驱动中不常用,但是阅读内核比较深层的代码经常会遇到.为什么存在内存屏障呢?先看一下下面的场景:

    编译器和处理器为了提高效率,可能对读和写操作重新进行了排序,例如:

在某些处理器上,以下代码:

    A = 1;

 

    B = 2;

   有可能在A中存放新值之前就在B中存放新值.

   但是,我们在操作内存或者和硬件交互时,常常需要确保一个给定的顺序.所有可能重新排序和写的处理器提供了机器指令来确保顺序要求,同样也可以提示编译器不要对给定点周围的指令序列进行重新排序.这些确保顺序的指令叫做"屏障".

   内存屏障的存在意义就是为了解决编译器和处理器对代码的顺序访问问题.

   内核中用于内存屏障的API:

rmb():
    提供""内存屏障,确保跨越rmb()的载入动作不会发生重排序.就是说,rmb()之前的载入操作不会被重新排在rmb()之后去;
wmb():

    方法提供了""内存屏障,功能和rmb()函数类似.区别仅仅是针对存储而非载入--确保跨越屏障的存储不发生排序;

mb():

    提供了读屏障也提供了写屏障.相当于上述rmb()函数和wmb()函数的功能和.

read_barrier_depends():

  rmb()的变种,可以理解成rmb()一种优化.该屏障确保屏障前的读操作在屏障后的读操作之前完成,即那些相互依赖的读操作.

 实例:

   下面这个实例,其中a的初始值是1,b的初始值是2.

线程1         线程2a = 3;         -Mb();          -b = 4;       c = b;-          rmb();-          d = a;

    如果不使用内存屏障,c可能接受了b的新值,d接收了a原来的值.c可能等于4(我们期望的),d可能等于1(不是我们期望的).因此,针对一些有顺序要求的寄存器操作的话,内存屏障是必须考虑的.

这篇关于内核中与驱动相关的内存操作之十(内存屏障)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/811271

相关文章

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在