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

news/2024/11/24 5:20:36/

【时间: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

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

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

     

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

 

后记:

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


http://www.ppmy.cn/news/706795.html

相关文章

【笔记】EFCore SQLite 拼音汉字互换

1 vs2019新建.net core console项目&#xff0c;NuGet添加包 Microsoft.EntityFrameworkCore //ef core Microsoft.EntityFrameworkCore.Design //在nuget Microsoft.EntityFrameworkCore.Tools //控制台中管理数据迁移 Microsoft.EntityFramework…

杂七杂八知识点的摸索

文章目录 一、tcp/ip协议栈1.1 OSI七层模型1.2 TCP timewait太多是什么原因1.3 TCP建立详细过程和UDP区别1.4 介绍一下tcp包头有什么内容1.5 TCP 三次丢包了怎么办,过多久重传1.6 TCP 4次为什么要4次关闭1.7 TCP 4次关闭服务端先关闭好还是客户端先关闭好1.8 TCP UDP 区别分别用…

深度学习中的一些基本概念

深度学习中的一些基本概念 一维卷积&#xff08;离散&#xff09; 对于一维卷积的理解&#xff0c;是在一次坐火车的时候。所谓的一维卷积&#xff0c;无非就是两列火车相向而驰&#xff0c;从头碰头&#xff0c;到尾离尾的过程。我们把两个向量比作两列火车&#xff0c;向量…

以字符串为参数的函数 / 不同形式字符串的使用

面向对象上机&#xff0c;函数参数里面最常用到的应该就是字符串了&#xff0c;但是一直都没有搞清楚具体有哪些使用形式&#xff0c;怎么用&#xff0c;对使用时所会发生的错误有哪些解决办法&#xff1f;于是乎在今天做个总结&#xff0c;方便自己日后回顾。 Ⅰ.字符指针 1.常…

JAVA复习之流程控制、数组、泛型、集合

一、详细教程见: 程序结构(流程控制语句) 二、注意事项&#xff1a; 1、case不可以使用浮点类型 2、如果遇到循环嵌套情况&#xff0c;break语句只会使程序流程跳出包含它的最内层的循环结构&#xff0c;即跳出一层循环 3、break、continue提供了“标签”的功能 三、数组 例…

Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)

文章目录 修改虚拟机IP复制网卡的配置 Vi编辑器的常用命令实操部分复制网卡的配置 Hadoop集群初体验20、secondarynameNode如何辅助管理FSImage与Edits文件 ⭐⭐⭐21、SecondaryNamenode存在的意义是什么&#xff1f; ⭐⭐⭐⭐22、SecondaryNamenode工作的触发因素有哪些&#…

MySQL索引【详解】

给大家推荐一款好用的CSDN云服务&#xff0c;新人首购折扣哦&#xff0c;点击下图跳转&#xff1a; 文章目录 第一篇 什么是索引&#xff1f;1、来看一个问题方案1方案2方案3方案4 2、索引是什么&#xff1f; 第二篇 MySQL索引原理详解1、背景2、预备知识什么是索引&#xff1…

服务器域名HTTP

目录 服务器域名层次结构解析过程 HTTPHTTP请求过程get和post的区别 服务器 什么是服务器&#xff1a; 服务器&#xff08;server&#xff09;&#xff0c;就是一种特殊的计算机&#xff0c;也包括处理器、硬盘、内存、系统总线等&#xff0c;但是由于需要提供更可靠的服务&…