自旋锁死锁

自旋锁内调用kmalloc或者copy_to_user之类的接口可能造成死锁。

这类函数的实现内有睡眠操作,睡眠时产生了进程调度,新的进程内如果也使用了该自旋锁,就会导致死锁。

 

这类问题非常普通,但很容易忽略;

屏蔽的方式:

1,使用get_free_page申请内存

2,对资源使用引用计数保护

3,使用互斥锁

转载于:https://www.cnblogs.com/kernel521/p/4040077.html

### 解决 Autosar 中自旋锁嵌套导致死锁问题 为了防止因自旋锁嵌套而引发的死锁,在设计和实现过程中需遵循特定原则: #### 定义唯一顺序 必须为可能嵌套使用的自旋锁定义一个唯一的获取顺序。所有代码路径都应当严格依照这一既定顺序来尝试获得多个自旋锁,从而避免形成环形等待条件[^1]。 例如,假设有两个自旋锁 `spinlockA` 和 `spinlockB` 需要被不同函数分别持有,则应该明确规定先取哪一个再取另一个。这可以通过全局配置文件或者编程约定的形式确立下来。 ```c // 获取自旋锁 A 后才能去获取 B 的例子 void acquireLocks() { GetSpinlock(spinlockA); // 只有成功获得了 spinlockA 才继续尝试获取 spinlockB GetSpinlock(spinlockB); // ...临界区... ReleaseSpinlock(spinlockB); ReleaseSpinlock(spinlockA); } ``` #### 支持跳过单个自旋锁 即使存在预设好的锁定序列,也允许某些场景下绕过其中部分自旋锁而不破坏整体的安全性。这意味着开发者可以在必要时灵活调整实际请求哪些锁,只要不违反已设定的整体层次结构即可。 #### 使用高阶抽象接口 通过引入更高层面上的操作封装来自旋锁管理逻辑复杂度。比如采用资源对象(Resource Object),使得每次访问共享资源前都会自动按照预定规则处理好所需的所有自旋锁。这样不仅简化了应用层面编码工作量同时也降低了误用风险。 ```c typedef struct ResourceObject { Spinlock* locks[]; } ResourceObject; ResourceObject resourceObj = { .locks = { &spinlockA, &spinlockB } }; void useResource() { AcquireResources(&resourceObj); // 内部实现了安全有序地获取一系列自旋锁 // 访问受保护的数据... ReleaseResources(&resourceObj); // 确保按相反次序释放所持有的全部自旋锁 } ``` #### 错误恢复机制 考虑到极端情况下的异常状况(如应用程序意外终止),操作系统内部应具备相应的防护措施以确保未正常释放的自旋锁能够得到妥善清理。对于这种情况通常不会触发 ErrorHook 来减少不必要的干扰[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值