Linux内核同步:互斥锁与自旋锁的选择与使用
1. 死锁与活锁
在多线程或多进程的环境中,死锁和活锁是常见的并发问题。Steve Rostedt在2011年的Linux Plumber’s Conference上对lockdep进行了详细介绍,相关幻灯片探讨了简单和复杂的死锁场景,以及lockdep如何检测它们( 链接 )。
活锁与死锁类似,但参与任务的状态是运行而非等待。例如,中断“风暴”可能导致活锁,现代网络驱动通过关闭中断(在中断负载下)并采用一种称为New API; Switching Interrupts (NAPI)的轮询技术来缓解这种影响(在适当的时候再打开中断)。
2. 内核锁的类型
Linux内核主要有两种类型的锁:互斥锁(mutex lock)和自旋锁(spinlock)。实际上,还有其他类型的锁,以及同步和“无锁”编程技术。
3. 互斥锁与自旋锁的区别
3.1 线程竞争锁的情况
假设有三个线程tA、tB和tC在SMP系统上并行运行驱动读取方法的伪代码。在临界区开始前(时间t2)获取锁,在临界区代码路径结束后(时间t3)释放锁。当三个线程同时尝试获取锁时,系统保证只有一个线程能成功获取。假设tB获取到锁,它成为“赢家”线程,tA和tC则是“输家”线程,它们会等待锁被释放。当“赢家”线程完成临界区并解锁后,“输家”线程再次竞争锁。
超级会员免费看
订阅专栏 解锁全文
98

被折叠的 条评论
为什么被折叠?



