《操作系统》——解决并发进程中与时间有关的错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013067402/article/details/45371363

    在多道程序设计的系统中同时存在着许多进程。他们可能同时装入主存,等待处理器的调度,这就形成的并发进程。对于单核处理器来说,并发进程并不是多个进程同时占用处理器同时执行,而是同时装入主存,至于进程什么时候被执行,这要看进程的调度策略啦! 谈到并发进程,我就想到进程的并发会产生许多错误,这些错误在我们在设计系统或者编写软件时都是尽量要避免的。 

    那么进程的并发执行为什么会产生错误那?归根到底是并发进程访问共享变量的事,当多个进程访问共享变量的过程中,就有可能会产生与时间有关的错误,或者是死锁。

    一、导图分析


   二、导图分析

   说到进程访问共享资源,我觉得首先先明白进程的同步与进程的互斥问题。

   1、进程的互斥:指当有若干个进程都要使用某一共享资源时,任何时候最多只允许一个进程去使用共享资源,其他要使用的进程必须等待,知道该资源的占用者释放了该资源。

   2、进程的同步:在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应该等待,知道消息到达后才被唤醒。

   3、与时间有关的错误:多个进程共同执行时,交替的访问了共享变量,但是有一个进程由于自身原因或者外界原因被中断了后,稍后又接着执行,最后导致运行结果出错。

   例如:

   某小区有两扇门,其中一扇门是入口,另一扇门是出口,用一个计数器count显示在小区的人数,当有人进入时,由进程PIN实现计数加一,当有人退出时,由进程POUT减一。这两个进程如下

<span style="font-family:KaiTi_GB2312;font-size:18px;">begin
     count: interge                                                               
     count: =0
cobegin
process PIN 
     R1: integer;
begin
     R1:=count;
     R1:=R1+1;
     count: =R1;
end ;

process POUT 
     R2: integer;
begin
     R2:= count;
     R2:=R2-1;
     count:=R2;
end;
coend;
end;</span>
    假定某个时候的计数值count=n,这时有一个人要进入,正好有一个同时要出去,于是进程PIN和POUT同时都要执行,如果进程PIN和POUT都没有被打断,那么各自完成了count+1和count-1操作,count还是n,但是若果被打断了PIN操作,看下图



这样执行过后,结果会变成n+1,这就是与时间有关的错误的实例。

    解决办法:采用PV操作,引进PV操作会引进一个叫临界区的名词,临界区是指并发进程中与共享变量有关的程序段。相关临界区是指并发进程中设计到相同变量的那些临界区。PV操作的原理是保证一个进程在临界区执行时,不让另一个进程进入相关临界区执行,即个进程对共享变量的访问是互斥的,这就不会造成与时间有关的错误。对于上面表格的一个例子来说,当进程PIN被打断后,POU不能访问共享变量count,直到PIN进程结束后才让POUT访问,这样最后的结果就正确了。

   三、小结

    解决并发进程之间的错误关键就是解决共享变量的访问方式,当多个进程都想访问共享变量时,我们一定要管理好各个进程的使用规律,不然的话程序就会出错。采用PV操作,让相关进程互斥的进入各自的临界区执行,这样就解决了并发进程间与时间有关的错误。好了,并发进程访问共享变量时,还会产生死锁,要想看死锁的形成原因及解决办法,请关注我的下一篇博客!

展开阅读全文

没有更多推荐了,返回首页