进程互斥的硬件实现方法
进程互斥的硬件实现方法
一、中断屏蔽方法
利用“开/关中断指令"实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)。
- 优点:简单、高效
- 缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)
二、TestAndSet 指令(TestAndSetLock 指令 / TS 指令 / TSL 指令)
——理解:
-
TS 函数返回的是修改 lock 之前的值,即 old。
-
如果先前已被上锁,while 循环陷入死循环,等待临界区代码(另一个进程的临界区代码)执行完并修改为 false。
-
如果先前未被上锁,那么 TS 返回 false ,while 循环被跳过,且此时 lock 已被修改为上锁。
-
用指针传递参数是因为值传递的函数并不能改变同一变量,需要地址传递实现对同一变量的控制。
(备注:硬件实现,以下仅为用 C 语言描述的逻辑参考,实际并非 C 语言实现)
相比软件实现方法, TSL 指令把“上锁”和“检查”操作用硬件的方式变成了一气呵成的原子操作。
-
优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
-
缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用 CPU 并循环执行 TSL 指令,从而导致“忙等”
(某种程度上,大部分while的锁都不满足“让权等待”原则)
三、Swap 指令(Exchange 指令 / XCGH 指令)
(备注:硬件实现,以下仅为用 C 语言描述的逻辑参考,实际并非 C 语言实现)
- 优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
- 缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用 CPU 并循环执行 TSL 指令,从而导致“忙等”