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