对自旋锁的理解
下面是我对自旋锁的一些理解。第一次写原创,写得不好,欢迎指正!
自旋锁是一种低级的互斥锁,它主要用于保护临界区代码的执行。同一时间内同一个锁只能被一个运行单元占有,若其他运行单元试图获取一个已经被占用的自旋锁,则会进入疯狂的“自旋”状态,即不断的循环尝试获取锁,且不会放弃CPU的使用权!采取自旋的方式主要是为了降低进程切换的代价,但是,这种“等待”的方式效率低,因此临界区代码应该是一些耗时短的操作,否则会对效率造成较大影响,同时也就失去了引入自旋锁的目的。
被自旋锁保护的临界区代码是原子上下文的,不可以被抢占,但可以被中断打断,中断打断后返回继续执行。但是,必须注意一点,若中断处理程序中有可能用到自旋锁,则一般在进行spin_lock()之前将中断关闭,否则有可能造成死锁。
自旋锁在不同的内核抢占性和是否是SMP环境下,意义是不同的:
1、单CPU不可抢占内核
不可抢占指除非当前运行单元主动放弃CPU,否则不会被调度程序切换,但是要注意的是,可以被中断打断。因此在这种情况下,只要考虑运行单元与中断处理程序之间对自旋锁的竞争关系就可以。一般情况下,在进行spin_lock()之前先关闭中断。
2、单CPU可抢占内核
当前的运行单元有可能被CPU切换掉,自旋锁保证临界区代码是原子性的,在spin_unlock()之前禁止抢占!但是,同样要注意中断的问题,1一样。
3、多CPU不可抢占
这种情况与单CPU类似,唯一的不同就是自旋锁此时保证一段临界区代码同一时间内只能由一个CPU运行。
4、多CPU可抢占
参考2、3。
综上,在对于同一CPU,自旋锁保证的是临界区代码的原子性;对于不同的CPU之间,它保证的是临界区代码的互斥性。
阅读(576) | 评论(0) | 转发(0) |