- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2014.9作业1答案
1.1. 桌上有一空盘,允许存放一只水果。爸爸向盘中放苹果,妈妈向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、妈妈、儿子、女儿四个并发进程的同步。1.找出进程的数量及其关系(同步互斥)
2.设置信号量(含义和初值)
3.描述每一个进程
Int Sp=1
Int Sapple=0
Int Sorange=0
void process 母亲()
{
P(Sp) SP=-1
放桔子在盘子
V(Sorange)
}
void process 父亲()
{
P(Sp) SP=0
放苹果在盘子
V(Sapple) Sapple=1
}
Void process女儿()
{
P(Sapple)
从盘子拿苹果
V(Sp)
吃苹果
}
Void process son()
{
P(Sorange)
从盘子拿桔子
V(Sp)
吃桔子
}
2.有三个进程A1,A2,A3,它们共享两个缓冲区B1和B2,缓冲区B1中可存放n件产品,缓冲区B2中可存放m件产品,进程A1每次生产一件产品,并把产品放入缓冲区B1中,进程A2每次从缓冲区B1中取出一件产品,再把该产品送到缓冲区B2中,进程A3每次从缓冲区B2中取出一件产品进行消费。为了防止把产品存入已满的缓冲区,或从空缓冲区中取产品,或重复取同一产品,用PV操作实现它们之间的相互制约。
应该设置S1,S2,S3,S4四个信号量,S1,S2表示缓冲区B1中的可存产品和可供消费的产品。S3,S4表示缓冲区B2中的可存产品和可供消费的产品数目。设置B1B2的互斥信号量MUTEX1=1,MUTEX2=1
同时为了正确的存产品和取产品,可用两队指针R1,T1和R2,T2指出当前存放的位置。
程序如下:A1,B1,A2 A2,B2,A3
3.设在公共汽车上,司机和售票员的活动分别是:司机:启动车辆,正常行车,到站停车。售票员:上乘客,关车门,售票,开车门,下乘客。用PV操作对其控制。
现在我们表述:司机进程设置一个私有信号量run,用于判断司机能否进行工作,初值为0。售票员进程设置一个私有信号量stop,用于判断是否停车,售票员是否能够开车门,初值为0。
begin stop ,run:semaphore
stop:=0;run:=0;
cobegin
conductor:begin
L2:上乘客;
关车门;
V(run);
售票;
P(stop);
开车门;
下乘客;
goto L2;
end;
coend;
end;
driver: begin
?? L1: P(run);
启动车辆;
正常行车;
到站停车;
V(stop);
goto? L1;
end;
4. 睡眠理发师问题:理发店里有一位理发师、一把理发椅和n 把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉;当一个顾客到来时,它必须叫醒理发师;如果理发师正在理发时又有顾客来到,那么,如果有空椅子可坐,顾客就坐下来等待,否则就离开理发店。
我们的解法使用三个信号量:customers,用来记录等候理发的顾客数(不包括正在理发的顾客);barbers,记录正在等候顾客的理发师数,为0或1;mutex,用于互斥。我们还需要一个变量waiting,它也用于记录等候的顾客数,实际上是customers的一份拷贝。之所以使用waiting是因为无法读取信号量的当前值。在该解法中,进入理发店的顾客必须先看等候的顾客数,如果少于椅子数,他留下来等,否则他就离开。
#define CHAIRS 5
typedefintsemaphone ; /*运用你的想象力*/
semaphore customers=0; /*等待服务的顾客数*/
semaphore barbers=0; /*等待顾客的理发师数*/
semaphore mutex=1; /*用于互斥*/
int waiting=0; /*等待的顾客(还没理发的)*/
void barber()
{
while(1)
{
P(customers); //如果没有顾客,则理发师打瞌睡,阻塞进程
P(mutex); //互斥进入临界区,欲修改waiting
waiting--; //等待理发人数减1
V(barbers); //理发师开始理发
V(mutex); //退
文档评论(0)