问答题
有一个仓库,可以存放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);
}
}
★本题的难点在于对题目条件的分析,反映到代码中就是信号量初值的设定,具体的同步过程非常简单。
【答案解析】