进程同步


Process Synchronization Problems

1、在公共汽车上,司机和售票员的工作流程如图所示。为保证乘客的安全,司机和售票员应密切配合协调工作。请用信号量来实现司机与售票员之间的同步。



 

司机和售票员工作流程图

 

 

分析:司机必须在售票员关门后才能启动车辆。在车辆启动后,售票员的售票行为和正常行车已经到站停车都没有相互制约关系。然而,售票员的开车门动作必须在司机到站停车动作完成后才能发生。因此定义司机的信号量为Driver_S ,售票员信号量为Conductor_S, init:  Driver_S = Conductor_S=0;

 

算法:

Semaphore Driver_S = 0, Conductor_S = 0;

Driver(){

       While(true){

              Wait(Driver_S)             //等待售票员关门

              StartBus();                  //启动车辆

              NormalDriving();         //正常行驶

              StopBus();                   //停车

              Signal(Conductor_S);  //允许售票员开门

}

}

 

Conductor (){

       While(true){

              closeDoor();                //关门

              signal(Driver_S);         //允许司机启动

              sellTicket();                  //售票

              wait(Conductor_S);     //等待司机停车

              openDoor();                //关门

}

}

main() 

cobegin{ 

Driver(); 

Conductor (); 

 

2、桌子上有一只盘子,盘子中只能放一只水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。用wait()signal()信号量操作实现他们之间的同步机制。

 

分析:因为盘子中只能放一只水果,因此爸爸和妈妈对盘子的访问必须是互斥的,那么定义一个信号量用来互斥访问盘子Dish,儿子和女儿对苹果和橘子的需求不同因此定义苹果和橘子的信号量为Apple,Orange;init: Dish= 1, Apple=Orange = 0;

     

Semaphore Dish = 1, Apple=Orange=0;

 

Father(){

While(true){

            Wait(Dish);                  //等待盘子没有水果

            putAppleIntoDish();           //往盘子里放苹果

            signal(Apple);              //盘子有苹果,儿子可以拿

}

}

 

mother(){

While(true){

            Wait(Dish);                  //等待盘子没有水果

            putOrangeIntoDish();   //往盘子里放橘子

            signal(Orange);            //盘子有橘子,女儿可以拿

}

}

 

Son(){

While(true){

            Wait(Apple);                //等待爸爸放苹果

            pickApple();                //拿走苹果

            Signal(Dish);               //盘子可以放水果了

}

}

 

Daughter(){

While(true){

            Wait(Orange);              //等待妈妈放橘子

            pickOrange ();             //拿走橘子

            Signal(Dish);               //盘子可以放水果了

}

}

 

main() 

cobegin{ 

Father(); 

Mother();  

Son(); 

Daughter(); 

3、设有一个售票厅,可容纳100人购票。如果厅内不足100人则允许进入,进入后购票,购票后退出。如果厅内已有100人,则在厅外等候。试问:

(1)   购票者之间是同步还是互斥?

互斥关系;

(2) wait()signal()操作表达购票者的工作过程。

分析:售票厅最多能容纳100人,因此需要一个信号量empty ,来控制售票厅是否能进入。购票者之间为互斥关系,因此需要一个信号量来制约购票mutex; init: empty=100,mutex = 1;

 

Semaphore empty = 100,mutex = 1;

BuyTicketProcedure(){

      While(true){

           Wait(empty);         //售票厅允许进入

           Wait(mutex);          //没人在买票

           buyTicket();           //买票

           signal(mutex);        //退出售票窗口

           signal(empty);       //走出售票厅

      }

 

}

 

Main(){

      Cobegin(){

BuyTicketProcedure();

 

      }

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值