【操作系统】计算机操作系统-信号量的应用 、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: 

利用信号量,按语句的前趋关系,写出一个可以并发的程序

【操作系统】计算机操作系统-信号量的应用 、PV操作经典习题及代码表示

图中表示:

·进程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