问答题 有一个仓库,可以存放A和B两种产品,仓库的存储空间足够大,每次仅允许一种产品入库一个,而且要求A和B产品要满足如下条件:-N<A产品数量-B产品数量<M。其中,N和M是正整数。试用P操作和V操作描述产品A和产品B的入库过程。
【正确答案】应先将表达式转换成制约条件,不可在程序中直接使用该表达式,将表达式分解为 B产品数量-A产品数量<N A产品数量-B产品数量<M 可以这样理解: ①若只放入A产品,而不放入B产品,则A产品最多可放M-1次便被阻塞,即A进程每操作一次就应当将计数器减1(计数器初值为M-1),当计数器值为0时,进程A被阻塞;每当放入一个B产品,则可令A产品的计数器增加1,表明A产品可以多一次放入产品的机会。 ②同理,若只放入B产品,而不放入A产品,则B产品最多可放N-1次便被阻塞,即B进程每操作一次就应当将计数器减1(计数器初值为N-1)。当计数器值为0时,进程B被阻塞;每当放入一个A产品,则可令B产品的计数器增加1,表明B产品可以多一次放入产品的机会。 由此可见,该问题是一个同步控制问题。又因为一次仅允许一种产品入库,设置信号量mutex控制两进程互斥访问临界资源(仓库)。过程如下: Semaphore mutex=1; Semaphore Sa=M-1; Semaphore Sb=N-1; A() While(true) { P(sa); //先申请资源信号量 P(mutex); //再申请使用仓库 放入一个A产品; v(mutex); //释放仓库 v(Sb); //允许多放一个B产品 } } B() { While(true) { P(Sb); P(mutex); 放入一个B产品; V(mutex); V(Sa); } } ★本题的难点在于对题目条件的分析,反映到代码中就是信号量初值的设定,具体的同步过程非常简单。
【答案解析】