操作系统原理之经典PV问题

本文记录9道PV问题的解,不保证正确,仅供参考,,1、 有一个仓库,可以存放 A 和 B 两种产品,仓库的存储空间足够大,但要求:( 1)一次只能存入一种产品( A 或 B);( 2) -N < (A 产品数量-B 产品数量) < M。其中, N 和 M 是正整数。试用“存放 A”和“存放 B”以及 P、 V 操作描述产品 A 与产品 B 的入库过程。 1 Se...
摘要由CSDN通过智能技术生成

本文记录9道PV问题的解,不保证正确,仅供参考,,

 

1、 有一个仓库,可以存放 A 和 B 两种产品,仓库的存储空间足够大,但要求:
( 1)一次只能存入一种产品( A 或 B);
( 2) -N < (A 产品数量-B 产品数量) < M。
其中, N 和 M 是正整数。试用“存放 A”和“存放 B”以及 P、 V 操作描述产品 A 与
产品 B 的入库过程。

 

 1 Semaphore mutex = 1;   //互斥信号量
 2 Semaphore a = M-1 ;   //存放A的资源信号量,初值为M-1
 3 Semaphore b = N-1;      //存放B的资源信号量,初值为N-1
 4 存放 A:
 5 {
 6 while(true)
 7 {
 8         Get A;
 9         P(&a); 
10          P(&mutex); 
11 Put A;  
12 V(&mutex);  
13 V(&b);
14 }  
15 } 
16 存放B:
17 { 
18 while(true)
19 { 
20         Get B;
21         P(&b);
22         P(&mutex);
23         Put B;
24         V(&mutex);
25         V(&a);
26 }
27 }

 

 


2、 桌子上有一只盘子,最多可容纳两个水果,每次只能放入或取出一个水果。爸爸专向盘
子放苹果( apple),妈妈专向盘子中放桔子( orange);两个儿子专等吃盘子中的桔子,
两个女儿专等吃盘子中的苹果。请用 P、 V 操作来实现爸爸、妈妈、儿子、女儿之间的
同步与互斥关系。

 

 1 Semaphore mutex = 1;      //互斥信号量, 其初值为1
 2 Semaphore empty = 2;       //记录允许向盘子中放入水果的个数,初值为2
 3 Semaphore orange = 0;      //盘子中已放入的苹果的个数,初值为0
 4 Semaphore apple = 0;      //盘子中已放入的桔子的个数,初值为0
 5 main()  
 6 {   
 7 Cobegin  
 8 {   
 9   father                    //父亲进程  
10     {   
11     while (true)  
12        {   
13            P(empty);           //减少盘中可放入的水果数  
14                 P(mutex);           //申请向盘中取、放水果  
15                 向盘中放苹果;  
16                 V(mutex);           //允许向盘中取、放水果  
17                 V(apple);           //递增盘中的苹果数  
18         }  
19      }  
20     mother                    //母亲进程  
21     {   
22     while (true)  
23        {   
24           P(empty);           //减少盘中可放入的水果数  
25                 P(mutex);           //申请向盘中取、放水果  
26                 向盘中放桔子;  
27                 V(mutex);           //允许向盘中取、放水果  
28                 V(orange);          //递增盘中的桔子数  
29         }  
30     }  
31     daughteri(i=1,2//两女儿进程  
32     {   
33     while (true)  
34        {   
35             P(apple);           //减少盘中苹果数  
36                 P(mutex);           //申请向盘中取、放水果  
37                 取盘中苹果;  
38                 V(mutex);           //允许向盘中取、放水果  
39                 V(empty);           //递增盘中可放入的水果数  
40         }  
41      }  
42     sonj(j=1,2//两儿子进程  
43     {   
44     while (true)  
45        {   
46           P(orange);          //减少盘中桔子数  
47                 P(mutex);           //申请向盘中取、放水果  
48                 取盘中桔子;  
49                 V(mutex);           //允许向盘中取、放水果  
50                 V(empty);           //递增盘中可放入的水果数  
51         }  
52      }  
53    }  
54     Coend  
55 }  

 

 

 


3、 有一个理发师,一把理发椅和 N 把供等候理发的顾客坐的椅子。如果没有顾客,则理发
师便在理发师椅子上睡觉;当一个顾客到来时,必须唤醒理发师进行理发;如果理发师
正在理发时又有顾客来到,则如果有空椅子可坐,他就坐下来等,如果没有空椅子,他

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值