内核的竞态控制

本文详细探讨了内核中的竞态控制,包括自旋锁、互斥锁和信号量的使用。自旋锁适用于临界区较小的情况,防止中断访问;互斥锁则让无法进入临界区的执行单元进入睡眠状态,但无法阻止中断;信号量则常用于同步,允许一定数量的并发访问。在驱动开发中,自旋锁和互斥锁应用广泛,各有优缺点。
摘要由CSDN通过智能技术生成

内核的竞态控制

何谓竞态?用一句话描述就是:并行执行的多个程序,同时访问共享资源,或执行同一段代码,若这些行为是有害的则称此为竞态

1.解决机制

  • 现代soc大多是对称多处理器机制(SMP),每个核可以有自己的中断,自己的进程(宏观和微观都是并行)。如下
    这里写图片描述
    可以认为,SMP是竞态最复杂的情况了,单核竞态的复杂度真包含于SMP。由于驱动程序需要保证稳定性与普适性,所以最好一律按照SMP的情况来进行竞态控制
  • 解决竞态的途径,即:某个程序在访问共享资源时,禁止其他程序访问;执行同一段代码时,禁止其他程序也来执行。
  • 根本途径其实是使用ARM指令集中各种“屏障指令”,详细的指令就不展开了。这些指令是Linux中各种竞态控制手段的根本实现方式

2.辅助措施——中断屏蔽

中断屏蔽操作只能屏蔽本 CPU 内的中断,因此并不能解决 SMP多核引发的多个中断之间的竞态。故中断屏蔽一般和自旋锁、互斥锁配合使用

local_irq_disable() /* 屏蔽中断 */
. . .
/* 临界区*/
. . .
local_irq_enable() /* 开中断*/

/*下面是更推荐的方式*/
local_irq_save(flags)/*暂停中断*/
. . .
/* 临界区*/
. . .
local_irq_restore(flags)/*恢复中断*/
  • 长时间屏蔽中断是很危险的,有可能造成数据丢失乃至系统崩溃等后果。这就要求在屏蔽了中断之后,当前的内核执行路径应当尽快地执行完临界区的代码

3.原子操作

原子操作是一种简单的解决竞态的机制,保证了整数操作和位操作不被打断

  • 设置整形变量的值
void atomic_set(atomic_t *v, int i); 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值