欢迎来到天天文库
浏览记录
ID:19971301
大小:39.00 KB
页数:5页
时间:2018-10-08
《互斥与同步的解决方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、互斥与同步的解决方法=硬件方法---采用软件方法实现进程互斥使用临界资源是很困难的,他们通常能实现两个进程的互斥,很难控制多个进程的互斥。---算法设计需要非常小心,否则可能出现死锁,或互斥失败等严重问题。---软件方法始终不能解决忙等现象,降低系统效率,---硬件发放包括屏蔽中断和专用机器指令。+屏蔽中断---由于进程切换需要依赖中断来实现,如果屏蔽中断则不会出现进程切换。---因此,为了实现对临界资源的互斥使用,可以在进程进入临界区之前,屏蔽中断,当进程退出临界区时,打开系统中断。---中断被屏蔽以后,系统时钟中断也被屏蔽。处理机将不会被切换到其它进程。---于是,一旦屏蔽中断,进
2、程就可以检查和修改共享内存区中的数据,而不必担心其他进程介入,其伪代码如下:Repeat<屏蔽中断>;<临界区>;<打开中断>;<其余部分>;Forever。---这种方法约束条件太强,付出的代价太大。---因为中断被屏蔽以后,系统将无法响应任何外部请求,也不会响应当前执行进程的任何异常及系统故障,严重的降低了处理机性能。---这种方法仅对单处理机系统有效,如果系统有两个或多个共享内存的处理机,屏蔽中断仅仅对执行本指令的处理机有效,其他处理机仍将继续运行,并可以访问共享内存空间。=专用机器指令---利用一些专用机器指令也能实现互斥,机器指令在一个指令周期内执行,不会受到其他指令的干扰,
3、也不会被中断。---TestandSet指令就是较长用的一种机器指令,其定义如下:·testset指令Functiontestset(vari:integer):Boolean;BeginIfi=0thenBegini:=1;testset:=true;endelsetestest:=false;end.Programmutualexclusion;Constnn=…;/*进程数*/Varbolt:integer;ProcedureP(i:integer);BeginRepeatRepeat{nothing}untiltestset(bolt);<临界区>;Bolt:=0;<其余部分>
4、ForeverEnd;Begin/*主程序*/Bolt:=0;parbegainP(1);P(2);…P(n)ParendEnd.·exchange指令Procedureexchange(varr:register;varm:memory);Vartemp;BeginTemp:=mm:=r;r:=temp;end.Programmutualexclusion;Constnn=…;/*进程数*/Varbolt:integer;ProcedureP(i:integer);Varkey:integer;BeginRepeatKey:=1Repeatexchange(key,bolt)unti
5、lkey=0;<临界区>;exchange(key,bolt);<其余部分>ForeverEnd;Begin/*主程序*/Bolt:=0;parbegainP(1);P(2);…P(n)ParendEnd.+机器指令优点---非常简单,易于证明;---同时适用于单处理机系统和共享内存的多处理机系统中多个进程互斥;---可以分别为临界区设置属于他自己的变量,以实现对多个临界区的互斥访问。+机器指令缺点---忙等现象仍然存在,进程都需要循环检测,等待时机进入临界区。但是,由于采用了机器指令,这种忙等消耗的机器时间比软件方法小,属于“可接受的忙等”。---可能出现饥饿现象。当临界区空闲时,执
6、行循环检测的若干个等待进程能进入临界区的几率是相等的,有的进程可能运气非常不好,很难有机会进入临界区,而饥饿。---还有可能导致死锁---例如,进程P1的优先级低于P2的优先级,若P1通过执行专用机器指令,进入临界区,且在临界区内被中断,P2被调度执行,若P2也需要进入该临界区,由于临界区被P1占用,P2忙等。由于P1的优先级低于P2,调度程序不可能强行剥夺P2的执行而调度P1。这样,P1将一直占用临界区被中断,P2一直忙等,如果没有外力的作用,这种僵持状态将一直保持下去,即系统出现死锁。=信号量方法---软件方法和硬件方法都存在忙等问题,浪费了处理机时间。---信号量方法能够实现进程
7、的互斥与同步,而不必忙等。+信号量实现互斥的基本原理---两个或多个进程可以通过传递信号进行合作,可以迫使进程在某个位置暂时停止执行(阻塞等待),直到它收到一个可以“向前推进”的信号(被唤醒“。---相应地,将实现信号等作用的变量称为信号量,常定义为记录型变量s,其中一个域为整形,另一个域为队列,其元素为等待该信号量的阻塞进程(FIFO)。+信号量定义Typesemaphore=recordCount:integer;Queue:listofp
此文档下载收益归作者所有