临界区
重点 进入临界区的四个准则
- 互斥使用(Mutual Exclusion):不能同时有两个进程在临界区内执行
- 让权等待:等待进入临界区的进程,应释放处理机后阻塞等待
- 有空让进:在临界区外运行的进程不可阻止其他进程进入临界区
- 有限等待:不应使要进入临界区的进程无限期等待在临界区之外
软件实现方法
硬件实现方法
关中断
- 进入临界区前关中断,退出后开中断
- 缺点:不适用于多处理器系统(关中断只对当前 CPU 有效),且用户进程关中断风险高
Test-and-Set(TS)指令
- 硬件原子指令:读旧值 → 写新值(设为 1),两个操作不可分割
- 伪代码描述:
boolean TestAndSet(boolean *lock) {
boolean old = *lock;
*lock = true; // 锁住
return old; // 返回原值
}
// 自旋锁的典型实现
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;
信号量机制