中断屏蔽方法
利用开关中断指令实现
关中断后,不允许当前进程被中断,也就不会发生进程切换
优点:简单高效
缺点:不适用于多处理机,只适用于操作系统内核进程,不适合于用户进程(因为开关中断指令只运行于内核态)
TestAndSet指令
简称TS指令,有的地方也称为TestAndSetLock指令,TSL指令
TSL是用硬件实现的,执行过程不允许被中断,只能一气呵成
bool TestAndSet(bool *lock){bool old;old=*lock;//存放原本的lock值*lock=true;//无论之前是什么,都设置为truereturn 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指令,从而导致忙等