王道操作系统笔记,视频链接:2.3.3 互斥锁

进程互斥:锁

  1. 互斥锁
    • 解决临界区最简单的工具就是互斥锁(mutex lock)。
      • 一个进程在进入临界区时应获得锁;在退出临界区时释放锁。
      • 函数acquire()获得锁,而函数release()释放锁。
    • 每个互斥锁有一个布尔变量available,表示锁是否可用。
      • 如果锁是可用的,调用acqiure()会成功,且锁不再可用。
      • 当一个进程试图获取不可用的锁时,会被阻塞,直到锁被释放。
acquire()
    while (!available)
        ;                   //忙等待
    available = false;      //获得锁
}
release() {
    available = true;       //释放锁
}
    • acquire()release()的执行必须时原子操作,因此互斥锁通常采用硬件机制来实现。
    • 互斥锁的主要缺点忙等待
    • 当有一个进程在临界区中,任何其他进程在进入临界区时必须连续循环调用acquire()。
    • 当多个进程共享一CPU时,就浪费了CPU周期。
    • 因此,互斥锁通常用于多处理器系统,一个线程可以在一个处理器上等待,不影响其他线程的执行。
  1. 需要连续循环忙等的互斥锁,都可称为自旋锁(spin lock),如TSL指令、swap指令、单标志法等。
  2. 特性:
    • 缺点:需忙等,进程时间片用完才下处理机,违反“让权等待”
    • 优点:等待期间不用切换进程上下文,多处理器系统中,若上锁的时间短,则等待代价很低
    • 常用于多处理器系统,一个核忙等,其他核照常工作,并快速释放临界区
    • 不太适用于单处理机系统,忙等的过程中不可能解锁
      • 举个例子就是P1上锁,P0忙等待,多核很有可能P1运行完释放,P0进入临界区,
      • 但是单核的情况下,P0忙等待只能浪费时间,因为单核只能同时运行一个进程,
      • 必须等P1上处理机释放锁后,P0再上处理机才能进入临界区。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐