2021/8/24 我想探知宇宙

OS第二章五大经典PV

题目分析和优化

    • OS第二章五大经典PV
  • 一、PV操作体系框架
  • 二、哲学家进餐(干饭)问题
    • 解法一:暴力破解
    • 解法二:限制人数
  • 读者写者问题
    • 问题一:同类不互斥,异类互斥
    • 问题二:同类互斥,异类不互斥
    • 问题三:变态类(真正的)读者-写者-写优先
    • 解法1:
  • 理发师问题
  • 生产者消费者问题(重点)
  • 综合问题:叫号问题
    • 解法1:设置i、j变量
    • 解法2:PV阻塞等待

一、PV操作体系框架


二、哲学家进餐(干饭)问题

2019年统考真题
问题描述:
有n(n>=3) 名哲学家围坐在一张圆桌边,每名哲学家交替地就餐和思考.在圆桌中心有m(m>=1)个碗,每两名哲学家之间有一根筷子。每名哲学家必须取到一个碗和两侧的筷子后,才能进餐,干饭后将碗和筷子放回原位,继续思考,为尽可能多的哲学家同时进餐,且防止出现死锁现象,进行PV操作和semaphore信号量定义。

解法一:暴力破解

资源全锁:

//定义semaphore信号量
semaphore bowl=n;//n个碗
semaphore chopstick[n];//n只筷子
semaphore mutex=1;//互斥取资源信号量
for(int i=0;i<n;i++)chopstick[i]=1;//初始化信号量
Pi(){//i号哲学家while(1){思考;P(mutex);//互斥访问资源if(bowl&&chopstick[i]&&chopstick[(i+1)%n]){//左右筷子、婉都有P(bowl);//拿碗P(chopstick[i]);//拿左筷子P(chopstick[(i+1)%n]);//拿右筷子V(mutex);//拿完就释放互斥哲学家干饭;V(bowl);//释放碗V(chopstick[i]);//释放左筷子V(chopstick[(i+1)%n]);//释放右筷子}elseV(mutex);//资源不够释放互斥,满足尽可能多的哲学家同时进餐}
}

解法二:限制人数

运用了死锁避免

通过限制限制人数为n-1,取和其他资源的最小值 bowl=min{n-1,m}
如果资源类别>=2是要取所有资源的和n-1个人进餐人数的最小值
赋予最小值的信号量代表了同时进餐的人数
并且将赋予最小值的信号量放在进程的一开始的位置P(bowl);如果资源不满足就会阻塞

semaphore chopstick[n];//n只筷子
semaphore bowl=min{n-1,m};//同时进餐的最大人数
for(int i=0;i<n;i++)chopstick[i]=1;//初始化信号量
Pi(){//i号哲学家while(1){思考;P(bowl);//拿碗P(chopstick[i]);//拿左筷子P(chopstick[(i+1)%n]);//拿右筷子干饭;V(bowl);//释放碗V(chopstick[i]);//释放左筷子V(chopstick[(i+1)%n]);//释放右筷子}
}

读者写者问题

问题一:同类不互斥,异类互斥

经典问题:同类不互斥,异类互斥 :电影院问题
问题描述:电影院有1,2,3种不同的电影(看不同的电影的人代表不同的进程),任意一时刻只能播放一种电影(放映厅互斥)选择当前正在播放的电影的人可以进入(不限制人数),最后一个观看电影的人结束放映厅的播放,看不同电影的人等待(说明第一个进入的占有放映厅,最后一个释放放映厅)

semaphore room=1;//放映厅
semaphore mutex_1=1;//第一种电影的互斥访问count_1信号量
int count_1=0;//第一种电影的观看人数
semaphore mutex_2=1;//第一种电影的互斥访问count_2信号量
int count_2=0;//第二种电影的观看人数
semaphore mutex_3=1;//第三种电影的互斥访问count_3信号量
int count_3=0;//第三种电影的观看人数
P1(){//看第一种影片的人P(mutex_1);//互斥访问count_1if(count_1==0)//第一人P(room);//占有放映厅count_1++;//看电影1的人数+1V(mutex_1);//访问婉count_1后释放看片嘻嘻;P(mutex_1);//互斥访问count_1count_1--;//走就人数-1if(count_1==0)//最后一个观看的人V(room);//释放放映厅V(mutex_1);//释放count_1
}P2(){//看第二种影片的人P(mutex_2);//互斥访问count_2if(count_2==0)//第一人P(room);//占有放映厅count_2++;//看电影2的人数+1V(mutex_2);//访问婉count_2后释放看片嘻嘻;P(mutex_2);//互斥访问count_2count_2--;//走就人数-1if(count_2==0)//最后一个观看的人V(room);//释放放映厅V(mutex_2);//释放count_2
}P3(){//看第三种影片的人P(mutex_3);//互斥访问count_3if(count_3==0)//第一人P(room);//占有放映厅count_3++;//看电影3的人数+1V(mutex_3);//访问婉count_3后释放看片嘻嘻;P(mutex_3);//互斥访问count_3count_3--;//走就人数-1if(count_3==0)//最后一个观看的人V(room);//释放放映厅V(mutex_3);//释放count_3
}

问题二:同类互斥,异类不互斥

经典问题:P100 2.3.7 T19 南开大学弯路问题
问题描述:南开大学与天津大学之间有一条弯路,每次只允许一辆自行车通过,但中间安全岛M可供两端的两辆小车错车


NtoT(){//从N到T入口;P(NT);//互斥从N到T只能一辆车P(K);//到K路段经过M岛;V(K);//释放K路段P(L);//申请L路段出口;V(NT);//通过,释放从N到T的互斥
}TtoN(){//从T到NP(TN);//互斥从T到N只能一辆车P(L);//到L路段经过M岛;V(L);//释放L路段P(K);//申请K路段出口;V(TN);//通过,释放从T到N的互斥
}

问题三:变态类(真正的)读者-写者-写优先

王道OS强化课考试T1王道YYDS
问题描述:
某计算机学院,有男老师、男同学若干,没有女同学。学校运动会期间,老师和同学们都需要换上运动服参加运动。整个学院共用一个更衣室,更衣室很大。但是,老师们比较好面子,不想和别人一起更衣,而男同学们比较无所谓,可以和多个同学一起更衣。更衣室需要让老师优先使用。请使用P、V操作描述上述过程的互斥与同步,并说明所用信号量及初值的含义。
注意的是本题如果用书上的读者-写者问题-写优先是满足不了让老师优先使用的条件的
因此本题需要用真正的读者-写者-写优先

解法1:

semaphore pri=1;//老师优先级
semaphore enter=1;//允许进入信号量
semaphore mutex_t=1;//老师互斥访问count_t
semaphore mutex_s=1;//学生互斥访问count_s
semaphore room=1;//更衣室互斥信号量
int count_t=0;//老师数
int count_s=0;//学生数
Teacher(){//老师P(enter);//是否允许进入P(mutex_t);//老师互斥访问count_tif(count_t==0){//第一个老师P(pri);//优先进入}count_t++;//老师数+1;V(mutex_t);//释放老师变量count_t互斥信号量V(enter);//释放共享P(room);//占有更衣室更衣室换衣服;V(room);//换完衣服释放房间P(mutex_t);//老师互斥访问count_tcount_t--;//老师换完衣服退出更衣室老师数-1if(count_t==0){//如果老师数为0了则暂时没老师要来V(pri);//释放优先级}V(mutex_t);//释放老师互斥访问count_t
}Student(){//学生P(pri);//等待老师P(enter);//是否允许进入P(mutex_s);//互斥访问学生人数count_s变量if(count_s==0){//第一个学生P(room);//占有更衣室}count_s++;//学生人数+1V(pri);//其他人可申请V(mutex_s);//释放学生互斥信号V(enter);//进入后释放信号量更衣室更衣;P(mutex_s);//互斥访问学生人数count_s变量count_s--;//更衣完退出更衣室if(count_s==0)//最后一个学生更衣V(room);//释放更衣室V(mutex_s);}

理发师问题

经典问题:(有等待资源-椅子)忙(理发师在忙)则等待,没等待资源(没椅子了就拍屁股走人)
问题描述:理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子如果没有顾客,理发师便在理发椅上睡觉一个顾客到来时,它必须叫醒理发师如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。

注意这里的if else是为了区分两种情况,一种是有资源,一种是没资源,if(有资源)则申请座位在更改资源变量chair后V(mutex)提高并发度。else 就是顾客到了但是没椅子了就走了直接释放V(mutex)
所以说与读者写者的if是不同的,因为读者写者的if纯粹就是互斥访问count修改count的值代表读者有多少个人,不会因为读者有多少个人就会影响其他读者,而理发师问题的wait变量的大小与chair资源的比较就会影响到其他顾客的行为(是离开还是申请chair)

semaphore consumers=0;//顾客人数
semaphore serve=0;//理发师提供服务
semaphore mutex_w=1;//互斥访问wait
int wait=0;//等待人数
int chairs=n;//椅子数量
Tony(){//理发师while(1){P(consumers);//没有顾客就睡觉P(mutex_w);//互斥访问wait变量wait--;//等待人数-1V(mutex_w);//访问完wait就释放V(serve);//释放服务为顾客服务理发;}
}Consumer(){//顾客顾客进门;P(mutex_w);//互斥访问wait变量if(wait<chairs){//有椅子则申请椅子wait++;//等待人数+1V(mutex_w);//访问完wait就释放V(consumsers);//通知有顾客来了P(serve);//申请服务接收服务}else //没椅子V(mutex_w);//释放互斥
}

生产者消费者问题(重点)

思想:同步问题:前V后P 生产者消费者的马甲很多同时有些题目很难
史诗级难题:P98 2.3.7 T10 小和尚打水-大和尚喝水

问题描述:某寺庙有小和尚、老和尚若干,有一水缸,由小和尚提水入缸供老和尚饮用。水缸可容10桶水,水取自同一井中。水井径窄(互斥)每次只能容一个水桶取水。水桶总数为3个。每次入缸取水仅为一桶水,且不可同时进行。试给出有关从缸取水、入水的算法描述

semaphore bucket=3;//水桶个数
semaphore empty=10;//水缸空闲容量
semaphore well=1;//水井互斥取水
semaphore vat=1;//水缸互斥取水/放水
semaphore water=0;水缸有水容量
child(){//小和尚while(1){P(empty);//保证水缸中还需加水P(bucket);//申请桶拿桶;P(well);//互斥水井取水井中取水;V(well);//取完水释放水井//P(empty);若在此处加就可能发送死锁,缸中水满,桶全被小和尚拿了,老和尚打不了水P(vat);//互斥水缸放水入缸;V(vat);//释放水缸V(water);//释放缸中的一桶水,即缸中加了一桶水V(bucket);//还桶;}
}
adult(){//老和尚while(1){P(water);//保证水缸中有水P(bucket);//申请水桶拿桶;//P(water);可能发生死锁,缸中没水,桶全被老和尚拿了,小和尚没桶到水井打水P(vat);//互斥水缸缸中取水;V(vat);//释放水缸喝水;V(empty);//释放V(bucket);//还桶;}
}

此处表明了当有地方多次连续出现P时要考虑前后的关系,以防发生死锁


综合问题:叫号问题

方法:①设置顾客号数i,设置叫号号数j,通过比对i和j来判断
           ②直接用PV操作阻塞

如P97 T7面包师
面包师有很多面包,由n名销售人员推销,每名顾客进店后取一个号,并且等待叫号,当一名销售人员空闲时,就叫下一个号。试设计一个使销售人员和顾客同步的算法。

解法1:设置i、j变量

semaphore mutex_i=1;//互斥访问i变量
semaphore mutex_j=1;//互斥访问j变量
int i=0;//顾客的取号号数
int j=0;//销售人员的叫号号数
consumer(){//顾客进店;P(mutex_i);//互斥取号取号;i++;//号数加1,下一个顾客的编号V(mutex_i);//取完号释放互斥等待被叫号;
}salex(){//x号销售人员while(1){P(mutex_j);//互斥访问jif(j<i){//有顾客叫号;j++;V(mutex_j);//访问完j,释放互斥销售服务;}elseV(mutex_j);//无顾客,休息}
}

解法2:PV阻塞等待

semaphore mutex=1;//互斥取号
semaphore consumers=0;//顾客数
semaphore serve=0;//销售人员提供服务
consumer(){进店;P(mutex);//互斥取号取号;V(mutex);//释放互斥V(consumers);//释放顾客信号量,通知有客人P(serve);//申请服务接收服务;
}
sale(){while(1){P(consumers);//没客人休息V(serve);//释放服务销售面包,为客户服务;}
}

OS第二章五大经典PV相关推荐

  1. 【王道】操作系统OS第二章进程管理(二[1])

    本笔记结合<2023王道操作系统考研复习指导>食用 操作系统OS第二章进程管理 本笔记结合<2023王道操作系统考研复习指导>食用 1.进程 1.1.进程的组成 1.1.1.P ...

  2. 《王道论坛计算机考研机试指南》第二章【经典入门】

    排序 日期类问题 Hash应用 排序 #include <iostream> #include <algorithm> using namespace std; bool cm ...

  3. OS知识点汇总(考研用)——第二章:进程管理(下)

    OS知识点汇总(考研用)--第二章:进程管理(下)  本文参考于<2021年操作系统考研复习指导>(王道考研),<计算机操作系统教程> 思维导图: 文章目录 OS知识点汇总(考 ...

  4. 机器学习理论入门:第二章 经典监督学习算法-决策树

    第二章 经典监督学习算法-决策树 一.决策树总体概览 概念:是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概 ...

  5. 【数据库原理及应用】经典题库附答案(14章全)——第二章:关系数据库知识

    [数据库原理及应用]经典题库附答案(14章全)--第一章:数据库基础知识 [数据库原理及应用]经典题库附答案(14章全)--第二章:关系数据库知识 [数据库原理及应用]经典题库附答案(14章全)--第 ...

  6. (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题

    本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 (王道408 ...

  7. (王道408考研操作系统)第二章进程管理-第三节8:经典同步问题之吸烟者问题

    本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 文章目录 一 ...

  8. (王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题

    注意:生产者与消费者问题Linux系统编程专栏有案例讲解 Linux系统编程39:多线程之基于阻塞队列生产者与消费者模型 Linux系统编程40:多线程之基于环形队列的生产者与消费者模型 本文接:(王 ...

  9. 第二章 查询结果排序(SQL server经典实例)

    第二章 查询结果排序(SQL sever经典实例) 本章目录 第二章 查询结果排序(SQL sever经典实例) 1. 以指定顺序返回查询结果 2. 多字段排序 3. 根据子串排序 4. 排序时对nu ...

最新文章

  1. Visual SVN 非常好的转贴
  2. 推荐一些不错的开源免费易上手的web前端框架
  3. PowerDesigner中在生成的数据库脚本中用name列替换comment列作为字段描述的方法
  4. go io.reader 多次读取_Go 经典入门系列 24:Select
  5. git 学习1--查看全局配置
  6. NetTiers学习笔记09---RADGrid + EntityDataSource设置默认排序, 及表格自动排序,分页的方法...
  7. DOM注册事件的三种方式~满满的干货哦
  8. CrazyWing:Python自动化运维开发实战 十八、Python面向对象
  9. 解决运行Vue项目localhost8080拒绝连接
  10. 英伟达实时 3D 设计协作和仿真平台已正式发布
  11. android系统测试模式,Framework基础:手机如何进入meta测试模式
  12. 试题 算法训练 调和数列问题---蓝桥杯
  13. SQL Sever奇葩问题踩坑记
  14. 程鑫峰:1.19伦敦金陷多空交织,长江金业后市行情解析
  15. vue自定义翻页组件
  16. 使用openssl命令 生成指定有效时间的ssl证书,cer格式
  17. matlab距离判别分析的应用
  18. iPad/Iphone抓包
  19. Oracle索引梳理系列(四)- Oracle索引种类之位图索引
  20. 金蝶软件安装时,提示安装包配置文件(Setup.Lst)文件不存在无法安装处理方法

热门文章

  1. 2022重庆幼教产业展览会|高科技玩具益智解压玩具博览会
  2. 浅谈巫师2的战斗难度策略
  3. 电视剧中一看就让人崩溃的镜头大全~
  4. 线性回归预测PM2.5
  5. 阿里云 Redis 报出You can't read against a non-read redis.解决方案
  6. G. The Galactic Olympics
  7. kerberos机制
  8. HTML5-iframe-frameset
  9. (二)DDL操作数据库
  10. 35岁研发经理,月薪5W+,每年涨薪6-8K,特别焦虑,网友评论区吵翻了