46 lines
1.7 KiB
Markdown
46 lines
1.7 KiB
Markdown
|
### 1. 设计要点
|
|||
|
|
|||
|
- 提供互斥,能否阻止多个线程进入临界区
|
|||
|
- 公平性,·锁释放时需要确保每个线程都有同等概率获得锁,不会有线程出现饿死的情况
|
|||
|
- 性能消耗
|
|||
|
|
|||
|
### 2. 锁早期设计方法
|
|||
|
|
|||
|
- 在进临界区前关闭中断
|
|||
|
- 在出临界区后打开中断
|
|||
|
- 优点:设计简单,中断控制线程切换,中断关闭,一个线程会持续运行到结束
|
|||
|
- 缺点:
|
|||
|
- 要求每个运行的线程都可以对中断进行开关,风险较高,容易被恶意调用,造成死机
|
|||
|
- 不适用于多处理器,中断只能关闭一个,线程可以在其他处理器上继续运行
|
|||
|
- 中断丢失,丢失部分设备的中断信号
|
|||
|
- 性能低,现代处理器,对中断的开关代码执行较慢
|
|||
|
|
|||
|
### 3. 迭代-自旋锁
|
|||
|
|
|||
|
- 通过 LoadAndStore命令实现
|
|||
|
- 返回旧值,设置新值,原子操作
|
|||
|
- 线程会不断自旋,可能多个线程一直都在自旋
|
|||
|
- 自旋期间,单处理器系统,浪费大量时间片
|
|||
|
|
|||
|
<img src="https://blog-heysq-1255479807.cos.ap-beijing.myqcloud.com/blog/note/image-20230821200141278.png" alt="image-20230821200141278" style="zoom:33%;" />
|
|||
|
|
|||
|
### 4. 迭代-比较并交换
|
|||
|
|
|||
|
- CompareAndSwap
|
|||
|
|
|||
|
![image-20230905112738473](https://blog-heysq-1255479807.cos.ap-beijing.myqcloud.com/blog/note/image-20230905112738473.png)
|
|||
|
|
|||
|
### 5. 自旋,立刻让出CPU,休眠+队列减轻线程在等待锁时的消耗
|
|||
|
|
|||
|
- 自旋,一直循环判断锁,浪费CPU时间中断
|
|||
|
- 立刻让出CPU,线程没有获取到锁时,主动让出锁,可能会持续获取不到锁造成饥饿现象
|
|||
|
- 休眠和队列组合使用,可以唤醒指定线程
|
|||
|
|
|||
|
### 6. 两阶段锁
|
|||
|
|
|||
|
- 先自旋
|
|||
|
- 后休眠
|
|||
|
|
|||
|
|
|||
|
|