LINUX内核有那几种锁详细介绍

网络整理 2020-11-17 18:19:06 0评

资料大小:0.01 MB

所需积分:0

下载次数:0

  Mutex 是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section 代码的访问,保证这段代码不会被并行的运行。

  Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binary semaphore。一般的用法是,用于限制对于某一资源的同时访问。

  Binary semaphore与Mutex 的差异:

  在有的系统中Binary semaphore与Mutex 是没有差异的。在有的系统上,主要的差异是mutex 一定要由获得锁的进程来释放。而semaphore可以由其它进程释放(这时的semaphore实际就是个原子的变量, 大家可以加或减),因此semaphore可以用于进程间同步。Semaphore的同步功能是所有系统都支持的,而Mutex 能否由其他进程释放则未定,因此建议mutex 只用于保护critical section 。而semaphore则用于保护某变量,或者同步。

  另一个概念是spin lock ,这是一个内核态概念。spin lock 与semaphore的主要区别是spin lock 是busy waiting ,而semaphore是sleep 。对于可以sleep的进程来说, busy waiting 当然没有意义。对于单CPU的系统, busy waiting当然更没意义(没有CPU可以释放锁) 。因此,只有多CPU的内核态非进程空间,才会用到spin lock 。Linux kernel 的spin lock 在非SMP的情况下,只是关irq ,没有别的操作,用于确保该段程序的运行不会被打断。其实也就是类似mutex 的作用,串行化对critical section 的访问。但是mutex 不能保护中断的打断,也不能在中断处理程序中被调用。而spin lock 也一般没有必要用于可以sleep 的进程空间。

  ---------------------------------------------------------------------

  ------------------------

  内核同步措施

  为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。我们的重点不是介绍这些方法的详细用法, 而是强调为什么使用这些方法和它们之间的差别。

  Linux 使用的同步机制可以说从2.0 到2.6 以来不断发展完善。从最初的原子操作, 到后来的信号量, 从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux 从单处理器到对称多处理器的过度;伴随着从非抢占内核到抢占内核的过度。锁机制越来越有效,也越来越复杂。

  目前来说内核中原子操作多用来做计数使用,其它情况最常用的是两种锁以及它们的变种: 一个是自旋锁,另一个是信号量。我们下面就来着重介绍一下这两种锁机制。

相关文章

0个回复

我要评论

热门标签