操作系统经典的同步问题,面试宝典,

1、测量控制系统中的数据采集任务把所采集的数据送一单缓冲区;计算任务则 从该缓冲区中取出数据并进行计算。试写出利用信号量机制实现两者共享单缓冲区的同步算法。

       Var Sempty,Sfull: semaphore:= 1,0

Begin

              Parbegin

              Collection:begin

              repeat

                     采集一个数据;

                     wait(Sempty);

                     数据放入缓冲区;

                     signal(Sfull);

              untill false;

              end;

              Compute:begin

              repeat

                     wait(Sfull);

                     从缓冲区取出数据;

                     signal(Sempty);

                     计算;

`                    until false;

                     end;

              Parend

       End

2、有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用wait和signal原语描述读者进程的同步问题。

       var mutex, readcount :semaphore := 1,100;

Begin

              Parbegin

              Process Reader:begin

              repeat

              wait(readcount);

              wait(mutex);

              <填入座号和姓名完成登记>;

              signal(mutex);

<阅读>

              wait(mutex)

       <删除登记表中的相关表项,完成注销>

              signal(mutex);

              signal(readcount);

              until false;

              end;

              parend;

       End;

1)、桌上有一空盘,只允许放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子;女儿专吃盘中的苹果,儿子专吃盘中的桔子;试用wait和signal原语实现爸爸、妈妈、女儿、儿子之间的同步问题。

var Sempty, Sapple, Sorange,: semaphore:= 1,0,0;

 begin

       parbegin

              Father: begin

                            repeat

                                   wait(Sempty);                                <put apple in tray>;

                                   signal(Sapple);                         until false;

                       end;

              Mother: begin

                            repeat

                                   wait(Sempty);                                <put orange in tray>;

                                   signal(Sorange);                       until false;

                        end;

              Son: begin

                            repeat

                                   wait(Sorange);

                                   <take orange>;

                                   signal(Sempty);

                            until false;

                      end;

              Daughter: begin

                            repeat

                                   wait(Sapple);

                                   <take apple>;

                                   signal(Sempty);                       until false;

                       end;

              parend;

end;

1、在4×100米接力赛中,4个运动员之间存在如下关系,运动员1跑到终点把接力棒交给运动员2;运动员2一开始处于等待状态,在接到运动员1传来的接力棒后才能往前跑,他跑完100米后交给运动员3,运动员3也只有在接到运动员2传来的棒后才能跑,他跑完100米后交给运动员4,运动员4接到棒后跑完全程。请试用信号量机制对其上过程进行分析。

        

       var s1,s2,s3:semaphpre:=0,0,0;

       begin

              parbegin

                     Athlete1: begin

                                   Run100m;

                                   signal(s1);

                                end;

                     Athlete2: begin

                                   wait(s1);

                                   Run100m;

                                   signal(s2);

                                end;

                     Athlete3: begin

                                   wait(s2);

                                   Run100m;

                                   signal(s3);

                                end;

                     Athlete4: begin

                                   wait(s3);

                                   Run100m;

                                end;

              parend;

       end

 

2、在公共汽车上,司机和售票员各行其职,司机负责开车和到站停车;售票员负责售票和开、关车门;当售票员关好车门后驾驶员才能开车行驶。试用wait和signal操作实现司机和售票员的同步。

var s1,s2:semaphore:=0,0;

begin

       parbegin

              Process Driver

              begin

              repeat

                     <go right>;

                     <stop bus>;

                     signal(s2);

                     wait(s1);

              until false;

              end;

              Process BookingClerk;

              begin

              repeat

                     <ticketing>;

                     wait(s2);

                     <open the door>;

                     <close the door>;

                     signal(s1);

              until false

              end;

       parend;

end;

1、假设有3个并发进程P,Q,R,其中P负责从输入设备上读入信息,并传送给Q,Q将信息加工后传送给R,R负责打印输出。进程P,Q共享一个有m个缓冲区组成的缓冲池;进程Q,R共享一个有n个缓冲区组成的缓冲池(假设缓冲池足够大,进程间每次传输信息的单位均小于等于缓冲区长度),请写出满足上述条件的并发程序。(12分)

var mutex1,mutex2,Sip,Siq,Soq,Sor:semaphore:=1,1,m,0,n,0;

begin

       parbegin

              Process P

              begin

              repeat

                     <读入信息>

                     wait(Sip);

                     wait(mutex1);

                     <数据放入缓冲区>

                     signal(mutex1);

                     signal(Siq);

              until false

              end;

              Process Q

              begin

              repeat

                     wait(Siq);

                     wait(mutex1);

                     <从缓冲区中取出数据>

                     signal(mutex1);

                     signal(Sip);

                     <数据处理〉

                     wait(Soq);

                     wait(mutex2);

                     <处理后的数据放入缓冲区>

                     signal(mutex2);

                     signal(Sor);

              until false

              end;

              Process R

              repeat

                     wait(Sor);

                     wait(mutex2);

              <把数据送入打印机完成打印>;

                     signal(mutex2);

                     signal(Soq);

              until false

              end

       parend

end

 

2、有一只铁笼子,每次只能放入一只动物,猎手向笼子里放入老虎,农民向笼子里放入猪;动物园等待取笼子里的老虎,饭店等待取笼子里的猪。现请用wait和signal操作写出能同步执行的程序。

var Sempty, Stiger, Spig,: semaphore:= 1,0,0;  

begin

       parbegin

              Hunter: begin

                            repeat

                                   wait(Sempty);

                                   <put tiger in cage>;

                                   signal(Stiger);

                            until false;

                       end;

              Farmer: begin

                            repeat

                                   wait(Sempty);

                                   <put pig in cage>;

                                   signal(Spig);

                            until false;

                        end;

              Zoo: begin

                            repeat

                                   wait(Stiger);

                                   <take tiger>;

                                   signal(Sempty);

                            until false;

                      end;

              Hotel: begin

                            repeat

                                   wait(Spig);

                                   <take pig>;

                                   signal(Sempty);         until false;

                       end;

              parend;

end;

转载于:https://my.oschina.net/u/1384768/blog/170876

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值