同步互斥问题求解

1图书馆阅览室问题

问题描述:假定阅览室最多可同时容纳100个人阅读,读者进入时,必须在阅览室门口的一个登记表上登记,内容包括姓名、座号等,离开时要撤掉登记内容。用P、V操作描述读者进程的同步算法。       

(分析:读者有任意多个,但进入阅览室阅读最多为100人,为此可设一个信号量s,代表空座位的数目;另登记表为临界资源,需设一个用于互斥的信号量mutex,防止2个及以上的读者进程同时对此表访问。对于每个读者的动作包括进入、阅读、离开。)

structsemaphore s,mutex=100,1;

cobegin

void readeri(void) (i=1,2,…,k)

            {

            while(TRUE){

                        P(s);

                        P(mutex);

                        查登记表,置某座位为占用;

                        V(mutex);

                        ……

                        reading;

……

P(mutex);

                        查登记表,置某座位为空;

                        V(mutex);

V(s);}

        }

coend

 

2吃水果问题

问题描述:桌上有一只盘子,每次只能放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘里的桔子,女儿专等吃盘里的苹果。只要盘子空,则爸爸或妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出四人之间的同步关系,并用PV操作实现四人正确活动的程序。 

解:四人之间的关系:1爸爸,妈妈要互斥使用盘子,所以两者之间是互斥关系;2爸爸放的苹果,女儿吃,所以两者是同步关系;3妈妈放的桔子,儿子吃,所以两者也是同步关系。

structsemaphore s,sp,so=1,0,0;

cobegin

void father (void)

            {

            while(TRUE){

                        have an apple;

                        P(s);

                            putan apple;

                        V(sp);}

        }

void mother (void)

            {

            while(TRUE){

                        have an orange;

                            P(s);

                            putan orange;

                        V(so);}

        }

void son (void)

            {

            while(TRUE){

                        P(sp);

                            getan orange;

                        V(s);

                      eat an orange;}

  }

void daught (void)

            {

             while(TRUE){

                        P(sp);

                            getan apple;

                        V(s);

                                eatan apple;}

        }

coend

 

3司机—售票员问题

设公共汽车上,司机和售票员的活动分别是:

     司机:               售票员:

         启动车辆               上下乘客

         正常行车               关车门

         到站停车               售票

                                开车门

                                上下乘客                        

   在汽车不断到站,停车,行驶过程中,这两个活动的同步关系?

structsemaphore s1,s2=0,0;

cobegin

void driver(void)

            {

            while(TRUE){

                        p(s2);

                        启动车辆;

                        正常行车;

                        到站停车;

                        V(s1);}

        }

void conductor(void)

            {

            while(TRUE){

                        上、下乘客;关车门;

                        V(s2);

                        售票;

                                P(s1);

                            开车门;上、下乘客;}

        }

coend

 

司机-售票员问题另解:

structsemaphore s1,s2=1,0;

cobegin

void driver(void)

            {

            while(TRUE){

                        P(s2);

                            启动车辆;

                            正常行车;

                        到站停车;

                        V(s1);}

        }

void conductor(void)

            {

            while(TRUE){

                        P(s1);

                            开车门;

                            上、下乘客;

                        关车门;

                        V(s2);售票;}

        }

coend

4 理发师问题:

 

引入3个信号量和一个控制变量:

1)控制变量waiting用来记录等候理发的顾客数,初值均为0;

2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;

3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0;

4)信号量mutex用于互斥,初值为1.

var waiting :integer; /*等候理发的顾客数*/

CHAIRS:integer; /*为顾客准备的椅子数*/

customers, barbers,mutex: semaphore;

customers := 0;barbers := 0; waiting := 0; mutex := 1;

 

Procedure barber;

begin

while(TRUE); /*理完一人,还有顾客吗?*/

P(cutomers); /*若无顾客,理发师睡眠*/

P(mutex); /*进程互斥*/

waiting := waiting –1; /*等候顾客数少一个*/

V(barbers); /*理发师去为一个顾客理发*/

V(mutex); /*开放临界区*/

cut-hair( ); /*正在理发*/

end;

 

procedure customer

 begin

P(mutex); /*进程互斥*/

if waiting waiting:= waiting+1; /* 等候顾客数加1*/

V(customers); /*必要的话唤醒理发师*/

V(mutex); /*开放临界区*/

P(barbers); /*无理发师, 顾客坐着养神*/

get-haircut( ); /*一个顾客坐下等理发*/

end

V(mutex); /*人满了,走吧!*/

end;

 

问题分析

题目中要求描述理发师和顾客的行为,因此需要两类进程Barber()和Customer()分别描述理发师和顾客的行为。当理发师看报时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师看报,因此理发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n个,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。故引入3个信号量和一个控制变量:1)控制变量waiting用来记录等候理发的顾客数,初值均为0;2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0;4)信号量mutex用于互斥,初值为1

 

注意:此题没按标准格式写。可加入并发执行部分。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值