互斥与同步的解决方法.docVIP

  • 26
  • 0
  • 约3.91千字
  • 约 5页
  • 2016-09-09 发布于重庆
  • 举报
互斥与同步的解决方法

互斥与同步的解决方法 =硬件方法 ---采用软件方法实现进程互斥使用临界资源是很困难的,他们通常能实现两个进程的互斥,很难控制多个进程的互斥。 ---算法设计需要非常小心,否则可能出现死锁,或互斥失败等严重问题。 ---软件方法始终不能解决忙等现象,降低系统效率, ---硬件发放包括屏蔽中断和专用机器指令。 +屏蔽中断 ---由于进程切换需要依赖中断来实现,如果屏蔽中断则不会出现进程切换。 ---因此,为了实现对临界资源的互斥使用,可以在进程进入临界区之前,屏蔽中断,当进程退出临界区时,打开系统中断。 ---中断被屏蔽以后,系统时钟中断也被屏蔽。处理机将不会被切换到其它进程。 ---于是,一旦屏蔽中断,进程就可以检查和修改共享内存区中的数据,而不必担心其他进程介入,其伪代码如下: Repeat <屏蔽中断>; <临界区>; <打开中断>; <其余部分>; Forever。 ---这种方法约束条件太强,付出的代价太大。 ---因为中断被屏蔽以后,系统将无法响应任何外部请求,也不会响应当前执行进程的任何异常及系统故障,严重的降低了处理机性能。 ---这种方法仅对单处理机系统有效,如果系统有两个或多个共享内存的处理机,屏蔽中断仅仅对执行本指令的处理机有效,其他处理机仍将继续运行,并可以访问共享内存空间。 =专用机器指令 ---利用一些专用机器指令也能实现互斥,机器指令在一个指令周期内执行,不会受到其他指令的干扰,也不会被中断。 ---Test and Set指令就是较长用的一种机器指令,其定义如下: ·testset指令 Function testset(var i:integer):Boolean; Begin If i =0 then Begin i:=1; testset:=true; end else testest:=false; end. Program mutualexclusion; Constn n=…;/*进程数*/ Var bolt:integer; Procedure P(i:integer); Begin Repeat Repeat {nothing}until testset(bolt); <临界区>; Bolt:=0; <其余部分> Forever End; Begin/*主程序*/ Bolt:=0; parbegain P(1); P(2); … P(n) Parend End. ·exchange指令 Procedure exchange(var r:register;var m:memory); Var temp; Begin Temp:=m m:=r; r:=temp; end. Program mutualexclusion; Constn n=…;/*进程数*/ Var bolt:integer; Procedure P(i:integer); Var key:integer; Begin Repeat Key:=1 Repeat exchange(key,bolt)until key=0; <临界区>; exchange(key,bolt); <其余部分> Forever End; Begin/*主程序*/ Bolt:=0; parbegain P(1); P(2); … P(n) Parend End. +机器指令优点 ---非常简单,易于证明; ---同时适用于单处理机系统和共享内存的多处理机系统中多个进程互斥; ---可以分别为临界区设置属于他自己的变量,以实现对多个临界区的互斥访问。 +机器指令缺点 ---忙等现象仍然存在,进程都需要循环检测,等待时机进入临界区。但是,由于采用了机器指令,这种忙等消耗的机器时间比软件方法小,属于“可接受的忙等”。 ---可能出现饥饿现象。当临界区空闲时,执行循环检测的若干个等待进程能进入临界区的几率是相等的,有的进程可能运气非常不好,很难有机会进入临界区,而饥饿。 ---还有可能导致死锁 ---例如,进程P1的优先级低于P2的优先级,若P1通过执行专

文档评论(0)

1亿VIP精品文档

相关文档