进程互斥访问&同步问题综合
1窗口n客人叫号
面包师有很多面包,由n名销售人员卖。每个客人进店后取号,并等待叫号。当一名销售人员空闲,就叫下一个号。
n个销售【服务窗口】,n个客人
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| int waitnum=0; int servernum=0; semaphore mutex_waitnum=1,mutex_servernum=1;
customer{ while(1){ P(mutex_waitnum); waitnum+=1; V(mutex_waitnum); } }
server{ while(1){ P(mutex_servernum); if(waitnum<servernum){ servernum+=1; } V(mutex_servernum); } }
semaphore mutex=1; customer{ P(mutex); 取号 V(mutex); V(customer); P(server); 被服务函数 }
server{ P(customer); V(server); 服务函数 }
|
1窗口n客人M椅子,人会离开
理发店里面一位理发师,一把理发椅子和n个等待时椅子。若没有客人,理发师在理发椅子上睡觉。若有客人,客人要叫醒理发师,若理发师在理发又有客人来,若椅子有空,客人在椅子上等待,椅子不空就离开。使用PV操作
本题中,椅子不空就离开。说明不是进程不是一直等待下去,不能直接用P操作,因为P操作会一直等待。需要用状态变量+锁的方式完成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| int wait=0,chair=n; semaphore mutex_wait=1; semaphore server=0; semaphore customer=0;
customer{ P(mutex_wait); if(wait<chair){ wait+=1; V(customer); V(mutex); P(server); 被理发函数 } else{ V(mutex_wait); } }
barber{ P(customer); P(mutex_wait); wait-=1; V(server); V(mutex_wait); 理发函数 }
|
1窗口n客人M椅子,人不离开
银行提供一个服务窗口和10个等待座位。客人到达银行时,若有空位,则到取号机拿号并坐下等待。否则就一直等待空座位再拿号。取号机每次仅允许一个人使用。营业员空闲时,叫号一个客人并服务。
本题中,椅子不空就等待,可以使用PV
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| semaphore chair=10; semaphore mutex=1; semaphore customer=0; semaphore server=0;
customer{ P(chair); P(mutex); 取号函数 V(mutex); V(customer); P(server); 被服务函数 }
server{ P(customer); V(chair); V(server); 服务函数 }
|
双资源生产者问题
小和尚,老和尚若干。有一个水缸,只能小和尚提水给老和尚用。水缸可以容10桶水,水取自同一个水井。水井每次只能由一桶水,一共有3个水桶。水缸一次只能入一桶水。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| semaphore mutex_shaft=1; semaphore mutex_tank=1; semaphore bucket=3; semaphore tank_empty=10; semaphore tank_full=0;
老{ P(tank_full); P(bucket); P(mutex_tank); 取水 V(mutex_tank); V(bucket); V(tank_empty); }
小{ P(tank_empty); P(bucket); P(mutex_shaft); 从水井打水 V(mutex_shaft); P(mutex_tank); 放水 V(mutex_tank); V(bucket); V(tank_full); }
|
多进程同步问题
三个合作进程P1,P2,P3。者通过同一个设备输入各自的数据a,b,c。输入设备互斥使用。a为第一个输入必须由P1读取。b为第二个输入必须由P2读取。c为第二个输入必须由P3读取。然后进行以下运算
P1:x=a+b;
P2:y=a*b;
P3:z=y+c-a;
最后,由P1通过打印机将x,y,z打印出来。
因为规定了P1先取a,P2再取b,P3最后取C。设置fetch_a=1;fetch_b=0;fetch_c=0;表示a可以取
P1需要等待P2读取b,则有个信号量b_done
P3需要等待P2计算出y,则有个信号量y_done
P1最后需要等待P3计算出z,则有个信号量z_done
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| semaphore fetch_a=1; semaphore fetch_b=1; semaphore fetch_c=1;
P1{ P(fetch_a); 取a数据 V(fetch_b); P(b_done); x=a+b; P(z_done); 打印x,y,z }
P2{ P(fetch_b); 取b数据 V(fetch_c); y=a*b; V(y_done); }
P3{ P(fetch_c); 取c数据 P(y_done); z=y+c-a; V(z_done); }
|
未完……