操作系统进程同步互斥问题.docx

利用软件方法解决进程互斥问题 假设有两个进程 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)

1亿VIP精品文档

相关文档