临界区的硬件互斥方案

临界区互斥的硬件解决

基本硬件机制包括禁止中断、Test-and-Set指令、Swap指令

1、禁止中断

   这是最简单的方法,进程一旦进入临界区就禁止一切中断,在离开临界区前放开中断,但是该方案有如下致命的弱点:


将禁止一切中断的权利赋予普通用户,若用户没有开放中断,系统的正常运行将受到影响。

不适合于多处理机系统,因为一个进程只能禁止本CPU的中断,其它CPU上的进程仍然会使用互斥资源。

2、Test-and-Set指令

   (读和写在一条指令内完成)在许多计算机中都提供了专门的硬件指令Test-and-Set,简称TS,不同的机器TS略有不同,在IBM370中称为TS指令,在Intel 8086中称为XCHG指令,但是它们的基本功能是相同的。


test_and_set指令语义:
function test_and_set (var target :boolean):boolean;
begin 
  boolean test_and_set:=target;

  target:=true;

  return test_and_set;

end;

其中: target有两种状态,当target为False时表示资源未用,若为True时表示资源正在使用。

用test_and_set指令实现互斥: 可以为每个临界资源设置一个布尔变量lock并赋予初值False,用TS指令将变量lock状态记录于变量TS中,并将True赋予lock,这等效于关闭了临界区,使得任何进程不能进入

repeat
  while test_and_set (lock) do no_op;
  临界区;
  lock:=false;
  剩余区;
until false; 

上段程序检查TS指令执行后TS状态,若为false表示进程可以进入临界区,否则不断测试执行TS指令后的TS变量值直到为假。

3、Swap指令

   交换两个字的内容(在一条指令内,不可分割)


swap指令语义:
procedure swap(var a,b:boolean);
  var temp:boolean;
  begin 
    temp:=a; 
    a:=b;
    b:=temp;
  end;

用swap实现互斥:

repeat
  key := true;
  repeat
    swap(lock,key);  //初始lock为false,表示未使用
  until key = false;
  进程的临界区代码CS;
  lock := false;
  进程的其它代码;
end
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值