分类：电脑/网络-操作系统/系统故障
问题：操作系统问题!!题目如下:我们为某临界资源设置一把锁W，当W=1 
题目如下:
我们为某临界资源设置一把锁W，当W=1时表示关锁；当W=0时表示开锁。试写出开锁和关锁的原语，并利用他们实现互斥
回答：   临界区的解决  基本硬件机制包括禁止中断、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   test_and_set:=target;  target:=true;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);  until key = false;  进程的临界区代码CS;  lock := false;  进程的其它代码;end    在上面的算法中key必须为局部变量，lock为全局变量。下面是Burns在1978年提出实现互斥的算法：公用数据结构:（数据初始化为false)var waiting :array[0..n-1] of boolean;     lock    :boolean;进程一般结构:var j   :0..n-1;    key :boolean;repeat  waiting[i] := true;  key:=true;  while waiting[i] and key do      key:=test_and_set(lock);  waiting[i] := false;   临界区;  j:= i+1 mod n;  while(j<>i) and (not waiting[j]) do     j := j+1 mod n;  if j=i then lock := false   else waiting[j]  := false;  剩余区;until false;注意：使用上述硬件指令可以有效地保证进程间的互斥，但是仍然有一个问题，当进程在临界区中执行时，其它想进入临界区的进程必须不断地测试lock值，造成处理机的浪费。