自旋锁

目录

 

1. 自旋锁概述

2. 自旋锁的优点

3. 自旋锁的缺点

4. 自旋锁的使用场景

5. 自旋锁的改进


1. 自旋锁概述

防止多处理器并发(保护共享资源)而引入的一种锁机制。自旋锁类比于互斥锁,解决对某种资源的互斥作用,在任何情况,锁的拥有者只能有一个。不同点,两者的调用机制不同,对于互斥锁,如果资源已经被占用,后来的资源申请者只能进入睡眠状态,由用户态进入内核态,当资源被解除占用时被唤醒,由内核态转为用户态(这种状态的切换,或者说相应的上下文的切换非常耗时)。而自旋锁不会引起调用者的睡眠,如果自旋锁已经被其他的单元占用,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁。

自旋锁的初衷是:在短期内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程等待锁重新可用期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长,如果需要长时间锁定的话,最好使用信号量。

2. 自旋锁的优点

1. 自旋锁不会使线程状态发生切换,一直处于用户态,即线程一直都是active的;不会使线程进入阻塞状态,减少了不必要的上下文切换,执行速度快。

2. 非自旋锁在获取不到锁的时候会进入阻塞状态,从而进入内核态,当获取到锁的时候需要从内核态恢复,需要线程上下文切换。

3. 自旋锁的缺点

1. 如果某个线程持有锁的时间过长,就会导致其他等待获取锁的线程进入循环等待,消耗CPU。使用不当会造成CPU使用率极高。

2. 原生实现自旋锁不是公平的,即无法满足等待时间最长的线程优先获取所。不公平的所就会存在“线程饥饿”问题。

3. 死锁:试图递归的获得自旋锁势必引起死锁。

4. 自旋锁的使用场景

自旋锁适用于锁使用者保持时间比较短的情况,此时自旋锁的效率远远高于互斥锁。

信号量和读写信号量适合与保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文中使用,而自旋锁适合与保持时间非常短的情况,它可以在任何上下文中使用。

5. 自旋锁的改进

1. 针对第一个问题,一般自旋锁中有一个参数限定最多持续尝试次数,超出后,自旋锁放弃当前的时间片,等下一次机会。

2. 针对第二个问题,当有线程获得锁的时候,给该线程分配一个递增的id,称为排队号,同时锁对应一个服务号,每当有线程释放锁,服务号就会递增,此时如果服务号与某个线程排队号一致,那么该线程就会获得锁,由于排队号是递增的,所以就保证了最先请求获取锁的线程可以最先获取到锁,就实现了公平性。

3. 针对第三个问题:不要在递归中获取自旋锁。

6. 参考文献

1. https://blog.csdn.net/hhhanpan/article/details/80624244 (Linux内核同步方法——自旋锁(spin lock))

2. https://www.cnblogs.com/kuliuheng/p/4064680.html

3. https://blog.csdn.net/qq_34337272/article/details/81252853 (面试必备之深入理解自旋锁)

4. https://blog.csdn.net/sunmenggmail/article/details/8105279 (自旋锁和互斥锁区别)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值