进程同步的几个经典案例

苹果与橘子问题
问题描述:
桌子上有一只盘子,每次只能放入一个水果。爸爸专向盘中放苹果,妈妈专向盘中放橘子,女儿专吃盘中的苹果,儿子专吃盘中的橘子。试用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);
  • 10
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值