陆老师布置了一道题目信号量题目

 上传我的文档
 下载
 收藏
毕业于医学院校,在医院工作,有相对丰富的护理经验
 下载此文档
正在努力加载中...
操作系统习题答案第
下载积分:3000
内容提示:操作系统习题答案第
文档格式:DOC|
浏览次数:36|
上传日期: 14:04:37|
文档星级:
该用户还上传了这些文档
操作系统习题答案第
官方公共微信【图文】【2】2-5 信号量习题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
【2】2-5 信号量习题
上传于||暂无简介
大小:353.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢信号量用来解决同步问题时,其初值必须是多少?这是一道关于操作系统的题。信号量用来解决同步问题时,其初值必须是1、大于02、必须等于03、可以等于0以上三个答案哪个是对的?
为您推荐:
扫描下载二维码信号量的PV操作(例题)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
信号量的PV操作(例题)
上传于||文档简介
&&操作系统有关信号量PV操作的部分知识,含有例题。
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩15页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢5207人阅读
学习note(64)
一道操作系统信号量的经典问题,很久不接触,快要忘记了,想不通了,所以贴出来再回顾一下。
有一座桥,南北向,都有入口出口。(图我不画了)
1.假设该桥上每次只能有一辆车行驶,试用信号灯的P、V操作实现交通管理。
2.假设该桥上不允许两车交会,但允许同方向多个车一次通过(即桥上可有多个同方向行驶的车)。试用信号灯的P、V操作实现桥上交通管理。
参考答案:
int countSN=0;
int countNS=0;
semaphore mutexSN=1;
semaphore mutexNS=1;
semaphore bridge=1;
因为操作系统的东西很长时间没看,略生疏了,有些知识点断了,就想不明白事情是怎么回事了。
从我现在的立场看,bridge信号量只有一个,通过bridge信号量看,根本就没有矛盾在,整个过桥过程,连count++带count--全被bridge包起来成了原子操作。
这样看来,countNS和SN也没必要区分了,一个count就够了,谁叫过程都被bridge包起来了呢。
那么,错误在哪呢?p(bridge)真的就代表互斥操作,没有第二个能上桥了么?这么经典的问题,还去查了一下,也确实应该是类似答案,那么,到底是什么知识点缺失导致我现在无法理解这个答案了呢?
mutex和semaphore的叫法又暗示着什么区别呢?
本例中,声明信号量用的是semaphore类型,具体的用了mutex作为变量名,不是互斥关系,应该是一个东西~!
mutex == mutual exclusion
信号量的东西看似很烧脑,但是非常符合逻辑,按一定规律来“生搬硬套”是可以无误完成的。
先看一个寺庙打水的问题:
寺里有小、老和尚若干,有一水缸,有小和尚提水入缸供老和尚引用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可同时进行。给出取水、入水的算法描述:
分析:其实,信号量的引入,就是为了解决有限资源使用的互斥问题。那么,分析的重点应该集中在——”哪些资源为互斥资源?“
咬文嚼字分析一下到底哪些资源是有限的(文字描述很容易产生分歧或看走眼的,尤其本例很多相近的字眼,加上句子的排版,都容易让人产生误解)。
首先看和尚,老的小的都是若干(老的是消费者,小的是生产者);
然后看消费资源——水缸中的水,最多10桶,最少0;
生产和消费过程都是受水桶限制的(和尚都无限了,这个过程不受限就不可能缺水了~)——此处也容易产生争议,认为老和尚喝水不用桶,不要小看这个分歧。
最后,打水还要考虑桶的数量,每次入井是一个桶,总共水桶数为3.
变量设置(尽量起的通俗易懂,不叫什么empty和null的):
Semaphore mutexWell = 1;//入井的桶数限制
Semaphore mutexVat = 1;//入缸的桶数限制
unsigned int space= 10;//剩余空间,初始没水,empty=10其实是说还有10个空位供你往里送水。。。。
unsigned int avalable = 0;//缸中可用水量,初始没水,需要往里加
unsigned int bucket= 3;//桶数3
流程分析:
首先,水缸Vat满着(empty = 10)是没法去打水的。
其次,打水要拿起一个桶bucket,拎水也需要,直到把水倒入缸vat中才结束周期,释放。
下边是生产者和生产者的函数(supply和consume太俗了,和尚是monk,小和尚可爱点,加个昵称,叫monkey吧,没有恶意,出家人六根清净,是不会在意这些细节的):
/*虽然还没有把水装进去,但必须先减space,等于声明这事有人做了,不要轻易做重复,超了的话就拎着水呆着吧,要等着水缸有空间才能倒入,三个小和尚等待就等于没有水桶了,老和尚没有水桶也喝不了水,死锁。不过,老和尚可以用手啊,可以爬进去喝啊,说正经的,可以直接让小和尚把他手里桶给你啊——弱智~!!
如 果你思维活跃、较真,很多题真是伤脑筋,无解。或者说,这个题可以复杂到非常难分析。比如,这个老和尚喝水用桶就有争议了,到底这个桶是只有小和尚用还是老和尚也用,如果都用,可不可以小和尚直接把桶交给老和尚?为何不可?所以,出题者还是严谨点吧,碰到严谨的学生,你可就真是大坑。)
p(space);//水缸没满则可以开始打水,水桶空间space-1
p(bucket);//有水桶才可以打水
p(mutexWell);//水井太窄,独占
从井中取水;
v(mutexWell);//释放水井
p(mutexVat);//水缸也小,独占
将水倒入缸中;
v(mutexVat);//释放水缸
v(bucket);//打水完成,释放水桶
v(available);//可用水量+1
p(available);//老和尚要喝水,首先要有水吧available
p(bucket);//然后,老和尚也需要水桶进去捞水
p(mutexVat);//水缸太窄,又要独占把
v(mutexVat);//释放
v(space);//咕咚咕咚,喝完了,水缸里多了空间(其实是打出来了就多了)。
v(bucket);//交出篮子
茶妹采茶:多个茶妹采茶同时倒入茶箱,茶箱慢,有一个运茶人换箱并将箱运走,茶箱最多容纳16袋茶,要求用PV操作对这些茶妹和运茶人进行正确管理。
因为茶妹可以无数个,运茶人只有一个,也就是无数生产者,一个消费者(或者运输者)。因为都是对箱子进行操作,所以假设茶箱是临界资源(也许有争议认为换箱是瞬间的,但是既然题目这样给了,肯定说的不是瞬间动作,需要独占一下;同样道理,倒茶动作也独占)。
茶箱满运茶人才来运,所以需要一个信号量full来提示运茶人换箱。
semahpore mutex = 1;
producer(){
transport(){
是不是很简单呢,不过似乎还有问题,别忘了,运茶人不是随便装茶走的,要满。所以要加一个
本 文分析的就是到底多少个信号量才够用,一个full从0和1之间变换,是能告诉运茶人full == 1时来换箱了。但是16袋茶才满箱,在0到15之间倒茶时,怎么能区分是不是倒满箱了呢。所以这一个变量不够用。那怎么办?加信号量,还是if语句?即使 加了if语句,也至少需要一个变量来判断是不是到16了吧。
最后,这个判断要和临界区的排斥功能融合起来,也就是要知道什么时候告诉其他采茶妹停止倒茶。判断语句必然在倒茶之前,觉得没满才对茶箱进行P操作。
所以粗糙的分析一下:
semahpore mutex = 1;//茶箱临界资源互斥。
unsigned int space = 16;//茶箱剩余空间(还可倒入多少茶)
unsigned int full = 0;//茶箱是否满,不满全为0.
producer(){//倒茶者
if(space != 0){//进入条件是剩余空间不为0,不代表过程中一定是。
&&& p(mutex);
&&&space--;//更改space变量的操作肯定要在if(space != 0 ) {}的内部,肯定要在V操作之前,不然你前脚刚倒满,还没“声明满了”,人家后脚又倒入,溢出了。
&&&v(mutex);
&&&if(space == 0){//如果这次倒满了
&&&&&&full = 1;//把茶箱转为“(full)满”状态
&&&}/* 个人理解:full置1的操作在V操作之后一定不会出错了!但是在之前也没太大问题~因为这只是伪代码,不是单个语句,从程序运行效果来讲,假如那个P操 作内部的实现是忙等,早将full置1会让运茶人早点对换箱操作进行尝试,考虑到多进程执行顺序不固定,晚置1的话会导致一定的拖延。但是~如果这个P操 作只是单条语句,先将full置1会导致运茶人卡在if语句内,从而出错,不过不太可能,P操作其实就应该是忙等,多次尝试,哪有一次不成功就受挫停止
的,有兴趣的还是去找一下具体的系统实现代码。
这句这么灵活的主要原因是运茶人条件简单,只要别在茶箱不满的时候让运茶人P到信号量就行了。那么又因为有了if语句,见满才运,所以这个条件很好做。
所以说,条件限制和顺序限制到底死不死,也看你设置的信号量和变量~!
transporter(){//运茶人
&&&if(full == 1){//满了才运茶
&&&&&&p(mutex);
&&&&&&换茶;
&&&&&&space = 16;//茶箱重置,16空间
&&&&&&v(mutex);
&&&&& full = 0;//这句和上边那句full置1操作一样,同样可以考虑放在V操作之前,区别不是很大。
关键点:用space来完成倒茶人之间的互斥,用full来完成运茶人和倒茶人之间的互动。单独一个信号量来保证同一时刻只有一个人使用茶箱(倒入或运出)
如果这些分析没有错的话,可以看到,其实信号量就是保护临界资源,要的就是一些逻辑,掌握一定规则,按固定模式套是没有问题的。
再回到第一个问题:
第一个过桥问题“答案”让人难以理解,主要还是信号量名称设的晦涩难懂,又没有加任何注释,流程有时候看着也乱,都是自己加空格增加条理。
进行了一定的复习以后,再看过桥问题,这是过桥问题的另一范本:
A方向行人过桥:
&&& P(SA);
&&&&&&countA = countA + 1;
&&&&&&if(countA == 1)
&&&&&&&&&P(mutex);
&&&&&&countA = countA - 1;
&&&&&&if(countA == 0)
&&&&&&&&&V(mutex);
B方向行人过桥:
&&& P(SB);
&&&&&&countB = countB + 1;
&&&&&&if(countB == 1)
&&&&&&&&&P(mutex);
&&&&&&countB = countB - 1;
&&&&&&if(countB == 0)
&&&&&&&&&V(mutex);
其中,上桥的时候要进行判断,看自己是不是同向第一人,是的话就由你去申请占用整个桥梁,不是同向第一人,只管按流程改一下count,上桥过桥就完了。
此 时两个mutex(SA、SB)是对两个count(A、B)进行保护,这样来看的话,两个count就不能共用了,如果count共用,比如西去东的人 在桥上,东去西的人尝试count+1之后count肯定大于1,根据if语句(判断同向count是否等于1,结果不等于),不会尝试对bridge进 行p操作,而反过来说,因为西去东的count被凭空无故的加了1,那么即使所有人都下桥了,count还是不能为0,不会对bridge进行V操作。
那这段代码和上边看那个“答案”其实是差不多的,二者只有+1的位置不同,判断的条件不同,“0+1再去判断是否为1”和”0是否为0“没有太大区别!
那么如果变成一个count来计数双向的人行不行?
貌似不行~!这只能实现首个上桥的人要跟对面人互斥使用bridge。之前看错了条理(这种写法本身是很乱的),认为一个bridge的PV操作就互斥了整个过程,那么多余的count就真的没必要了~!其实呢,对bridge的P操作只在if语句中,其余操作都不是互斥的。。
如果按我做的这个三段式的过程来分析,就能清楚地发现问题:
上桥,count+1,互斥对count进行操作。
过桥,可能会很漫长,反正不是瞬间完成
下桥,count-1,互斥对count进行操作。
流程拆分才是重点!如果不是按之前的误解来算,一个bridge的PV操作不能互斥整个后续过程,那么如果count再不区分方向,如果桥上有人(count不为0),似乎不能证明你是首个上桥的对面人,你发现count不为0,就不会尝试对bridge的操作而直接上桥,问题随之而来。。。
所以,毕竟是那么出名的一个题,一般都不会出现错误答案,只不过大家都小加工一下,改改名称罢了。
追加较完整题目和答案:
(二)&&有一座东西方向的独木桥;用P,V操作实现:
(1)& && & 每次只允许一个人过桥;
(2)& && & 当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待。
(3)& && & 当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向,只允许一个人单独过桥。(此问题和读者与写者问题相同,东向西的为读者,西向东的为写者)。
设信号量 MUTEX=1
设信号量: MUTEX=1 (东西方互斥)
& && &MD=1& & (东向西使用计数变量互斥)
& &MX=1& & (西向东使用计数变量互斥)
设整型变量: CD=0&&(东向西的已上桥人数)
& && &&&CX=0&&(西向东的已上桥人数)
从东向西:
{P (MUTEX)&&}
CD=CD+1
{V (MUTEX)&&}
从西向东:
{P (MUTEX)&&}
CX=CX+1
{V (MUTEX)&&}
(3) 解:从东向西的,和(2)相同;从西向东的和(1)相同。
另外 追加一些练习题:
直接贴图了,因为不画图直接写文字不方便观看。
简单分析:
n个顾客最多,所以顾客进入和离开是对Sn进行PV操作(因为Sn初始值是n~)
比较纠结的是S1和S2这块,可能会觉得有点纠缠的感觉,其实就是给他加个概念、加些文字去理解:
虽然收银员只能处理一个顾客,但不代表顾客都想被他处理。。。
顾客不是全排队等着他收银的,万一大家正好都没有结帐的意愿而在闲逛呢,收银员应该停下来才对吧?不然收谁去啊!?
那么就是说有人来了他才工作,所以说,需要一个信号量来告知他可以收费了(或者你把他也当成一个消费者,比较直观),这就是一个V操作,对信号S1(其实和S2没有本质区别,选项会告诉你没得选择)进行V操作,就是让0变1了。
其实这个“沉睡了一万年“的”渴望收费”的收银员也一直在等人“唤醒”他,他得进行P操作,那么既然用S1当这个唤醒信号了,S1变成1了,那么收银员肯定是进行P(S1)。
当收银员收费结束,他得告诉人家“给完了钱,你就可以走了!”——或者理解为,你可以推着货物出去而不响警报了。。。
那么顾客就消耗了这个机会P(S2),就走出去了,然后V(SN),超市可容纳顾客又多了一个。
解释如果还模糊的话,那这么说:S1是排队顾客给收银员传达的,说你可以干活了。S2是收银员给排队顾客的,说你交过钱可以走了!
这个就简单多了,除非对流程有争议(比如认为发货员全程陪同,顾客出了仓库才算完),按一般理解的话,就是你提货经过发货员,检验就直接和发货员没关系了,全是检验员的事,所以S1是2,S2是1,顺序是P(S1)获得发货员,V(S1)释放。P(S2)获得检验员,V(S2)释放。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:482660次
积分:3972
积分:3972
排名:第6301名
原创:144篇
评论:86条
阅读:4500
文章:24篇
阅读:27239
阅读:272513
(2)(8)(8)(7)(1)(2)(1)(3)(1)(1)(3)(6)(1)(2)(12)(18)(2)(1)(6)(2)(9)(17)(2)(1)(1)(2)(11)(4)(18)

我要回帖

更多关于 一张考卷上有5道题目 的文章

 

随机推荐