【操作系统】计算机操作系统-信号量的应用 、PV操作经典习题及代码表示
题目1:
某交通路口设置了一个自动计数系统,该系统由“观察者”进程和“报告者”进程组成。观察者进程能识别卡车,并对通过的卡车计数;报告者进程定时(可设为每隔1小时,准点时)将观察者的计数值打印输出,每次打印后把计数值清“0”。两个进程的并发执行可完成对每小时中卡车流量的统计。
代码如下:
struct semaphore S ;
int count = 0 ;
S.value = 1 ;
process observer
{
while (condition)
{
observe a lorry;
wait(S);
count = count + 1;
signal(S);
}
}
process reporter
{
while (condition)
{
wait(S);
print(count);
count = 0;
signal(S);
}
}
题目2:
利用信号量,按语句的前趋关系,写出一个可以并发的程序

图中表示:
·进程P1中有语句S1;
·进程P2中有语句S2;
……
·语句S1执行后才能执行语句S2和语句S3;
·语句S2执行后才能执行语句S4和S5;
·语句S3、S4和S5执行后,才能执行语句S6。
代码如下:
struct semaphore a,b,c,d,e,f,g ;
a.value=b.value=c.value=0;
d.value=e.value=g.value=0;
parbegin /*parbegin表示并发执行开始*/
process P1:{ S1;signal(a);signal(b); }
process P2:
{ wait(a);S2;signal(c);signal(d); }
process P3:{ wait(b);S3;signal(e); }
process P4:{ wait(c);S4;signal(f); }
process P5:{ wait(d);S5;signal(g); }
process P6:
{ wait(e);wait(f);wait(g);S6; }
parend /*用parend表示并发执行结束 */
写出一个可并发执行的程序。写出一个可并发执行的程序。写出一个可并发执行的程序。
题目3:
在一个盒子里,混装了数量相等的黑白围棋子。现在用自动分拣系统把黑子、白子分开,设分拣系统有两个进程P1和P2,其中P1拣白子,P2拣黑子。规定当一个进程拣了一子后,必须让另一个进程去拣。用信号量和PV操作协调两进程的活动。
代码如下:
Struct semaphore S1, S2;
S1.value=1; S2.value=0;
cobegin
process P1(){
while(true){
P(S1);
拣白子
V(S2);
}
}
process P2(){
while(true){
P(S2);
拣黑子
V(S1);
}
}
coend
题目4:
图书馆规定,每位进入图书馆的读者要在登记表上登记,退出时要在登记表上注销。
(1)用信号量实现读者之间的互斥登记和注销。
(2)图书馆共有100个座位,当图书馆中没有空座位时,后到的读者在图书馆要等待(阻塞)
代码如下:
Struct semaphore MUTEX;
MUTEX.value=1;
Struct semaphore S;
S.value=100;
Readeri(){
P(S);
P(MUTEX);
登记;
V(MUTEX);
阅读;
P(MUTEX);
注销;
V(MUTEX);
V(S);
}
题目5:
一家四人父、母、儿子、女儿围桌而坐;桌上有一个水果盘; 当水果盘空时,父亲可以放香蕉或者母亲可以放苹果,但盘中已有水果时,就不能放,父母等待。当盘中有香蕉时,女儿可吃香蕉,否则,女儿等待;当盘中有苹果时,儿子可吃,否则,儿子等待。
代码如下:
struct semaphore S1, S2, S3;
S1.value = 1;
S2.value = 0;
S3.value = 0;
father(){
wait(S1);
放香蕉;
signal(S2);
}
mather(){
wait(S1);
放苹果;
signal(S3);
}
son(){
wait(S3);
吃苹果;
signal(S1);
}
daughter(){
wait(S2);
吃香蕉;
signal(S1);
}
题目6:
在公共汽车上,司机和售票员的活动分别是:
司机的活动: 启动车辆
正常运行
到站停车
售票员的活动: 关车门
售票
开车门
在汽车不断的到站,停车,行驶过程中,司机和售票员
的活动有什么同步关系?用信号量和P,V操作实现.
代码如下:
struct semaphore S1, S2;
S1.value = 0;
S2.value = 0;
driver(){
wait(S1);
启动车辆;
车辆行驶;
停止行驶;
signal(S2);
}
casher(){
关车门;
signal(S1);
售票;
wait(S2);
开门;
}
题目7:
有一个超市,最多可容纳N个人进入购物,当N个顾客满员时,后到的顾客在超市外等待;超市中只有一个收银员。可以把顾客和收银员看作两类进程,两类进程间存在同步关系。写出用P;V操作实现的两类进程的算法
代码如下:
struct semaphore S, S1, S2, S3;
S.value = N;
S1.value = 0;
S2.value = 0;
S3.value = 1;
customer(){
wait(S);
进入;
购物;
}
wait(S3){
付钱;
signal(S1);
wait(S2);
离开;
signal(S);
}
casher(){
wait(S1);
收钱;
signal(S3);
signal(S2);
}
题目8:
有一座东西方向的独木桥;用P,V操作实现:
(1) 每次只允许一个人过桥;
(2) 当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待。
(3) 当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向,只允许一个人单独过桥。
代码如下:
semaphore wait, mutex1, mutex2;
mutex1.value = mutex2.value = 1; wait = 0;
int count1, count2;
count1 = count2 = 0;
begin_together
process P East(){
P(mutex1);
count1++;
if(count1 == 1)
P(wait);
V(mutex1);
pass the bridge;
P(mutex1);
count1--;
if(count1 == 0)
V(wait);
V(mutex1);
}
process P West(){
P(mutex2);
count2++;
if(count2 == 1)
P(wait);
V(mutex2);
pass the bridge;
P(mutex2);
count2--;
if(count2 == 0)
V(wait);
V(mutex2);
}
end_together
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/d5d818eed5.html
