spin lock 和 mutex
spin lock
用于进程间的同步
spin lock 不会引起上下文切换,如果获取不到锁,会处于忙等状态。
spin lock 会关闭抢占禁止调度,因此必须保证临界区比较短的,不能长时间禁止调度。
用于进程间和中断之间的同步
spin lock 因为不会引起进程休眠,所以可以用来同步进程和中断。但是需要使用spin_lock_irqsave()/spin_lock_irq().
spin_lock()比spin_lock_irq()速度快,但是它并不是任何情况下都是安全的。
举个例子:进程A中调用了spin_lock(&lock)然后进入临界区,此时来了一个中断(interrupt),该中断也运行在和进程A相同的CPU上,并且在该中断处理程序中恰巧也会spin_lock(&lock) 试图获取同一个锁。由于是在同一个CPU上被中断,中断处理程序无法获得锁,会不停的忙等,由于spinlock 会关闭抢占禁止调度,这样就导致了死锁!
mutex
mutex 因为会引起进程休眠,所以只能用在进程之间同步的情况。mutex和spin lock一样在使用之前必须初始化。