进程互斥的硬件实现方式(比较难懂的一节课,但是我搞懂了)

中断屏蔽方法

利用开关中断指令实现

关中断后,不允许当前进程被中断,也就不会发生进程切换

优点:简单高效

缺点:不适用于多处理机,只适用于操作系统内核进程,不适合于用户进程(因为开关中断指令只运行于内核态)

TestAndSet指令

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

TSL是用硬件实现的,执行过程不允许被中断,只能一气呵成

bool TestAndSet(bool *lock){
  bool old;
  old=*lock;//存放原本的lock值
  *lock=true;//无论之前是什么,都设置为true
  return old;
}
while(TestAndSet(&lock));
临界区代码
lock=false;
剩余区代码

while持续调用函数,检查是否上锁。

当原本的lock是false的时候

返回的old是false,然后原子层面操作的lock是true

那么就把无人在使用的临界区上锁了,并且自己在用,用完之后解锁

当原本的lock是true的时候

返回的old是true,原子层面操作的lock也是true没有变

此时会一直执行while(TestAndSet(&lock));在这里卡着循环

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

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

swap指令

也叫Exchange指令或者XCHG指令

swap指令是用硬件实现的,执行过程不允许被中断,只能一气呵成

Swap(bool *a,bool*b){
  bool temp;
  temp=*a;
  *a=*b;
  *b=temp
}

感觉和TSL一模一样

bool old=true;
while(old==true){
  Swap(&lock,&old);
}
临界区代码
lock=false;
剩余区代码

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

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

posted @ 2025-09-29 09:27  是我,米老鼠  阅读(15)  评论(0)    收藏  举报