2014.9作业1答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我们的解法使用三个信号量:customers,用来记录等候理发的顾客数(不包括正在理发的顾客);barbers,记录正在等候顾客的理发师数,为0或1;mutex,用于互斥。我们还需要一个变量waiting,它也用于记录等候的顾客数,实际上是customers的一份拷贝。之所以使用waiting是因为无法读取信号量的当前值。在该解法中,进入理发店的顾客必须先看等候的顾客数,如果少于椅子数,他留下来等,否则他就离开。
V(mutex); //退出临界区,完成对waiting的修改
P(barbers);//理发师是否空闲,若忙则阻塞
get_haircut();
}eBiblioteka Baiduse
V(mutex);//店里人满了,不等了
}
应该设置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
void barber()
{
while(1)
{
P(customers); //如果没有顾客,则理发师打瞌睡,阻塞进程
P(mutex); //互斥进入临界区,欲修改waiting
waiting--; //等待理发人数减1
V(barbers); //理发师开始理发
V(mutex); //退出临界区,完成对waiting的修改
cut_hair(); //理发(在临界区之外)
}
}
void customer()
{
P(mutex);//互斥进入临界区,欲修改waiting
if(waiting﹤CHAIRS)//如果没有空的椅子就离开
{
waiting++; //等待理发的人数加1
V(customers);//等待理发的人数加1。若有必要,唤醒理发师
1.1.桌上有一空盘,允许存放一只水果。爸爸向盘中放苹果,妈妈向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、妈妈、儿子、女儿四个并发进程的同步。
1.找出进程的数量及其关系(同步互斥)
2.设置信号量(含义和初值)
3.描述每一个进程
#define CHAIRS 5
typedefintsemaphone ; /*运用你的想象力*/
semaphore customers=0; /*等待服务的顾客数*/
semaphore barbers=0; /*等待顾客的理发师数*/
semaphore mutex=1; /*用于互斥*/
int waiting=0; /*等待的顾客(还没理发的)*/
IntSp=1
IntSapple=0
IntSorange=0
void process 父亲()
{
P(Sp)SP=0
放苹果在盘子
V(Sapple)Sapple=1
}
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操作实现它们之间的相互制约。
begin stop ,run:semaphore
stop:=0;run:=0;
cobegin
driver: begin
L1: P(run);
启动车辆;
正常行车;
到站停车;
V(stop);
goto L1;
end;
4.睡眠理发师问题:理发店里有一位理发师、一把理发椅和n 把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉;当一个顾客到来时,它必须叫醒理发师;如果理发师正在理发时又有顾客来到,那么,如果有空椅子可坐,顾客就坐下来等待,否则就离开理发店。
3.设在公共汽车上,司机和售票员的活动分别是:司机:启动车辆,正常行车,到站停车。售票员:上乘客,关车门,售票,开车门,下乘客。用PV操作对其控制。
现在我们表述:司机进程设置一个私有信号量run,用于判断司机能否进行工作,初值为0。售票员进程设置一个私有信号量stop,用于判断是否停车,售票员是否能够开车门,初值为0。
V(mutex); //退出临界区,完成对waiting的修改
P(barbers);//理发师是否空闲,若忙则阻塞
get_haircut();
}eBiblioteka Baiduse
V(mutex);//店里人满了,不等了
}
应该设置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
void barber()
{
while(1)
{
P(customers); //如果没有顾客,则理发师打瞌睡,阻塞进程
P(mutex); //互斥进入临界区,欲修改waiting
waiting--; //等待理发人数减1
V(barbers); //理发师开始理发
V(mutex); //退出临界区,完成对waiting的修改
cut_hair(); //理发(在临界区之外)
}
}
void customer()
{
P(mutex);//互斥进入临界区,欲修改waiting
if(waiting﹤CHAIRS)//如果没有空的椅子就离开
{
waiting++; //等待理发的人数加1
V(customers);//等待理发的人数加1。若有必要,唤醒理发师
1.1.桌上有一空盘,允许存放一只水果。爸爸向盘中放苹果,妈妈向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、妈妈、儿子、女儿四个并发进程的同步。
1.找出进程的数量及其关系(同步互斥)
2.设置信号量(含义和初值)
3.描述每一个进程
#define CHAIRS 5
typedefintsemaphone ; /*运用你的想象力*/
semaphore customers=0; /*等待服务的顾客数*/
semaphore barbers=0; /*等待顾客的理发师数*/
semaphore mutex=1; /*用于互斥*/
int waiting=0; /*等待的顾客(还没理发的)*/
IntSp=1
IntSapple=0
IntSorange=0
void process 父亲()
{
P(Sp)SP=0
放苹果在盘子
V(Sapple)Sapple=1
}
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操作实现它们之间的相互制约。
begin stop ,run:semaphore
stop:=0;run:=0;
cobegin
driver: begin
L1: P(run);
启动车辆;
正常行车;
到站停车;
V(stop);
goto L1;
end;
4.睡眠理发师问题:理发店里有一位理发师、一把理发椅和n 把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉;当一个顾客到来时,它必须叫醒理发师;如果理发师正在理发时又有顾客来到,那么,如果有空椅子可坐,顾客就坐下来等待,否则就离开理发店。
3.设在公共汽车上,司机和售票员的活动分别是:司机:启动车辆,正常行车,到站停车。售票员:上乘客,关车门,售票,开车门,下乘客。用PV操作对其控制。
现在我们表述:司机进程设置一个私有信号量run,用于判断司机能否进行工作,初值为0。售票员进程设置一个私有信号量stop,用于判断是否停车,售票员是否能够开车门,初值为0。