进程互斥的硬件实现方法

进程互斥的硬件实现方法

image


一、中断屏蔽方法

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

  • 优点:简单、高效
  • 缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)

二、TestAndSet 指令(TestAndSetLock 指令 / TS 指令 / TSL 指令)

——理解:

  • TS 函数返回的是修改 lock 之前的值,即 old。

  • 如果先前已被上锁,while 循环陷入死循环,等待临界区代码(另一个进程的临界区代码)执行完并修改为 false。

  • 如果先前未被上锁,那么 TS 返回 false ,while 循环被跳过,且此时 lock 已被修改为上锁。

  • 用指针传递参数是因为值传递的函数并不能改变同一变量,需要地址传递实现对同一变量的控制。

(备注:硬件实现,以下仅为用 C 语言描述的逻辑参考,实际并非 C 语言实现)

image

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

  • 优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境

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

    (某种程度上,大部分while的锁都不满足“让权等待”原则)

三、Swap 指令(Exchange 指令 / XCGH 指令)

(备注:硬件实现,以下仅为用 C 语言描述的逻辑参考,实际并非 C 语言实现)

image

  • 优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
  • 缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用 CPU 并循环执行 TSL 指令,从而导致“忙等”

posted @   Wind_730  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示