资源描述:
《操作系统进程部分的习题》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、进程部分的习题1.在公共汽车上,司机进程和售票员进程各司其职。司机在正常行车中售票员售票,两者之间没有制约关系,可以任意并发。但是在其他环节,司机和售票员进程之间存在着如下同步关系:1)司机停车后等待售票员关门后才能启动车辆。2)售票员售完票后,等待司机到站停车,停车后才能打开车门。vardoor,stop:semaphore:=0,0;beginparbegin司机进程:beginwhile(true){wait(door);〃等待售票员发送关门信息启动车辆;正常行车;到站停车;signal(stop);//给售票员发送到站信息}end
2、;售票员进程:beginwhile(true){关车门;signal(door);//给司机发送关门信息售票;wait(stop);//等待司机发送到站信息开车门;上下乘客;}end;parend;end.2.某寺庙,有小和尚,老和尚若干。有一水缸,由小和尚提水入缸供老和尚饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次中能容下一个桶取水。水桶总数为3个。每人一次取缸水仅为1桶,且不可同时进行。试用记录型信号量给出有关取水、入水的算法描述。根据题意,定义信号量及其初值如下:(1)水桶为临界资源需互斥使用,定义信号量bucket,因有
3、3个桶,故初值为3;(2)水井一次只能允许下一个桶取水,定义互斥信号量well,初值为1;(3)水缸一次只能允许一个人取水,定义互斥信号量jar,初始值为1;(4)empty和full用于小和尚和老和尚之间的•同步制约关系。因为缸能存10桶水,所以empty初始值为10;开始时缸中没有水,full的初始值为0。semaphorebucket二3,jar=l,full二0,empty二10,well二1;young_monk(){/*小和尚入水算法*/wh订e(l){wait(empty);wait(bucket);wait(well);从
4、水井中打水;signal(well);wait(jar);倒入水缸;signal(jar);signal(bucket);signal(full);)}old_monk(){/*老和尚取水算法*/whi1e(1){wait(full);wait(bucket);wait(jar);从缸中取水;signal(jar);signal(bucket);signal(empty);从桶中倒入饮用;}}1.设有3个进程A、B、C,其中A与B构成一对生产者与消费者(A为生产者,B为消费者),共享一个由n个缓冲区组成的缓冲池;B与C也构成一对生产者与消
5、费者(此时B为生产者,C为消费者),共享另一个由m个缓冲区组成的缓冲池。用信号量机制协调它们的同步问题。Semaphorefulll=0,full2=0,emptyl=n,empty2=m,mutexl=1,mutex2=1;intini=0,outl=0,in2=0,out2=0;Bufferbufferl[n],buffer2[m];A(){while(true){toproduceanitem;wait(emptyl);wait(mutexl);把产品放入bufferl[ini];ini=(inl+1)modn;signal(mut
6、exl);signal(fulll);B(){while(true){wait(fulll);wait(mutexl);从bufferl[outl]获得产品;outl=(outl+1)modn;signal(mutexl);signal(emptyl);•••••••••wait(ompty2);wait(mutex2);把产品放入buffer2[in2];in2=(in2+l)modm;signal(mutex2)signal(ful!2);}}C(){while(true){wait(full2);wait(mutex2);从buff
7、er2[out2]获得产品;out2=(out2+l)modm;signal(mutex2);signal(empty2);}}1.理发店里有一位理发师,一把理发椅和n把供等候理发顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉。当一个顾客到来时,他必须先叫醒理发师。如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,他们就坐下来等;如果没有空椅子,他就离开。用信号量机制来描述他们的行为。Semaphoremax=n+l,next二1,ready=0,finished=0;barber(){while(true){wait(ready
8、);给一个顾客理发;signal(finished);signal(next);}}ustomer(){while(true){wait(max);signal(ready);wait(nex