临界区

  • 每个进程中访问临界资源的那段代码

重点 进入临界区的四个准则

  1. 互斥使用(Mutual Exclusion):不能同时有两个进程在临界区内执行
  2. 让权等待:等待进入临界区的进程,应释放处理机后阻塞等待
  3. 有空让进:在临界区外运行的进程不可阻止其他进程进入临界区
  4. 有限等待:不应使要进入临界区的进程无限期等待在临界区之外

软件实现方法

  • Peterson 算法等

硬件实现方法

关中断

  • 进入临界区前关中断,退出后开中断
  • 缺点:不适用于多处理器系统(关中断只对当前 CPU 有效),且用户进程关中断风险高

Test-and-Set(TS)指令

  • 硬件原子指令:旧值 → 新值(设为 1),两个操作不可分割
  • 伪代码描述:
boolean TestAndSet(boolean *lock) {
    boolean old = *lock;
    *lock = true;   // 锁住
    return old;     // 返回原值
}
  • 用于实现 自旋锁(Spin Lock):
// 自旋锁的典型实现
while (TestAndSet(&lock) == 1)  // 若锁被占用,忙等循环
    ;
// 进入临界区
lock = 0;  // 释放锁
  • 重点 忙等(Busy Waiting):进程在等待锁时不断循环测试,CPU 空转,浪费处理机时间
    • 违背 ” 让权等待 ” 准则
    • 优点:无需上下文切换,在临界区执行时间很短时效率高

Swap 指令

  • 交换两个变量的值,同样是硬件原子操作
void Swap(bool *a, bool *b) {
    bool temp = *a;
    *a = *b;
    *b = temp;
}
// 用 Swap 实现自旋锁
bool key = true;
while (key == true)
    Swap(&lock, &key);
// 进入临界区
lock = false;

信号量机制