利用软件方法解决进程互斥问题
假设有两个进程 Pi和Pj,它们共享一个临界资源 R,请使用软件方法使进程 Pi和Pj能互斥地访
问资源 R。
算法 1:设置整形变量 turn, 用于指示被允许进入临界区的进程的编号,即若 turn=0, 表示允许 进程 Pi 进入临界区。
注意:该算法强制两个进程轮流进入临界区,不考虑实际需要。很容易造成资源的不充分利用。
对 Pi 进程的描述如下: repeat
while turn 工 i do no-op
critical section
turn:=j
remainder section
until false
算法 2:在每一个进程访问临界资源之前,先去查看一下临界资源是否正被访问,若正被访问, 该进程等待;否则,进入
自己的临界区。
设置数组 flag ,使其中每个元素的初值为 false ——表示所有进程都未进入临界区, 而当其中的 第 i 个元素值非 false 时,
即若 flag[i]=ture ——表示进程 Pi 正在临界区内执行。
注意:该算法解决了有空让进的原则, 但当 Pi 和 Pj 的访问标志 flag 都为 false 时,如果 Pi 和 Pj 几乎同时都要求进入临界区,
因而都发现对方的标志为 false ,于是,两进程都 先后进入临界区,又违背了忙则等待的原 则。
算法描述如下:
Var flag:arry[0,1,, , n] of Boolean;
Repeat
While flag[j] do no-op
Flag[i]:=true;
Critical section
Flag[i]:=false;
Remainder section
Until false
算法 3:设数组 flag[n], 当 flag[i]=ture ——表示进程 Pi 希望进入临界区,即每当 Pi 要进入 临界区前,先将 flag[i]=ture ——表示进程已要求进入临界区,再去查看 Pj 的标志,若 flag[j]=ture, 则 Pi 等待,否则, Pi 进入临界区。(即要求进入临界区的进程先设置其要求进 入的标志,然后再去查看其他进程的标志)
注意: 该算法可以有效地防止两个进程进入临界区, 但又可能导致最终都不进入临界区的情况它 即违背了“有空让进”的准则,又违背了“有限等待”的准则,
描述如下:
repeat
flag[i]:=ture;
while flag[i] do no-op
critical section
flag[i]:=false;
remainder section
until false
算法 4:该算法为进程 Pi 设置了标志位 flag[i], 当 flag[i]=ture ——表示 Pi 要求进入临界区, 或正在临界区中执行。还设置了 ture 变量——指示允许进入临界区的进程编号。 注意:保证了“忙则等待”和“有空让进“的准则。
Repeat
flag[i]:=ture ; turn : =j; 表示 Pi 已进入临界区,轮到 Pj 进入临界区。
while flag[i] and turn:=j do no-op ; 若 flag[i] and turn:=j 为 false, 则 Pj 进入临界
区。
critical section
flag[i]:=false;
remainder section until false
用硬件法解决进程互斥的问题
1、利用 Test — and---set 指令实现互斥
function TS ( VAR lock : boolean ): boolean ;
begin
TS: =lock ;
Lock : =true ;
End
其中: lock=false ——表示该资源空闲;当 lock=true ——表示该资源正在使用。
2、利用 TS 实现进程互斥
(1) 可为每个临界资源设置一个布尔变量 lock ,初值为 false ——表示资源空闲。
Function TS (var lock:Boolean):Boolean
Begin
TS:=lock;
Lock:=true;
End
(2) 利用 TS 实现进程互斥
为每一个临界资源设置一个布尔变量 lock ,初值为 false ——表示资源空闲;用 TS 指令将变量
lock 的状态记录在变量 TS 中,并将 true 赋予 lock ;这等于关闭了临界区,使任何进程都不能 进入临界区。
利用 TS 指令实现互斥的循环进程可描述为:
repeat
while TS(lock) do skip;
critical section
lock:=false;
remainder section
until false
3、利用 Swap
原创力文档

文档评论(0)