火车抢厕所不做人系列(OS并发互斥的小故事,看完不懂,你.....我)

阅读: 评论:0

火车抢厕所不做人系列(OS并发互斥的小故事,看完不懂,你.....我)

火车抢厕所不做人系列(OS并发互斥的小故事,看完不懂,你.....我)

【时间:2020年4月的某日】

【地点:一辆绿皮火车上,18th车厢(别问我为什么买到了最后的车厢啊QAQ)】

【人物A:我,特点:聪明机智】

【人物B:王五,特点:就喜欢找事】

【人物C:OS老师,特点:知识渊博】

那么让我娓娓道来发生了什么:

 

场景一:

     王五:“肚子有点不舒服,上个厕所去!”。

     我:“我待会也准备去”。

     当王五进入厕所,关上厕所门的时候.....

     我:“发生了什么,我怎么动不了了啊!”(这里就有关中断啦~)

     OS老师:“别慌,这个是厕所的并发互斥的策略,一会就好了”。

     王五:“我上好了,真舒服啊”,此时王五打开厕所门。

     我:“我可以动了,老师,刚刚你说的是什么意思啊?”

     OS老师:“火车上的厕所是临界资源,而王五和你作为进程都想进入厕所,为了避免临界区冲突,厕所的互斥机制就会启动,当王五进入临界区时,作为另一个想要进入厕所的你,就会被关掉,此时你就无法操作,直到王五退出来,你才可以进入临界区,这样就避免了临界区资源冲突”。

     我:“我明白了,这就是操作系统里面的关中断”,说完我就去上了厕所。回来之后,我求老师利用技术改变厕所机制,不然刚刚那个不能动的时间,完全忽视了我的能动性嘛。

 

 


场景二:

     王五:“不行,我肚子又不舒服了,再去厕所”。

     我:“我也是,真奇怪”。我想着王五是去18节的厕所,那么我就去17节,当我走到厕所门口时,进行判断,厕所门是关上的,显示有人。于是我被新的机制放到一旁,一直盯着厕所门(空转,一直占有我的资源),一直盯着,直到,门开了......

     我:“......老师的新机制,我真开心啊!!!!”。

     王五:“咦?你怎么在这,我发现厕所都满了,就这一个,所以就来这里上厕所了”,此时王五走了,我在一瞬间冲上去关上门,别问我为什么这么勇猛,因为我突然想起来可以老师给的新机制是TS测试并设置指令。它长这样:

bool TS(boolean *lock){Boolean old;old = *lock;*lock = TREU;return old;
}

     我:“让我来说一说新的机制吧,首先我们每个人去临界区都要判断,空闲使用,并且将门关上,如果正在使用,那么就空转等待,直到上一个进程结束。为什么我要冲呢,因为会存在饥饿现象(等等,额,去厕所貌似有点尴尬),会出现一个进程一直使用,而其它进程得不到资源的情况”。

     我:“老师,可不可以在改个机制呀,给我加一个if语句,当厕所关门的时候我也可以做其他的事情呀!”。

     OS老师:“没问题,老师可是万能的哦!”。

 

 


场景三:

     王五:“中邪了,肚子又不舒服,再去个厕所”。

     我:“我也是(被迫营运呜呜呜呜)”。

     于是我又去了厕所,都关门了呀.....然后回到位子上做事情(内心:新机制真好用!!!)。

     这个时候王五出来了

     王五:“cat,快来啊,我解决了”。

     我:“好的”。一路小跑,刚到门口.....!王五瞬间又进去了,关上门。

     王五:“不行,又痛了”。

     我:“......记得叫我啊”。

     又过了好长时间......

     王五:“我好了,快来!”

     我:“好勒,都快不行了”

     又刚跑到门口,nm王五又关上门(一直占有,我抢到的几率几乎为零)

此时的我已经快不行了,幸好17节有人出来,我快快冲了进去,然后跑到老师那里!

     我:“老师,虽然等待的时候我是自由的,但是还是没有解决饥饿现象啊,可以换换嘛,换个机制吧,求你了!”一脸苦涩

     老师:“那你观察一下刚刚的上锁原语有什么缺点:”

上锁原语如下:

 

Lock(x)
{if(x==true){保护现行进程的CPU现场;现行进程进入x的等待队列;设置改进程为等待状态;转进程调度;}x = true;
}UnLock(x)
{if(x等待队列不空){移出队列首元素;将进程放入就绪队列;设置该进程为就绪状态;}x = false;
}

 

     我:“虽然刚刚王五做完之后叫我,但是太不公平了,他一直进去,主要是每次都有个判断机制,佛le。老师帮帮我吧”。

     老师:“这个问题,幸好迪杰斯特拉大佬已经解决了。就是定义一个信号量,这里我们的话,待会找一个工作人员看守厕所,如果想要进去,就必须进行登记,然后再进行判断。我给你看看PV原语吧”。

 

P原语wait(s)
--s.count;//表示申请一个资源
unt<0)//表示没有空闲资源;
{调用进程进入等待队列s.queue;阻塞调用进程;
}V原语signal(s)
+&#unt;//表示释放一个资源;
unt<=0)//表示有进程处于阻塞状态
{从等待队列中取出一个进程P;进程P进入就绪队列;
}

     

     我:“我懂了,每次都做记录的话,就不会发生这种情况了,感谢迪杰斯特拉大牛!”。

     老师:“那你知道要放在哪里吗?这些语句?”。

     我:“我知道,老师你看!”

     

P
临界区
V

     老师:“是的,你见识到了操作系统的魅力了吗?”

     我:“懂了懂了,上厕所去!”。

     

                               从此,我和王五就快乐的上起了厕所,火车上的厕所真好啊!

 

后记:

     不做人系列还有的哦,喜欢的可以点个赞,评个论,谢谢,有错误也可以指出来哦。

本文发布于:2024-01-30 02:35:25,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170655332918626.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:不懂   看完   小故事   厕所   火车
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23