计操进程同步(信号量pv灵魂三问法狂练版)

发布时间:2024年01月09日

解题秘诀-灵魂三问法

一 同步问题

1.1 围棋问题

  • 在一个盒子里,混装了数量相等的黑白围棋子。现在用自动分拣系统把黑子、白子分开,设分抹系统有两个进程P1和P2,其中P1拣白子P2拣黑子。规定当一个进程拣了一子后,必须让另一个进程去抹。用信号量和PV操作协调两进程的活动
    在这里插入图片描述
    在这里插入图片描述

1.2 数据采集问题

  • 某控制系统中,数据采集进程负责把采集到的数据放到一缓冲区中;分析进程负责把数据从缓冲区中取出进行分析,试用信号量实现两者之间的同步
    在这里插入图片描述
    在这里插入图片描述

1.3 三进程文件打印问题

  • 有三个进程 PA、PB 和 PC 合作解决文件打印问题:
    • PA将文件记录从磁盘读入主存的缓冲区 1,每执行一次读一个记录;
    • PB 将缓冲区 1 的内容复制到缓冲区 2,每执行一次复制一个记录;
    • PC 将缓冲区 2 的内容打印出来,每执行一次打印一个记录。缓冲区的大小等于一个记录的大小。请用 PV 操作来保证文件的正确打印
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

1.4 司机售票员问题

  • 在公共汽车上,司机和售票员的活动分别是:司机活动:启动车辆->正常运行->到站停车;售票员活动:关车门->售票->开车门。在汽车不断的到站,停车,行驶过程中,司机和售票员的活动有什么同步关系?用信号量和P,V操作实现
    在这里插入图片描述
  • 解析:在汽车行驶过程中,司机活动与售票员活动之间的同步关系为:售票员关车门后,向司机发开车信号,司机接到开车信号后启动车辆,在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开车门让乘客上下车。
    因此司机启动车辆的动作必须与售票员关车门的动作取得同步;售票员开车门的动作也必须与司机停车取得向步。,应设置两个信号量:s1、s2,s1表示是否允许司机启动汽车,其初值为0:s2表示是否允许售票员开门,其初值为0。
    在这里插入图片描述

二 同步+互斥问题

2.1 果盘问题

  • 一家四人父、母、儿子、女儿围桌而坐;桌上有一个水果盘;当水果盘空时,父亲可以放香蕉或者母亲可以放苹果,但盘中已有水果时,就不能放,父母等待。当盘中有香蕉时,女儿可吃香蕉,否则,女儿等待;当盘中有苹果时,儿子可吃,否则,儿子等待。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

三 同步+资源管控问题

3.1 兔子问题

  • 有一只最多能装 2 只兔子的铁笼子,猎人仅能向笼子中放入兔子(每次只能放入 1 只),若笼子是满的,则猎人必须等待;饭店老板仅能从笼子中取兔子(每次只能取出 1 只),若笼子是空的则他也必须等待。假设初始时笼子是空的。定义信号量并初始化,使用 P、V 操作模拟猎人和饭店老板进程之间的同步与互斥
    在这里插入图片描述
    在这里插入图片描述

3.2 数据写入和读取问题

  • 设有一缓冲池P,P中含有20个可用缓冲区,一个输入进程将外部数据读入P,另有一个输出进程将P中数据取出并输出。若讲程每次操作均以一个缓冲区为单位,试用记录型信号量写出两个进程的同步算法,要求写出信号量的初值。
    在这里插入图片描述
semaphore mutex=1; 
semaphore empty=20;
semaphore full=0;
int in,out = 0;
item p [20]; 
void Producer(){
	while(ture){
      producer an item in nextp;
      wait(empty);
      wait(mutex);
      p[in] := nextp;
      in := (in+1) mod 20;
      signal(mutex);
      signal(full);
   }
}
void Consumer(){
  while(ture){
 	 wait(full);
     wait(mutex);
     nextc := p[out];
     out := (out+1) mod 20;
     signal(mutex);
     signal(empty);
	}
}

3.3 图书馆问题

  • 图书馆规定,每位进入图书馆的读者要在登记表上登记,退出时要在登记表上注销。(1)用信号量实现读者之间的互斥登记和注销;(2)图书馆共有100个座位,当图书馆中没有空座位时,后到的读者在图书馆要等待寺(阻塞)
    在这里插入图片描述
    在这里插入图片描述

3.4 超市问题

  • 有一个超市,最多可容纳N个人进入购物,当N个顾客满员时,后到的顾客在超市外等待;超市中只有一个收银员。可以把顾客和收银员看作两类进程,两类进程间存在同步关系。写出用P、V操作实现的两类进程的算法
    在这里插入图片描述

3.4.1 解法一

在这里插入图片描述

  • 设一个整型变量S,同一个队列相对应。在S上定义两种操作:P操作和V操作。
    • 执行一次P操作,信号量S减1,S≥0时,调用P操作的进程继续执行;S<0时,该进程被阻塞,并且被插入到等待队列中。
    • 执行一次V操作,信号量S加1,当S≥0时,调用V操作的进程继续执行:S≤0时,从信号量S对应的等待队列中选出一个进程进入就绪状态[3]。
  • 在本题中,超市是公有资源,所以设置一个互斥信号量Sn,初值为n。当顾客进入超市时,首先要P(Sn),离开时V(Sn)。 因为顾客进程和收银员进程之间是同步关系,整个超市只有一个收银员,一次只能有一个顾客付款,所以必须为收银员进程及顾客进程各设置一个私有信号量S1和S2,初值分别为0,0。顾客买完东西,去付款时,执行V(S1),通知收银员有顾客付款。收银员进程此时就可以执行P(S1),进入收费。收费完毕,收银员进程执行V(S2),通知顾客进程。而顾客进程此时继续执行P(S2),即可离开收银台。最后,执行V(Sn),离开超市,释放资源。
    在这里插入图片描述

3.4.2 解法二

  • 超市能容纳N个顾客需要1个资源信号量s;
  • 顾客购物后可以找收银员结账需要1个同步信号量sl;
  • 收银员同一时间只能为1个顾客结账需要1个互斥信号量mutex;
  • 收银员结账过后顾客才能离开需要1个同步信号量s2;【小结】共需要4个信号量,1个资源s、1个互斥mutex和2个同步信号量s1和s2。
    在这里插入图片描述
    在这里插入图片描述
文章来源:https://blog.csdn.net/yang2330648064/article/details/135469281
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。