进程同步

更新时间:2022-08-25 11:28

进程同步:在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。

同步的概念

我们把异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。 如果我们对一个消息或事件赋以唯一的消息名,则我们可用过程 wait (消息名)  表示进程等待合作进程发来的消息,而用过程 signal (消息名) 表示向合作进程发送消息。

私用信号量

上面我们用wait(消息名)与signal(消息名)的方式,描述了进程同步的一种实现方法。事实上,使用信号量的方法也可实现进程间的同步。 一般来说,我们也可以把各进程之间发送的消息作为信号量看待。与进程互斥时不同的是,这里的信号量只与制约进程及被制约进程有关而不是与整组并发进程有关。因此,我们称该信号量为私用信号量(Private Semaphore)。一个进程Pi的私用信号量Semi是从制约进程发送来的进程Pi的执行条件所需要的消息。与私用信号量相对应,我们称互斥时使用的信号量为公用信号量。

用P,V原语操作实现同步

步骤:

1. 为各并发进程设置私用信号量

2. 为私用信号量赋初值 3. 利用P、v原语和私用信号量规定各进程的执行顺序。 实例:

例:设进程PA和PB通过缓冲区队列传递数据。PA为发送进程、PB为接收 进程。PA发送数据时调用发送过程deposit(data),PB接收数据时调用过程remove(data)。且数据的发送和接收过程满足如下条件: 1)在PA至少送一块数据入一个缓冲区之前,PB不可能从缓冲区中取出数据(假定数据块长等于缓冲区长度), 2)PA往缓冲队列发送数据时,至少有一个缓冲区是空的; 3)由PA发送的数据块在缓冲队列中按先进先出(FIFO)方式排列。 描述发送过程deposit(data)和接收过程remove(data)。

进程间制约关系

在多道程序环境下,系统中各进程以不可预测的速度向前推进,进程的异步性会给系统造成混乱,造成了结果的不可再现性。为防止这种现象,异步的进程间推进受到二种限制:

(1)资源共享关系

多进程共享资源,例如各进程争用一台计算机,这时各进程使用这台打印机时有一定的限制。如各进程随意使用打印机,会造成打印机结果交织在一起难以区分。所以必须由系统统一分配,每次只允许一个进程使用一段时间打印机,等该进程使用完毕后再将打印机分配给其它进程。这种使用原则称为互斥使用。

(2)相互合作关系

在某些进程之间还存在合作关系,例如图2-2程序并发执行图中一个程序的输入、计算、打印三个程序段作为三个进程并发执行,由于这三个进程间存在着相互合作的关系,即先输入再计算、最后再打印的关系,所以这三个进程在并发执行时推进序列受到限制,要保证其合作关系正确,进程间这种关系称为同步关系。

临界资源

上面分析了进程间共享打印机这类资源时要受到限制,象打印机这类资源一次只允许一个进程使用的资源称为临界资源。属于临界资源有硬件打印机、磁带机等,软件在消息缓冲队列、变量、数组、缓冲区等。当然还有一类象磁盘等资源,它允许进程间共享,即可交替使用,所以它称为共享资源,而临界资源又称独享资源。

临界区

多个进程共享临界资源时必须互斥使用,例如在二个进程A和B它们的程序如下:

A: begin

Input data 1 form I/O 1 ;

Computer……;

Print results 1 by printer ;临界区A

End

B: begin

Input a data 2 form I/O 2 ;

Computer……;

Print results 2 by printer ;临界区B

End

A和B两个进程都需要使用打印机,它们必须互斥使用。如果为了保证结果的正确性限制A、B二进程推进序列,规定进程A执行好再执行进程B,或进程B执行好再执行进程A,这样的限制就显得过死,因为它已不能保证进程A、B能并发执行,所以必须把限制减少到最少,以尽可能支持并发执行。为此把各进程代码分解,把访问临界资源的那段代码(称为临界区)与其它段代码分割开来,只对各种进程进入自己的临界区加以限制,即各进程互斥地进入自己的临界区。在上述A、B两程序中我们分别把A和B的使用打印机的二段程序print result 1 by printer和print result 2 by printer称为A和B进程使用打印机的临界区A和临界区B,进程A和B必须互斥地分别进入各自的临界区A和B。

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}