Linux内核中的并发与同步编程

Linux内核中的并发与同步编程

解决并发和同步问题对于一个支持SMP和多任务的操作系统来说是十分重要的, linux操作系统在这方面为我们提供了各种丰富的机制用于满足不同应用场景的需求.


造成并发执行的原因

中断,软中断和tasklet: 中断和进程, 中断和中断之间有可能会引起并发问题.

内核抢占: 一个线程会被另一个线程抢占, 所以线程和线程之间也有同步问题.

睡眠: 线程主动性睡眠也会引起同步问题.

对称多处理(SMP): 多个处理器同时执行一套代码就有问题.

 

从上面我们可以看出来, 如果不需要支持SMP的话, 我们只需要关闭中断或者抢占就可以解决并发问题(关闭中断之后, 被动的抢占不会发生, 只有线程主动调用某些API才会触发进程调度). 当SMP出现之后(linux2.0时代就已经出现了), 我们就必须使用自旋锁来解决同步问题了.

 

造成死锁的原因

递归引起的死锁: linux下的spin_lock是不支持递归的, 所以同一个线程不能多次获取同一个锁.

ABBA引起的死锁: 多个线程获取锁的顺序不一致引起的死锁. 解决方法是大家都按相同的顺序去获取锁.

 

Linux内核中的同步方法

自旋锁: 可以在中断上下文中使用. (不会引起死锁, 如果线程和中断处理函数共用了一个锁的话, 那么当线程获取自旋锁之后是会明确的关中断的. Spin_lock_irqsave)

信号量: 会引起睡眠, 所以不能在中断上下文中使用.

互斥体: 很容易理解, 这里需要注意的是互斥体只能被同一个线程获取和释放.

读-写自旋锁: 适用于读者和读操作很多, 但是写者和写操作很少的情况. 需要注意的是, 如果读者过多的话, 会造成写者饥饿.

读-写信号量: 基本同读写自旋锁, 然后像信号量一样会引起睡眠.

完成变量: 一种简单的异步通知机制, 通过名字就很容易理解.

顺序锁: 顺序锁与读写自旋锁很类似, 只是该锁的写会优先于读, 也就是写者不会让读者饥饿.

Linux提供了这么多种不同的方式来做同步, 就是为了在不同的应用场景中找到性能和效率的平衡点. 我们要权衡CPU占用和进程调度带来的开销, 在不同的场合下选择不同的加锁机制.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值