Linux内核锁的那点事_第1页
Linux内核锁的那点事_第2页
Linux内核锁的那点事_第3页
Linux内核锁的那点事_第4页
Linux内核锁的那点事_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页Linux内核锁的那点事

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

1、并发和竞态

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

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

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

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

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

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

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

2、竞态发生的场合

image-20230511140139520

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

CPU0的进程和CPU1的进程之间CPU0的进程和CPU1的中断之间CPU0的中断和CPU1的中断之间单CPU内,该进程与抢占它的进程之间在单CPU内,多个进程并发执行,当一个进程执行的时间片耗尽,也有可能被另一个高优先级进程打断,会发生竞态。

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

3、编译乱序和执行乱序

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

3.1编译乱序

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

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

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

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

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

例子:

#definebarrier()__asm____volatile__("":::"memory")intmain(intargc,char*argv[]){inta=0,b,c,d[4096],e;e=d[4095];barrier();b=a;c=a;return0;}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.txt和Documentation/io_ordering.txt

读写屏障:mb()读屏障:rmb()写屏障:wmb()寄存器读屏障__iormb()__寄存器写屏障__iowmb()__#definewri(te)b_relaxed(v,c)__raw_writeb(v,c)#definewritew_relaxed(v,c)__raw_writew((__forceu16)cpu_to_le16(v),c)#definewritel_relaxed(v,c)__raw_writel((__forceu32)cpu_to_le32(v),c)#definereadb(c)({u8__v=readb_relaxed(c);__iormb();__v;})#definereadw(c)({u16__v=readw_relaxed(c);__iormb();__v;})#definereadl(c)({u32__v=readl_relaxed(c);__iormb();__v;})#definewriteb(v,c)({__iowmb();writeb_relaxed(v,c);})#definewritew(v,c)({__iowmb();writew_relaxed(v,c);})#definewritel(v,c)({__iowmb();writel_relaxed(v,c);})writel与writel_relaxed的区别就在于有无屏障。

4、总结

由上文可知,为了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论