您好,欢迎访问三七文档
信号量习题Buffer1=sBuffer2=hPAPBPCavail1=savail2=hfull1=0full2=0mutex1=1mutex2=1•PA:BeginL1:readfromdiskP(avail1)P(mutex1);Puttobuffer1;V(full1)V(mutex1)GotoL1;End•PB:BeginL2:P(full1)P(mutex1);Getfrombuffer1;V(avail1)V(mutex1)P(avail2)P(mutex2);Puttobuffer2;V(full2)V(mutex2)GotoL2;End•PC:BeginL3:P(full2)P(mutex2)Getfrombuffer2V(avail2)V(mutex2)GotoL3;End进程同步•北京大学研究生考试题•1.写出P,V操作的定义•2.有3个进程PA,PB和PC协作解决文件打印问题:PA将文件记录从磁盘读入主存的缓存区1,每执行一次读一个记录;PB将缓冲区1的内容复制到缓冲区2,每执行一次复制一个记录;PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小和一个记录大小一样。请用P,V操作来保证文件的正确打印。定义信号量并初始化•Integermutex1,mutex2,avail1,full1,avail2,full2•mutex1=1;•mutex2=1;•avail1=1;•avail2=1;•full1=0;•full2=0•PAL1:readfromdisk;P(avail1);P(mutex1);Puttobuffer1;V(full1);V(mutex1);GotoL1;•PBL2:P(full1);P(mutex1);Getfrombuffer1;V(avail1);V(mutex1);P(avail2);P(mutex2);puttobuffer2;V(full2);V(mutex2)GotoL2;•PCL3:P(full2);P(mutex2);Getfrombuffer2;V(avail2);V(mutex2);Printrecord;GotoL3;•有一个仓库库存两种零件A,B,最大库存容量各为m个。有一车间不断地取A和B进行装配,每次取一个。为避免零件锈蚀,遵循先入库先出库的原则。有两组供应商分别不断地供应A和B(每次一个)。为保证合理库存,当某种零件的数量比另一种的数量超过n(nm)个时,暂停对数量大的零件进货,集中补充数量少的零件,试用P,V操作正确实现之。初始化•integermutex,availa,fulla,availb,fullb,sa,sb;•mutex=1;•availa=m;fulla=0;•availb=m;fullb=0;•sa=n;sb=n;Store_A进程•L1:P(availa);P(sa);P(mutex);StoreAV(fulla);V(sb);V(mutex);GotoL1;Store_B进程•L2:P(availb);P(sb);P(mutex);StoreBV(fullb);V(sa);V(mutex);GotoL2;take进程•L3:P(fulla);P(fullb);P(mutex);TakeAandB;V(availa);V(availb);V(mutex);GotoL3;•理发店里有一位理发师、一把理发椅子和五把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉。当一个顾客到来时,他必须先叫醒理发师,如果理发师正在理发时又有顾客来到,而如果有空椅子可坐,他们就坐下来等,如果没有空椅子,他就离开。这里的问题是为理发师和顾客各编写一段程序来描述他们行为,并用wait和signal原语操作实现其同步。•解:理发师问题•#defineCHAIRS5/*为等候的顾客准备椅子数*/•typedefintsemaphore;/*运用你的想像力*/•semphorecustomers=0;/*等候服务的顾客数*/•semaphorebarbers=0/*等候服务的理发师数*/•semaphoremutex=1;/*用于互斥*/•intwaiting=0;/*还没理发的等候顾客*/voidbarber(void){•while(TRUE){•wait(customers);/*如果顾客数是0,则睡觉*/•wait(mutex);/*要求进程等候*/•waiting=waiting-1;/*等候顾客数减1*/•signal(barbers);/*一个理发师现在开始理发*/•signal(mutex);/*释放等候*/•cut_hair();/*理发(非临界区操作)*/•}•voidcustomers(void){•wait(mutex);•if(waitingCHAIRS){•waiting=waiting+1;•signal(customers);•signal(mutex);•wait(barbers);•}else{•signal(mutex);•}}••假定系统有三个并发进程read,move和print共享缓冲器B1和B2。进程read负责从输入设备上读信息,每读出一个记录后把它存放到缓冲器B1中。进程move从缓冲器B1中取出一记录,加工后存入缓冲器B2。进程print将B2中的记录取出打印输出。缓冲器B1和B2每次只能存放一个记录。要求三个进程协调完成任务,使打印出来的与读入的记录的个数,次序完全一样。请用wait和signal原语写出它们的并发程序。•解:beginSR,SM1,SM2,SP:semaphore;•B1,B2:record;•SR:=1;SM1:=0;SM2:=1;SP:=0•Cobegin•processread•X:record;•beginR:(接收来自输入设备上一个记录)•X:=接收的一个记录;•waiut(SR);•B1:=X;•signal(SM1);•gotoR;•end;•Processmove•Y:record;•Begin•M:wait(SM1);•Y:=B1;•signal(SR)•加工Y•wait(SM2);•B2:=Y;•signal(SP);•gotoM;•end;•Processprint•Z:record;•Begin•P:wait(SP);•Z:=B2;•signal(SM2)•打印Z•gotoP;•end;•coend;•end;
本文标题:信号量习题
链接地址:https://www.777doc.com/doc-3359325 .html