操作系统问题!!题目如下:我们为
临界区的硬件解决
基本硬件机制包括禁止中断、Test-and-Set指令、Swap指令。
1、禁止中断:这是最简单的方法,进程一旦进入临界区就禁止一切中断,在离开临界区前放开中断,但是该方案有如下致命的弱点:
将禁止一切中断的权利赋予普通用户,若用户没有开放中断,系统的正常运行将受到影响。
不适合于多处理机系统,因为一个进程只能禁止本CPU的中断,其它CPU上的进程仍然会使用互斥资源。
2、Test-and-Set指令:(读和写在一条指令内完成)在许多计算机中都提供了专门的硬件指令Test-and-Set,简称TS,不同的机器TS略有不同,在IBM370中称为TS指令,在Inte...全部
临界区的硬件解决
基本硬件机制包括禁止中断、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值,造成处理机的浪费。
。收起