Bootstrap

2.13、进程互斥的硬件实现方法

image-20230201220123976

1、中断屏蔽方法

利用 “开/关中断指令” 实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)

image-20230201220233739

优点:简单、高效

缺点:

  • 不适用于多处理机(多个处理机访问同一个临界区,导致其中剩余的处理机会一值等待);

  • 只适用于操作系统内核进程

  • 不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)

2、TestAndSet

简称 TS 指令,也有地方称为 TestAndSetLock 指令,或 TSL指令

TSL 指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。以下是用 C 语言描述的逻辑

image-20230201221855703

若刚开始 lock 是 false,则 TSL 返回的 old 值为 false,while 循环条件不满足,直接跳过循环,进入临界区。若刚开始 locktrue,则执行 TLSold 返回的值为 truewhile 循环条件满足,会一直循环,直到当前访问临界区的进程在退出区进行 “解锁”。

相比软件实现方法,TSL 指令把 “上锁” 和 “检查” 操作用硬件的方式变成了一气呵成的原子操作

优点

  • 实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;

  • 适用于多处理机环境

    其他进程会卡在 ts 循环里面

缺点

  • 不满足 “让权等待” 原则,暂时无法进入临界区的进程会占用 CPU 并循环执行 TSL 指令,从而导致 “忙等” 。

3、Swap指令

有的地方也叫 Exchange 指令,或简称 XCHG 指令。
Swap 指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。以下是用 C 语言描述的逻辑

image-20230201222829718

逻辑上来看 SwapTSL 并无太大区别,都是先记录下此时临界区是否已经被上锁(记录在 old 变量上),再将上锁标记 lock 设置为true,最后检查 old,如果 old 为false则说明之前没有别的进程对临界区上锁,则可跳出循环,进入临界区。

优点

  • 实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;

  • 适用于多处理机环境

    其他进程会卡在 ts 循环里面

缺点

  • 不满足 “让权等待” 原则,暂时无法进入临界区的进程会占用 CPU 并循环执行 Swap 指令,从而导致 “忙等” 。

4、整体框架

image-20230201223231647

;