pv操作练习题

news2024/11/25 13:28:42

信号量解决五个哲学家吃通心面问题

题型一

有五个哲学家围坐在一圆桌旁,桌中央有盘通心面,每人面前有一只空盘于,每两人之间放一把叉子。每个哲学家思考、饥饿、然后吃通心面。为了吃面,每个哲学家必须获得两把叉子,且每人只能直接从自己左边或右边去取叉子。

 

Semaphore fork[5]={1,1,1,1,1};
Semaphore footman=4;
//最多允许4个哲学家进程同时进行 
cobegin
process philosopher_i(){/*i=0,1,2,3,4 */
	while(true){
	  P(footman); 
	  Think(); 
	  P(fork[i]);  
	  P(fork[(i+1)%5]);
	  Eat(); 
	  V(fork[i]); 
	  V(fork[(i+1)%5]);   
	  V(footman); 
	  }
 } 
coend

题型二

哲学家甲请哲学家乙、丙、丁到某处讨论问题,约定全体到齐后开始讨论;在讨论的间隙四位哲学家进餐,每人进餐时都需使用刀、叉各一把,餐桌上的布置如下图所示。用信号量机制说明四位哲学家的同步互斥过程。

 

分析

标准的哲学家进餐问题,只是哲学家人数和餐具及分布与经典哲学家进餐问题略有不同

数据结构

semaphore fork1,fork2,knife1,knife2;

frok表示叉,knife表示刀,初值均为1

pa //哲学家甲
do{
    P(knife1);
    P(fork1);
     进餐;
    V(knife1);
    V(fork1);
     讨论问题;
}while(1);
pb //哲学家乙
do{
    P(knife2);
    P(fork1);
     进餐;
    V(knife2);
    V(fork1);
     讨论问题;
}while(1);
pa //哲学家丙
do{
    P(knife2);
    P(fork2);
     进餐;
    V(knife2);
    V(fork2);
     讨论问题;
}while(1);
pb //哲学家丁
do{
    P(knife1);
    P(fork2);
     进餐;
    V(knife1);
    V(fork2);
     讨论问题;
}while(1);

理发师问题

理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子

如果没有顾客,理发师便在理发椅上睡觉

一个顾客到来时,它必须叫醒理发师

如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开

int waiting=0;//等候理发顾客数
int CHAIRS=N; //为顾客准备的椅子数
semaphore customers,barbers,mutex;
customers=0;barbers=0;mutex=1;

cobegin
process barber( ) {
	while(true) {
		P(customers);       //有顾客吗?若无顾客,理发师睡眠
		P(mutex);           //若有顾客时,进入临界区
		waiting--;          //等候顾客数少一个
		V(barbers);         //理发师准备为顾客理发
		V(mutex);           //退出临界区
		cut_hair();         //理发师正在理发(非临界区)
  }
}

process customer_i( ) {
  P(mutex);             //进入临界区
  if(waiting<CHAIRS) {  //有空椅子吗
	  waiting++;          //等候顾客数加1
	  V(customers);       //唤醒理发师
	  V(mutex);           //退出临界区
	  P(barbers);         //理发师忙,顾客坐下等待
	  get_haircut();      //否则顾客坐下理发
  }
  else V(mutex);        //人满了,走吧!
}
coend

运行过程: 

  1. customer : p(mutex)
  2. customer : waiting
  3. customer : v(customers)
  4. barber : p(customers) → p(mutex) & waiting
  5. customer : v(mutex)
  6. barber : p(mutex)
  7. barber : wating - -
  8. barber : v(barbers)
  9. barber : v(mutex)
  10. customer : p(barbers)
  11. barber : cut_hair( )
  12. customer : get_haircut( )

生产者消费者问题

①一个生产者、一个消费者共享一个缓冲区 ②一个生产者、一个消费者共享多个缓冲区 ③多个生产者、多个消费者共享多个缓冲区

一个生产者、一个消费者共享一个缓冲区

int B;
semaphore empty;  //可以使用的空缓冲区数
semaphore full;  //缓冲区内可以使用的产品数
empty=1;         //缓冲区内允许放入一件产品
full=0;          //缓冲区内没有产品
****cobegin
process producer(){       
  while(true){               
		produce( );                
		P(empty);                  
		append( ) to B;            
		V(full);                   
  }                         
}                         
coend****
****cobegin
process consumer(){
	while(true) { 
	  P(full);
		take( ) from B;
	  V(empty);
    consume( );
    }
}
coend****

多个生产者/消费者、共享多个缓冲区的解

桌子上有一个盘子,可以存放一个水果。父亲总是放苹果到盘子中,而母亲总是放香蕉到盘子中;儿子专等吃盘中的香蕉,而女儿专等吃盘中的苹果。

item B[k];
semaphore empty;	
empty=k;  
semaphore full; 
full=0;      
semaphore mutex=1;  //互斥信号量
int in=0;	//放入缓冲区指针
int out=0;   //取出缓冲区指针
cobegin
cobegin
process producer_i ( ){
	while(true) {
		produce( );
		P(empty);
		P(mutex);
		append to B[in]; 
		in=(in+1)%k;  
		V(mutex);            
		V(full);                
  }
}
coend
cobegin
process consumer_j ( ){    
	while(true) {
		P(full);
		P(mutex);
		take( ) from B[out];
		out=(out+1)%k;
		V(mutex);
		V(empty);
		consume( );
  }
}
coend

读者写者问题

 

有两组并发进程:读者和写者,共享一个文件F

允许多个读者同时执行读操作

任一写者在完成写操作之前不允许其它读者或写者工作

写者执行写操作前,应让已有的写者和读者全部退出

int readcount=0;//读进程计数
semaphore writeblock = 1;
semaphore mutex= 1;
cobegin
process reader_i( ){          
  P(mutex);
  readcount++; 
  if(readcount==1)P(writeblock); 
  V(mutex);
  {读文件};
  P(mutex);
  readcount--;
  if(readcount==0)V(writeblock);
  V(mutex);
}
coend
cobegin
process writer_j( ){
	P(writeblock);
	{写文件};
	V(writeblock);
}
coend

某小型超级市场有一个出入口,出入口处有80个篮子,每个购物者拿到一只篮子后可入内购物,购物结束后在出入口处结账,并归还篮子。出入口处禁止多人同时通行,试用信号量和P、V操作写出购物物者进程的同步算法

semaphore  count=80,mutex = 1; 
shopping( )//购物者进程{
  P(count)    
   P(mutex)   
      进入超市购物       
   V(mutex)
   P(mutex)
    结账离开  
   V(mutex)
  V(count)  }

某车站售票厅有一个售票窗口,窗口不允许同时有多个人买票,任何时刻最多可容纳20名购票者进入售票厅排队,当售票厅内已有20名购票者时,其余购票者需在外面等待。若把一个购票者看作一个进程,请回答下列问题:

(1)用PV操作管理这些并发进程时,写出信号量的定义及初值;

(2)根据所定义的信号量,在下面程序段中合适的位置加上PV操作,以保证进程能正确地并发执行。

semaphore  mutex = 1 ;//用于购票窗口互斥    
semaphore  count = 20 ;//用于表示可容纳20人购票进程同步  
cobegin
PROCESSPI(I=1,2,……)//购票者进程1,2.......{
	P(count)  
	进入售票厅;
	P(mutex)   
	购票;
	V(mutex);  
	退出;
	V(count);   
}
coend

设公共汽车上,司机和售票员的活动分别如下:司机的活动:启动车辆:正常行车:到站停车。售票员的活动:关车门:售票:开车门。在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用信号量和P、V操作实现它们的同步。

semaphore  door = 0 , stop  = 0 ; 
process driver()
{
	P(door)
	启动车辆,正常行车
	车辆到站停车
	V(stop)
}
process saler()
{
	关车门
	V(door) 
	 售票
	P(stop)
	开车门
}

另一个经典同步问题:吸烟者问题(patil , 1971 )。三个吸烟者在一个房间内,还有一个香烟供应者。为了制造并抽掉香烟,每个吸烟者需要三样东西:烟草、纸和火柴,供应者有丰富货物提供。三个吸烟者中,第一个有自己的烟草,第二个有自己的纸和第三个有自己的火柴。供应者随机地将两样东西放在桌子上,允许一个吸烟者进行对健康不利的吸烟。当吸烟者完成吸烟后唤醒供应者,供应者再把两样东西放在桌子上,唤醒另-一个吸烟者。试采用:(1 )信号量和P、V操作编写他们同步工作的程序。

Semaphore a=b=c=0,s=1;
Cobegin
Process P1(){
	while(1){
		P(a)
		卷烟,抽烟
		V(s)
}}

Process p2(){
	while(1){
	  P(b)
		卷烟,抽烟
		V(s)
}}

Process p3(){
	while(1){
	  P(c)
		卷烟,抽烟
		V(s)
}}

Process supply(){
while(1){
	P(s)
  if(放烟草和纸)  V(c)
  else if(放烟草和胶水)  V(b)
  else V(a)
}}
Coend

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/529845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器视觉1】坐标系定义

坐标系定义 1. 图像坐标系2. 摄像机坐标系3. 世界坐标系4. 三种坐标系间的转换4.1 摄像机坐标系与无畸变图像坐标系之间的变换4.2 世界坐标系与摄像机坐标系之间的变换4.3 世界坐标系与无畸变图像坐标系之间的变换 1. 图像坐标系 数字图像坐标系&#xff1a; O 0 − u v O_0-u…

【差分+操作】C. Helping the Nature

Problem - 1700C - Codeforces 题意&#xff1a; 思路&#xff1a; 一开始手玩了一下 如果不是高低高的形式&#xff0c;那么一定不能通过操作3把全部元素变成0 因此就是先把所有元素变成高低高的形式 但是低在什么地方不确定 因此考虑枚举中间低谷位置&#xff0c;O(1)计…

【多微电网】基于粒子群优化算法的面向配电网的多微电网协调运行与优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

软件测试岗,4轮成功拿下字节 Offer,面试题复盘(附答案)

一共经历了四轮面试&#xff1a;技术4面&#xff0b;HR面。 特整理出所涉及的全部知识点&#xff0c;并复盘了完整面试题及答案&#xff0c;分享给大家&#xff0c;希望能够帮到一些计划面试字节的朋友。 一、测试基础理论类 怎么编写案例?软件测试的两种方法测试结束的标准…

allegro查看板子元器件的pin脚总数

怎么在ALLEGRO里统计焊盘和包括芯片pin和阻容的pad&#xff1f; 板子要拿出去布&#xff0c;需要根据焊盘计费&#xff1f; 方法一&#xff1a; 在find里面只勾选pin&#xff0c;然后鼠标左键&#xff0c;选择全部的pin 再选择菜单Display–element&#xff0c;如下图&#x…

Vivado综合属性系列之三 RAM_STYLE

目录 一、前言 二、RAM_STYLE ​ ​2.1 工程代码 ​ ​2.2 参考资料 一、前言 ​ ​RAM英文全称为Random Access Memory&#xff0c;随机存取存储器&#xff0c;可以实现数据的快速随机读写&#xff0c;RAM可直接verilog代码编写&#xff0c;也可调用IP核。 二、RAM…

Nginx 安装配置

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。在高连接并发的情况下&#xff0c;Nginx是Apache服务器不错的替代品。 Nginx 安装 系统平台&#xff1a;CentOS …

Java-Thread知识点汇总

什么是线程 记得小时候的电脑老是很卡,打开一个浏览器、游戏啥的老是卡死&#xff0c;关又关不掉&#xff0c;然后就会打开任务管理器&#xff0c;强制关闭它 我们可以看到&#xff0c;这个叫“进程”&#xff0c;简单理解一下&#xff0c;进程就是由&#xff08;一个或多个&am…

入河排污口设置论证报告书如何编制?入河排污口水质影响预测方法有哪些

随着水资源开发利用量不断增大&#xff0c;全国废污水排放量与日俱增&#xff0c;部分河段已远远超出水域纳污能力。近年来,部分沿岸入河排污口设置不合理&#xff0c;超标排污、未经同意私设排污口等问题逐步显现&#xff0c;已威胁到供水安全、水环境安全和水生态安全&#x…

Bootstrap开发之——Bootstrap简介(01)

一 概述 Bootstrap概念学习前需要具备知识查阅Bootstrap文档Bootstrap各版本有什么不同 二 Bootstrap概念 Bootstrap是一个使用HTML、CSS和JavaScript框架的前端开发框架Bootstrap 是全球最受欢迎的前端框架&#xff0c;用于构建响应式、移动设备优先的网站简洁、直观、强悍的…

Linux-基础指令-3

时间相关的指令 date显示 date 指定格式显示时间&#xff1a; date %Y:%m:%d 例子&#xff1a; 而上述中的 %Y %m %d 等等这些中间可以用很多的符号来分割&#xff0c; 如&#xff1a;" - " " _ " " : " 等等这些都是可以的&#xff0c;但是…

5月份了,不会还有人没找到工作吧.....

前两天跟朋友感慨&#xff0c;去年的铜九铁十、裁员、疫情导致好多人都没拿到offer&#xff01;现在都已经5月了&#xff0c;金三银四都结束一段时间了。 金三银四都已经结束&#xff0c;大部分企业也招到了自己需要的人&#xff0c;但是我看我的读者们还是有很大一部分人在抱…

算法套路十六——DP求解最长递增子序列LIS

算法示例&#xff1a;LeetCode300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] …

品优购项目学习记录02-main主体盒子搭建,推荐模块

文章目录 一、main主体盒子搭建1.1 newsflash新闻快报模块1.1.1 news新闻模块1.1.2 lifeservice生活服务模块1.1.3 bargain模块 二、推荐模块 一、main主体盒子搭建 1.main盒子宽度为980像素&#xff0c;位置距离左边220px(margin-left)&#xff0c;给高度就不用清除浮动 2.mai…

桂院校园导航小程序 云开发项目 二次开发教程 1.0.1

Gitee代码仓库&#xff1a;桂院校园导航小程序 GitHub代码仓库&#xff1a;GLU-Guide 先 假装 大伙都成功安装了云开发项目&#xff0c;并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码里的注释我就不说明了&#xff0c;有提到 我的学校…

vue 引入图片的问题

文章目录 为什么使用require自己讲解实例 - src下 - img验证 实例 - public下 - 绝对路径 - img报错&#xff0c;其中 imgurl5、imgurl6 找不到资源&#xff01;个人猜想&#xff1a; 去掉 imgurl5、imgurl6 再次运行&#xff08;开发环境&#xff09;&#xff1a;去掉 imgurl5…

EF Core Build failed. Use dotnet build to see the errors.

Build failed. Use dotnet build to see the errors. 今天学习abp框架用到EF Code First时&#xff0c;报出上述错误。 在网上查了很多资料。 dotnet build D:\Practice\abp\SourceCode\BookStore\src\Acme.BookStore.EntityFrameworkCore\Acme.BookStore.EntityFrameworkCor…

Stable Diffusion webui安装使用

参考&#xff1a; https://stability.ai/blog/stable-diffusion-public-release https://github.com/AUTOMATIC1111/stable-diffusion-webui 安装&#xff08;6g显存&#xff09; 1、conda创建python 3.10.6环境 conda create -n stable-diffusion pythonpython 3.10.6 也安装…

【axios】axios的完整配置

注意&#xff1a;本文实例化为TS版 1、axios概念 axios 是一个基于 promise 封装的网络请求库&#xff0c;它是基于 原生XHR 进行二次封装&#xff0c;可以说是 XHR 的一个子集&#xff0c;而 XHR 又是 Ajax 的一个子集 特点 从浏览器中创建 XMLHttpRequests从 node.js 创建…

C/CPP安装pthread教程;#include<pthread.h>无法引入该文件的解决方法;引入pthread后报错

在开发c及cpp的多并发程序时&#xff0c;常常会用到pthread.h头文件&#xff0c;但是pthread是需要自行安装的&#xff0c;下面就是在Windows平台使用Visual Studio安装pthread的教程。 1.下载并解压pthread库 在POSIX Threads for Windows - Browse Files at SourceForge.ne…