【Linux竞态】Linux内核提供解决竞态进行互斥访问的方法

Linux内核提供解决竞态进行互斥访问的方法?

产生竞态的条件:

  • 要有并发
  • 要有共享资源
  • 并发的执行单元要同时对共享资源进行访问
    • 共享资源:软件上的全局变量和硬件资源(小到一个bit,大到一个设备)
    • 互斥访问:多个执行单元对共享资源进行访问,只有一个执行单元在同一时刻能够访问

产生竞态的资源情形:

  • 对称多处理器(SMP):多个CPU之间共享内存,外存,系统IO,例如多个CPU同时访问同一个内存区域,必然会产生竞态。
  • 单个CPU的进程与进程之间的抢占,支持任务的抢占调度,如果一个进程的优先级高于另一个进程,进程间形成抢占调度,如果他们对共享资源进行访问,必然会产生竞态。
  • 进程在对共享资源进行访问的期间,可能被硬件中断或者软中断或者tasklet打断,所以如果这些硬中断的处理函数,软中断和tasklet的延后执行函数也对共享资源进行访问,也必然产生竞态。
  • 内核没有支持硬件中断的优先级,硬件中断和软中断,tasklet之间是存在优先级的,如果各自之间访问共享资源,也一定会产生竞态。

中断屏蔽:

  • 中断屏蔽可以解决以下场合的竞态问题:
    • 中断和中断
    • 中断和进程
    • 进程和进程之间的抢占
  • 适用于单CPU的竞态问题!
  • 使用的方法:
    • 在进入临界区之前关闭中断;
    • 执行临界区的代码;
    • 恢复关闭中断;
    • 内核提供关闭和打开中断的方法。

原子操作:

原子操作能够解决所用的竞态问题!

内核的原子操作:

内核使用内嵌会面,使用ldrex,strex原子指令,保证对数据的访问是原子的!

  • 位原子操作:如果在设备驱动中,进行位操作运算,并且考虑到避免竞态的问题,使用内核提供的位原子操作的相关方法。这些方法保证位操作的过程是原子的。
    • set_bit/clear_bit/change_bit/test_bit
  • 整形原子操作:整形原子变量的数据类型:atomic_t,本质上是一个结构体! 如果在设备驱动程序中,共享资源是一个整形变量的操作,并且考虑到竞态问题,一定要使用内核提供的整形原子操作的相关方法,保证操作的过程是原子的。
    • 内核提供整形原子变量的操作方法
//定义一个整形原子变量
atomic_t open_cnt = ATOMIC_INIT(1);//定义整形原子变量open_cnt,并且初始化为1
//内核提供原子的操作方法
atomic_set(&open_cnt, 2); //设置整形原子变量open_cnt的值为2
atomic_read(&open_cnt);//获取整形原子变量open_cnt的值
atomic_inc()
atomic_dec()
atomic_add()
atomic_sub()
  • 自旋锁:
    一种避免竞态的一种方法,但似乎一般用于进程与进程之间的抢占引起的竞态问题,对于中断和中断底半部引起的竞态问题无法处理,可以使用自旋锁结合关闭和开启中断的方式解决。这属于衍生自旋锁的使用。
  • 信号量:内核避免竞态的一种机制
    本质上是一个睡眠锁;
    在使用自旋锁时,要求临界区的代码的执行路径不能进行休眠操作,但是在某些场合,需要在临界区进行休眠操作,此时使用信号量,如果一旦获取信号量,临界区可以进行休眠操作
  • 互斥量:
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值