计算机进程和打印机进程共同使用一个同一缓冲区Buf。计算进程反复地把每次计算结果放入Buf中,而打印进程则把计算进程每次放入Buf中的数据通过打印机打印输出。
如果不采用任何制约措施这两个进程的执行起始时间和执行速度都是彼此独立的。假设进程Pc和Pp对公用缓冲池Buf已经采取了互斥措施,其相应的控制可以描述如下:
Pc: A:local Buffer repeat Buffer <- Buf until Buf=空 计算 得到计算结果 Buf <- 计算结果 goto A Pp: B:local Pri repeat Pri <- Buf until Pri ≠空 打印Buf中的数据 清除Buf中的数据 goto B
如果以上描述方式来并发执行进程Pc和Pp,则会造成CPU时间的极大浪费,因为其中包含两处测试语句。而操作系统设计要求是不允许的。CPU时间的浪费主要是由于进程Pc和Pp的执行相互制约所引起的。Pc的输出结果是Pp的执行条件,Pp的执行结果是Pc的执行条件。
进程间的同步:是指异步环境下的一组进程因直接制约而互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程。具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。如果对某一个消息或事件赋予唯一的消息名,则可:
wait(消息名) 表示进程等待合作进程发来消息
signal(消息名) 表示向合作进程发送消息
利用wait和signal,简单描述计算进程Pc和打印进程Pp的同步关系如下:
Pc: A:wait(Bufempty) 计算 Buf <- 计算结果 Bufempty <-false signal(Buffull) goto A Pp: B:wait(Buffull) 打印Buf中的数据 清除Buf中的数据 Buffull <- false signal(Bufempty) goto B
过程wait的功能是等待到消息名为true的进程继续执行;
Signal的功能是向合作进程发送合作进程所需要的消息名,将其值置为true。