1、OS进程同步信号量典型题例题1(北京大学1999年)有一个仓库,可以存放A和B两种产品,仓库的存储空间足够大,但要求:(1)一次只能存人一种产品((A或B);(2)一N A产品数量一B产品数量M 其中,N和M是正整数。试用“存放A和存放B以及P操作和V操作描述产品A和产品B的人库过程。解答:应先将表达式转换成制约条件,不可在程序中直接使用该表达式将表达式分解为:B产品数量A产品数量0)个单元的缓冲区。P1每次用produce()生成一个正整数并用 put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven(
2、)从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述。1.定义信号量 S1 控制 P1 与 P2 之间的同步;S2 控制 P1 与 P3 之间的同步;empty 控制生产者与消费者之间的同步;mutex 控制进程间互斥使用缓冲区。程序如下: Var s1=0,s2=0,empty=N,mutex=1;ParbeginP1:begin X=produce();/*生成一个数*/ P(empty); /*判断缓冲区是否有空单元*/ P(mutex); /*缓冲区是否被占用*/ Put(); If
3、 x%2=0 V(s2);/*如果是偶数,向 P3 发出信号*/ else V(s1);/*如果是奇数,向 P2 发出信号*/ V(mutex); /*使用完缓冲区,释放*/end. P2:begin P(s1);/*收到 P1 发来的信号,已产生一个奇数*/ P(mutex); /*缓冲区是否被占用*/ Getodd(); Countodd():=countodd()+1; V(mutex);/*释放缓冲区*/ V(empty);/*向 P1 发信号,多出一个空单元*/end. P3:begin P(s2) /*收到 P1 发来的信号,已产生一个偶数*/ P(mutex);/*缓冲区是否被占用*/ Geteven(); Counteven():=counteven()+1; V(mutex);/*释放缓冲区*/ V(empty);/*向 P1 发信号,多出一个空单元*/end. Parend.【11真题】