linux驱动开发笔记_自旋锁

自旋锁介绍

自旋锁(spin lock)是一种典型的对临界资源进行互斥访问的手段。如果A执行单元首先进入例程,他将持有自旋锁,当B执行单元试图进入同一个例程时,将获悉自旋锁已经被持有,然后需要等待A单元释放后,方可进入。

相关操作函数

1.定义自旋锁

spinlock_t    lock;  

2.初始化自旋锁

spin_lock_init(lock);

3 获得自旋锁

spin_lock(lock);

该宏如果能够立即获得锁。它就马上返回;否则,他就将在其中自旋,直到该自旋锁的保持者释放。

spin_trylock(lock);

该宏尝试获得自旋锁lock,如果能够立即获得锁,它则返回true, 否则返回false,实际上并不在原地打转。

4.释放自旋锁

spin_unlock(lock);

自旋锁的一般使用方法:

spinlock_t  lock;
spin_lock_init(lock);

spin_lock(lock);
....... /*临界区*/
spin_unlock(lock);

较重要知识点

1.自旋锁主要针对于 SMP或者 单CPU但内核可抢占的情况,对于单CPU和内核不支持抢占的系统,自旋锁退化为空操作。

2.在自旋锁的持有期间,对应内核的抢占将被禁止。即不会被别的进程打扰。

3.在自旋锁期间不能调用可能引起进程调度的函数比如说copy_from_user,kmalloc(),msleep()等。
如果线程A 在持有锁期间进入了休眠状态,那么线程A 会自动放弃CPU 使用权。线程B 开始运行,线程B也想要获取锁,但是此时锁被A 线程持有,而且内核抢占还被禁止了!线程B 无法被调度出去,那么线程A 就无法运行,锁也就无法释放,好了,死锁发生了!

4.在自旋锁期间,需要禁止中断。如果当前代码被中断打断,而中断处理程序中也请求了这个锁, 就会造成死锁。

5.自旋锁还会收到底半部(下半部)的影响。

上一篇:java实现基于关键字的文件夹(文件)的搜索、文件夹(文件)的复制、删除


下一篇:python 删除list中的第一个元素