苹果与橘子问题
问题描述:
桌子上有一只盘子,每次只能放入一个水果。爸爸专向盘中放苹果,妈妈专向盘中放橘子,女儿专吃盘中的苹果,儿子专吃盘中的橘子。试用P、V操作实现父、母、儿、女进程的同步。
解决方案:
由题可知,盘子为互斥资源,因为可以放一个水果,所以empty初值为1;信号量mutex控制对盘子的互斥访问,初值为1;apple 和orange 分别表示盘中苹果和橘子的个数,初值为0。
semaphore empty=1,mutex=1,apple=0,orange=0;
void father(){
do{
P(empty); //等待盘子为空
P(metux); //等待获取对盘子的操作
爸爸向盘中放一个苹果;
V(mutex); //释放对盘子的操作
V(apple); //通知女儿可以来盘子中取苹果
}while(TRUE);
}
void mather(){
do{
P(empty); //等待盘子为空
P(metux); //等待获取对盘子的操作
妈妈向盘中放一个桔子;
V(mutex); //释放对盘子的操作
V(orange); //通知儿子可以来盘子中取橘子
}while(TRUE);
}
void son(){
do{
P(orange); //判断盘子中是否有桔子
P(metux); //等待获取对盘子的操作
儿子取出盘中的桔子;
V(mutex); //释放对盘子的操作
V(empty); //盘子空了,可以继续放水果了
}while(TRUE);
}
void daugther(){
do{
P(apple); //判断盘子中是否有苹果
P(metux); //等待获取对盘子的操作
女儿取出盘中的苹果;
V(mutex); //释放对盘子的操作
V(empty); //盘子空了,可以继续放水果了
}while(TRUE);
}
void main() { //四个并发进程的同步执行
cobegin
father(); mather(); son(); daugther();
coend
}
共享缓冲区问题
问题描述:
在某一自动测量系统中要完成采样、转换和显示等任务。采样过程把从传感器上得到的整型微电压值存入一个缓冲区,转换过程把微电压值从缓冲区取出,计算转换成量度值再存入该缓冲区,显示过程把缓冲区中的量度值取出并显示。用PV操作实现三个过程共享缓冲区的同步问题,并说明信号量的作用。
解决方案:
begin
semaphore S1=1; (空)
semaphore S2=0;(有电压)
semaphore S3=0;(有量度)(信号量的作用:实现采样、转换和显示过程的同步)
cobegin
process 采样
begin
L1:得到一个微电压值;
P(S1);
将微电压值存入缓冲区;
V(S2);
goto L1;
end
process 转换
begin
L2:P(S2);
从缓冲区中取出微电压值;
将微电压值转换成量度值;
将量度值存入缓冲区;
V(S3);
goto L2;
end
process 显示
begin
L3:P(S3);
从缓冲区中取出量度值;
V(S1);
显示量度值;
goto L3;
end
coend
end
图书馆登记问题
问题描述:
图书阅览室共有座位200个,并提供一个登记表,读者进入阅览室需先领取座位号牌并在登记表上进行登记;读者离开阅览室时必须在登记表中记录离开的时间并交回座位号牌。试用P、V操作描述读者进程的并发过程。
解决方案:
资源信号量S,初值200,表示图书馆中有200个座位。
互斥信号量mutex,初值为1,表示只能同时登记一个人。
算法描述:
P(S);
P(mutex);
登记进入。
V(mutex);
阅览。
P(mutex);
登记离开。
V(mutex);
V(S);