【深入理解Linux内核锁】一、内核锁的由来

news/2024/11/23 5:38:58/
img
我的圈子: 高级工程师聚集地
我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司!
创作理念:专注分享高质量嵌入式文章,让大家读有所得!
img

文章目录

    • 1、并发和竞态
    • 2、竞态发生的场合
    • 3、编译乱序和执行乱序
      • 3.1 编译乱序
      • 3.2 执行乱序
        • 3.2.1 多CPU之间
        • 3.2.2 单CPU内部
    • 4、总结

img
 
Linux设备驱动中,我们必须要解决的一个问题是:多个进程对共享资源的并发访问,并发的访问会导致竞态。

 

1、并发和竞态

并发(Concurrency):指的是多个执行单元同时、并行的被执行。

竞态(RaceConditions):并发执行的单元对共享资源的访问,容易导致竞态。

共享资源:硬件资源和软件上的全局变量、静态变量等。

 

解决竞态的途径是:保证对共享资源的互斥访问。

互斥访问:一个执行单元在访问共享资源的时候,其他执行单元被禁止访问。

临界区(Critical Sections):访问共享资源的代码区域成为临界区。临界区需要以某种互斥机制加以保护。

常见的互斥机制包括:中断屏蔽,原子操作,自旋锁,信号量,互斥体等。

 

2、竞态发生的场合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-22GWyopk-1686191322786)(https://image-1305421143.cos.ap-nanjing.myqcloud.com/image/image-20230511140139520.png)]

  1. 多对称处理器(SMP)的多个CPU之间

多个CPU使用共同的系统总线,可以访问共同的外设和存储器。在SMP的情况下,多核(CPU0、CPU1)的竞态可能发生于:

  • CPU0的进程和CPU1的进程之间
  • CPU0的进程和CPU1的中断之间
  • CPU0的中断和CPU1的中断之间

 

  1. 单CPU内,该进程与抢占它的进程之间

在单CPU内,多个进程并发执行,当一个进程执行的时间片耗尽,也有可能被另一个高优先级进程打断,会发生竞态。

 

  1. 中断(软中断、硬中断、Tasklet、底半部)与进程之间

当一个进程正在执行,一个外部/内部中断(软中断、硬中断、Tasklet等)将其打断,会导致竞态发生。

 

3、编译乱序和执行乱序

除了并发访问导致的竞态外,还需要了解编译器和处理器的一些特点所引发的一些问题。

3.1 编译乱序

现代的高性能编译器在目标代码优化上都具有乱序优化的能力,编译器为了尽量提高Cache命中率以及CPU的Load/Store单元的工作效率,可以对访存的指令进行乱序,减少逻辑上不必要的访存。

因此,在打开编译器优化后,生成的汇编码并没有严格按照代码的逻辑顺序执行,这是正常的。

为了解决编译乱序的问题,可以加入barrier()编译屏障

该屏障可以阻挡编译器的优化。设置屏障的前后,可以保证执行的语句不乱。

加入barrier()编译屏障,即可保证正确的执行顺序。

例子:

#define barrier() __asm__ __volatile__("": : :"memory")int main(int argc,char *argv[])
{int a = 0,b,c,d[4096],e;e = d[4095];barrier();b = a;c = a;return 0;
}

 

3.2 执行乱序

编译乱序是编译器的行为,而执行乱序就是处理器运行时的行为。

**高级的CPU往往会根据自身的缓存特性,将访存指令重新排序执行!**这样就导致了多个顺序的指令,后发的指令仍有可能先执行完毕。

这种执行乱序,在多个CPU之间,以及单个CPU内部,都是非常常见的。

3.2.1 多CPU之间

处理器为了解决多核之间,一个CPU的行为对另一个CPU可见的情况,ARM处理器引入了内存屏障指令:

  • DMB(数据内存屏障),保证在该指令前的所有指令,内存访问完成,再去访问该指令之后的访存动作
  • DSB(数据同步屏障),保证在该指令前的所有访存指令执行完毕(访存,缓存,跳转预测,TLB维护等)完成
  • ISB(指令同步屏障),Flush流水线,保证所有在ISB之后执行的指令都是从缓存或者内存中获得。

 

3.2.2 单CPU内部

在单CPU中,我们常遇到访问外设寄存器时,某些外设寄存器就对读写顺序有很高的要求,为了避免执行乱序的发生,这时候就需要CPU的一些内存屏障指令了。

CPU内部,为了解决这种问题,CPU提供了一些内存屏障指令:

可以参考Documentation/memory-devices.txtDocumentation/io_ordering.txt

  • 读写屏障:mb()
  • 读屏障:rmb()
  • 写屏障:wmb()
  • 寄存器读屏障__iormb()__
  • 寄存器写屏障__iowmb()__
#define writeb_relaxed(v,c)	__raw_writeb(v,c)
#define writew_relaxed(v,c)	__raw_writew((__force u16) cpu_to_le16(v),c)
#define writel_relaxed(v,c)	__raw_writel((__force u32) cpu_to_le32(v),c)#define readb(c)		({ u8  __v = readb_relaxed(c); __iormb(); __v; })
#define readw(c)		({ u16 __v = readw_relaxed(c); __iormb(); __v; })
#define readl(c)		({ u32 __v = readl_relaxed(c); __iormb(); __v; })#define writeb(v,c)		({ __iowmb(); writeb_relaxed(v,c); })
#define writew(v,c)		({ __iowmb(); writew_relaxed(v,c); })
#define writel(v,c)		({ __iowmb(); writel_relaxed(v,c); })

writelwritel_relaxed的区别就在于有无屏障。

 

4、总结

由上文可知,为了解决

  1. 并发导致的竞态问题
  2. 高性能的编译器编译乱序问题
  3. 高性能的CPU带来的执行乱序问题

CPUARM处理器提供的内存屏障指令等,这也是内核锁存在的意义。

点赞+关注,永远不迷路

img
欢迎关注 公号&星球【嵌入式艺术】,董哥原创!

http://www.ppmy.cn/news/274916.html

相关文章

互联网智慧旅游云平台项目解决方案

后台回复“0916”,可下载该PPT。 资料已经上传至「智能交通技术」知识星球,加入星球后可下载。 欢迎加入智能交通技术群! 联系方式:微信号18515441838

万豪参加进博会品牌+目的地策略继续深耕中国市场;加利福尼亚乐高乐园和法拉利推出互动式景点项目 | 全球旅报...

万豪国际第四次参与进博会 品牌目的地策略继续深耕中国市场。新品牌AC明年亮相。进入9个新目的地,助力国内游。MOXY签约数量稳步增长,布局年轻化市场。 爱彼迎柏思齐:旅行回归实为旅行变革,稳中迎变才能引领复苏。爱彼迎发布了202…

阿维塔陪伴用户悦己而行,与用户共创悦己生活

在2023上海国际车展上,阿维塔举办品牌升级发布会,而此次它的主题是“情感智能,悦己同行”。按照当前阿维塔的发展战略而言,在今年下半年,它将进一步深化与华为之间的战略合作,在2024年年底之前,…

乐玩差旅:专注垂直目的地市场的妙知旅

吴琼 随着从用户社区、机票、酒店类切入旅游市场机会越来越小,目的地市场资源的整合成了在线旅游角逐的新大陆;另一方面讲,ADS(指定旅游目的地协议)框架的宽松化也为出境自助游释放了更多的空间。妙知旅即专注于垂直目…

如何打造高品质的文旅夜游项目

文旅夜游是一个相关性高、渗透性强、易融合、驱动力大的综合性产业。充分发挥文旅对各行各业的渗透作用,使第三产业能够有效推动第一产业和第二产业的发展,对城市经济建设具有重要意义。夜游是目前最热门的旅游形式,创造夜游产品,…

旅游出行 APP 哪家强?

随着人们的生活水平的提高,旅游出行已经在越来越多人的年中计划里。据相关数据统计,2014年国民旅游意愿强烈,有超过99%的人计划出游,51%的人选择出游3次或以上;95%的消费者会增加旅游预算或保持不变,1/3的人…

null、undefined、NaN的区别。它们之间的隐式转换和全等结果又是什么?

前言 在 JavaScript 中,null、undefined 和 NaN 是三种不同的特殊值,它们在使用时有着不同的含义和用途。而我们在做项目时候,常常与它们打交道。 因此,在编写 JavaScript 代码时需要了解它们之间的区别和相互之间的隐式转换&am…

携程、艺龙、酷讯演绎在线旅游三国志

携程、艺龙、酷讯演绎在线旅游三国志 文/王易见 在线旅游目前最热门的话题可能非“酷讯屏蔽携程”这一新闻事件莫属了。在此次事件中,有人认为是携程不同意酷讯收录携程信息,所以主动法律函要求酷讯停止搜录其产品信息的,也有人认为是酷讯主动…