进程部分的习题1. 在公共汽车上,司机进程和售票员进程各司其职。
司机在正常行车中售票员售票,两者之间没有制约关系,可以任意并发。
但是在其他环节,司机和售票员进程之间存在着如下同步关系:1)司机停车后等待售票员关门后才能启动车辆。
2)售票员售完票后,等待司机到站停车,停车后才能打开车门。
var door,stop:semaphore:=0,0beginparbegin司机进程:beginwhile(true){wait(door); //等待售票员发送关门信息启动车辆;正常行车;到站停车;signal(stop);//给售票员发送到站信息}end;售票员进程:beginwhile(true){关车门;signal(door); //给司机发送关门信息售票;wait(stop);//等待司机发送到站信息开车门;上下乘客;}endparendend.2.某寺庙,有小和尚,老和尚若干。
有一水缸,由小和尚提水入缸供老和尚饮用。
水缸可容10桶水,水取自同一井中。
水井径窄,每次中能容下一个桶取水。
水桶总数为3个。
每人一次取缸水仅为1桶,且不可同时进行。
试用记录型信号量给出有关取水、入水的算法描述。
根据题意,定义信号量及其初值如下:(1)水桶为临界资源需互斥使用,定义信号量bucket,因有3个桶,故初值为3;(2)水井一次只能允许下一个桶取水,定义互斥信号量well,初值为1;(3)水缸一次只能允许一个人取水,定义互斥信号量jar,初始值为1;(4)empty和full用于小和尚和老和尚之间的同步制约关系。
因为缸能存10桶水,所以empty初始值为10;开始时缸中没有水,full的初始值为0。
semaphore bucket=3,jar=1,full=0,empty=10,well=1; young_monk(){ /*小和尚入水算法*/while(1){wait(empty);wait (bucket);wait (well);从水井中打水;signal(well);wait (jar);倒入水缸;signal (jar);signal (bucket);signal (full);}}old_monk(){ /*老和尚取水算法*/while(1){wait(full);wait (bucket);wait (jar);从缸中取水;signal (jar);signal (bucket);signal (empty);从桶中倒入饮用;}}3.设有3个进程A、B、C,其中A与B构成一对生产者与消费者(A为生产者,B为消费者),共享一个由n个缓冲区组成的缓冲池;B与C也构成一对生产者与消费者(此时B为生产者,C为消费者),共享另一个由m个缓冲区组成的缓冲池。
用信号量机制协调它们的同步问题。
Semaphore full1 = 0, full2 = 0, empty1 = n, empty2 = m, mutex1 = 1, mutex2 = 1;int in1 = 0, out1 = 0, in2 = 0, out2 = 0;Buffer buffer1[n], buffer2[m];A( ){while(true){to produce an item;wait(empty1);wait(mutex1);把产品放入buffer1[in1];in1 = (in1+1) mod n;signal(mutex1);signal(full1);}}B( ){while(true){wait(full1);wait(mutex1);从buffer1[out1]获得产品;out1 = (out1+1) mod n;signal(mutex1);signal(empty1);………wait(empty2);wait(mutex2);把产品放入buffer2[in2];in2 = (in2+1) mod m;signal(mutex2)signal(full2);}}C( ){while(true){wait(full2);wait(mutex2);从buffer2[out2]获得产品;out2 = (out2+1) mod m;signal(mutex2);signal(empty2);}}4.理发店里有一位理发师,一把理发椅和n把供等候理发顾客坐的椅子。
如果没有顾客,理发师便在理发椅上睡觉。
当一个顾客到来时,他必须先叫醒理发师。
如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,他们就坐下来等;如果没有空椅子,他就离开。
用信号量机制来描述他们的行为。
Semaphore max=n+1, next=1, ready=0, finished=0;barber( ){while(true){wait(ready);给一个顾客理发;signal(finished);signal(next);}}ustomer( ){while(true){wait(max);wait(next);让理发师理发;wait(finished);signal(max);离开;}}5.三个进程P1,P2,P3互斥使用一个包含N(N>0)个单元的缓冲区。
P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。
请用信号量机制实现这3个进程的同步与互斥活动。
Semaphore mutex=1, empty = N, even = 0, odd = 0;P1(){while(true){int n;n = produce();wait(empty)wait(mutex);put()signal(mutex)if n mod 2 == 0elsesignal(odd) }}P2(){while(true){wait(odd);wait(mutex);getodd();signal(mutex);signal(empty);countodd();}}P3(){while(true){wait(even);wait(mutex);geteven();signal(mutex);signal(empty);counteven();}}6.某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A,B两种零件,装配车间的任务是把A,B两种零件组装成产品。
两个生产车间每生产一个零件后都要分别把它们送到装配车间的货架F1,F2上。
F1存放A,F2存放B,F1和F2的容量均为10.装配工人每次从货架上取一个A零件和一个B零件后组装成产品。
请用信号量机制来协调它们的过程。
Semaphore mutex1=1, mutex2=1, full1=0, full2=0, empty1=10, empty2=10;int in1 = in2 = out1 = out2 = 0;Buffer F1[10], F2[10]P1(){while(true){produce an item of A;wait(empty1);wait(mutex1);put the item into F1[in1];in1++;signal(mutex1);signal(full1);}}P2(){while(true){produce an item of B;wait(empty2);wait(mutex2);put the item into F2[in2];in2++;signal(mutex2);signal(full2);}}P3(){while(true){wait(full1);wait(mutex1);get the item into F1[out1];out1++;signal(mutex1);signal(empty1);wait(full2);wait(mutex2);get the item into F2[out2];out2++;signal(mutex2);signal(empty2);组装产品}}7.某高校计算机系开设网络课并安排上机实习,假设机房共有2m台计算机,有2n名学生选该课程,其中m < n,并规定:1) 每两个学生组成一组,各占一台计算机,协同完成上机实习。
2) 只有两个学生到达可以组成一组,并且此时机房有空闲计算机时,机房管理员才让该组学生进入机房。
3) 上机实习由一名教师检查,检查完毕,一组学生同时离开机房。
试用信号量机制实现教师进程teacher(),机房管理员进程guard()和学生进程student_i()之间的同步关系。
Semaphore student= 0, enter = 0,computers= 2m, finished=0, exam = 0student_i(){signal(student);wait(enter);wait(computers);完成工作;signal(finished)wait(exam);检查完毕;signal(computers)离开;}guard( ){int i;for (i=0; i++; i<n){wait(computers);wait(computers);wait(student);wait(student);signal(enter);signal(enter);}}teacher(){int i;for (i=0; i++, i<n){wait(finished);wait(finished);检查两个学生的实习结果;signal(exam);signal(exam);}}8.桌上有一只盘子,每次只能放入一个水果。
爸爸专向盘子里放苹果,妈妈专向盘子里面放橘子,唯一的儿子专吃盘子中的橘子,唯一的女儿专吃盘子中的苹果。
仅当盘子空闲时,爸爸或妈妈才可向盘子里存放一个水果。
仅当盘子中有自己需要的水果时,儿子或女儿才可从盘子里取出一个水果。
把爸爸、妈妈、儿子、女儿看作4个进程,请用信号量机制进行管理,使得4个进程能正确地并发执行。
Semaphore plate=1,apple=0,orange=0Dad(){While(1){To prepare an apple;Wait (plate);To put the apple on the plate;Signal(plate);Signal(apple);}}Mom同dadSon (){While(1){Wait(orange);Wait(plate);To get an orange from the plate; Signal (plate);To eat the orange;}}Daughter同son。