火车抢厕所不做人系列(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;//表示申请一个资源
if(s.count<0)//表示没有空闲资源;
{
    调用进程进入等待队列s.queue;
    阻塞调用进程;
}


V原语signal(s)
++s.count;//表示释放一个资源;
if(s.count<=0)//表示有进程处于阻塞状态
{
    从等待队列中取出一个进程P;
    进程P进入就绪队列;
}

     

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

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

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

     

P
临界区
V

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

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

     

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

后记:

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

发布了123 篇原创文章 · 获赞 234 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/105294549