typora/note/操作系统/锁.md
2024-12-12 10:48:55 +08:00

1.7 KiB
Raw Permalink Blame History

1. 设计要点

  • 提供互斥,能否阻止多个线程进入临界区
  • 公平性,·锁释放时需要确保每个线程都有同等概率获得锁,不会有线程出现饿死的情况
  • 性能消耗

2. 锁早期设计方法

  • 在进临界区前关闭中断
  • 在出临界区后打开中断
  • 优点:设计简单,中断控制线程切换,中断关闭,一个线程会持续运行到结束
  • 缺点:
    • 要求每个运行的线程都可以对中断进行开关,风险较高,容易被恶意调用,造成死机
    • 不适用于多处理器,中断只能关闭一个,线程可以在其他处理器上继续运行
    • 中断丢失,丢失部分设备的中断信号
    • 性能低,现代处理器,对中断的开关代码执行较慢

3. 迭代-自旋锁

  • 通过 LoadAndStore命令实现
  • 返回旧值,设置新值,原子操作
  • 线程会不断自旋,可能多个线程一直都在自旋
  • 自旋期间,单处理器系统,浪费大量时间片
image-20230821200141278

4. 迭代-比较并交换

  • CompareAndSwap

    image-20230905112738473

5. 自旋立刻让出CPU休眠+队列减轻线程在等待锁时的消耗

  • 自旋一直循环判断锁浪费CPU时间中断
  • 立刻让出CPU线程没有获取到锁时主动让出锁可能会持续获取不到锁造成饥饿现象
  • 休眠和队列组合使用,可以唤醒指定线程

6. 两阶段锁

  • 先自旋
  • 后休眠