1、中断屏蔽方法
利用 “开/关中断指令” 实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)
优点:简单、高效
缺点:
-
不适用于多处理机(多个处理机访问同一个临界区,导致其中剩余的处理机会一值等待);
-
只适用于操作系统内核进程;
-
不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)
2、TestAndSet
简称 TS
指令,也有地方称为 TestAndSetLock
指令,或 TSL
指令
TSL
指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。以下是用 C 语言描述的逻辑
若刚开始 lock
是 false,则 TSL
返回的 old
值为 false,while
循环条件不满足,直接跳过循环,进入临界区。若刚开始 lock
是 true
,则执行 TLS
后 old
返回的值为 true
,while
循环条件满足,会一直循环,直到当前访问临界区的进程在退出区进行 “解锁”。
相比软件实现方法,TSL
指令把 “上锁” 和 “检查” 操作用硬件的方式变成了一气呵成的原子操作。
优点:
-
实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;
-
适用于多处理机环境
其他进程会卡在 ts 循环里面
缺点:
- 不满足 “让权等待” 原则,暂时无法进入临界区的进程会占用
CPU
并循环执行TSL
指令,从而导致 “忙等” 。
3、Swap指令
有的地方也叫 Exchange
指令,或简称 XCHG
指令。
Swap
指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。以下是用 C 语言描述的逻辑
逻辑上来看 Swap
和 TSL
并无太大区别,都是先记录下此时临界区是否已经被上锁(记录在 old
变量上),再将上锁标记 lock
设置为true,最后检查 old
,如果 old
为false则说明之前没有别的进程对临界区上锁,则可跳出循环,进入临界区。
优点:
-
实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;
-
适用于多处理机环境
其他进程会卡在 ts 循环里面
缺点:
- 不满足 “让权等待” 原则,暂时无法进入临界区的进程会占用
CPU
并循环执行Swap
指令,从而导致 “忙等” 。