进程互斥的实现方法

本文深入探讨了进程在访问共享资源时的同步问题,重点讲解了各种临界区控制算法,如单标志检测法、双标志先检测法、双标志后检测法和Peterson算法,以及硬件实现方式如TSL指令、Swap指令和关开中断指令。这些方法旨在解决忙等、空闲让进和有限等待等原则,确保资源的正确访问和有效利用。同时,提到了信号量作为解决进程同步的有效工具,包括整型信号量和记录型信号量,强调了它们在避免忙等状态上的改进。
摘要由CSDN通过智能技术生成

将某资源比作厕所的一个仅有的马桶。。。

当有两个及以上的进程(几个便秘人)想要访问资源时(马桶),必须要排队,一个一个的访问,不能两个人一起进去,会发生意外。这是因为在同一个时间段内,一个资源只能由一个进程所访问。

设置一个循环条件,若进程满足条件,则会一直循环,一直等到不满足之后,跳出循坏,使用资源。

一 软件实现方式

1 单标准检测法

当进程被调度之后,处理机为这个进程服务,然后检查资源是否能够被访问。

此算法是如果要想进入厕所使用马桶,需要有一个通行证,拿到这个特权,才能访问资源。

设置了一个变量 turn 它的值表示了哪个进程号允许访问资源

主要 缺点: 不满足空闲让进原则 

循环检查的条件是:允许访问临界区的进程权限只能由上一个进程所赋予,此时允许访问的资源和想要访问资源的是不是同一个进程,如果不是,则会一直循环检查,直至时间片用完,被调度,从运行态进入阻塞态。

   所以,如果上一个进程不能及时的访问临界区,那么即使下一个进程想要访问临界资源,他也无法进入临界区,因为没有权限。他这就很霸道。所以就会导致临界区资源一直得不到利用,导致利用率低,临界区一直空闲着,但是却不能访问,违背了空闲让进的原则。

这就相当于当上一个人一直在厕所里面呆着,但是他却一直玩手机,不使用马桶,即使外面的人非常想要使用马桶,但是进不去,得不到权限,厕所的门一直被里面的人锁着,外面的人进不去。。违背了空闲让进的原则。

2 双标志先检测法

此算法解决了单标志检测法的占着茅坑不拉*的问题。

此算法是先检查是否有人想要访问临界区资源,若有人访问临界资源,就一直等待,若没有人的话,就把临界资源上锁,告诉别的进程,这个临界区的资源我占了。当访问完临界区资源之后,在告诉外面的进程,我不访问了,你们可以进去了。(都互相谦让,当知道别人没有意愿的时候,才会表露自己的意愿,这是吃了上一个算法的亏了)

(1)如何让其他的进程知道,此时这个进程是否有意愿进去临界区资源,此算法设置了一个布尔型数组flag,数组里面元素的值代表着进程进入临界区的意愿,若flag[0]=true,表示p0进程想要进入临界区,若flag[0]=false,表示p0进程不想要进入临界区。

主要缺点:由于进程的并发导致的异步性,使得进入临界区的检查和上锁(告诉外面这个资源我占了)的步骤,一个进程不能一气呵成的完成,总是有其他进程的步骤的参与,所以就可能导致着两个进程可能一前一后的进行while循环的检查,因为刚开始设置的所有的进程都没有意愿访问临界区,都互相谦让,对两个进程的循环检查都能跳过。然后又可能两个进程一前一后的同时表达自己的意愿,两个进程将会同时访问临界区,然后就会违反忙则等待原则。

  • 忙则等待:当已有进程进入其临界区时,其他试图进入临界区的进程必须等待。
  • 意思就是 当一个人在使用马桶的资源时,另一个人直接冲向厕所,不排队,不等待。
  • 忙则等待和有限等待的区别是 一个是都跳过了循环,抢着使用临界资源,另一个是跳不过循环条件,一直在循环检查,一直在等待,无法使用临界资源。

3 双标志后检测法

由于双标志先检查法,先检查两者时,都互相谦让出现了问题,进行了改良,这次不谦让了,这次直接抢资源,直接抢厕所。先占坑。双标志后检测法是对进入临界区进行后检查,先上锁,先占上坑,然后再问检查其他进程是否有意愿进入,若有意愿进入,则一直循环等待,若没有意愿,则访问临界资源。

缺点:   由于进程的并发导致的异步性,当两个进程一前一后进行了占坑操作,导致两个进程在检查有没有进程要进去时,一直有进程想要进入,所以一直循环检查,等到时间片用完之后,换另一个进程,还是一直循环检查,导致两个进程一直循环检查,陷入无尽的循环,无限的等待,(有限等待)临界区的资源得不到访问,造成了资源的浪费。(空闲让进)

4 Peterson算法

此算法解决了双标志后检查法,由于进程的并发导致的异步性使得违反了有限等待和空闲让进的原则,所以采用了孔融让梨的方法,为了避免两个进程都想要进入临界区造成的尴尬。当两个进程都想要进入临界区访问临界资源的时候,会主动让给对方,让对方先访问,在循环检查的时候,有两个条件,当两个条件都满足的时候,才会一直循环,一个条件是另一个进程有意愿访问临界区,另一个条件是孔融让梨这个条件满足。

二 硬件实现方式

1 TSL指令

    tsl指令是在硬件上执行的,执行的过程中不允许被切换。

在while循环里面,硬件执行tsl指令,只有当返回的值是false的时候,才会跳过循环,当值是true的时候,则会一直循环执行tsl指令。

上锁的值是true,未上锁的值是false,储存false和true的变量是布尔型共享变量lock,lock代表的是一个锁,是操作系统为临界区赋予的一个变量,变量,用来表示临界区的状态,上一个临界区的状态lock的值由于是过去式,则会被保存在另一个布尔型变量 old里面,tsl指令返回的值就是被保存在old变量里面,当old变量一旦被赋予值之后,不管临界区是否被上锁,lock变量则会立即被赋予true,表示临界区此时被上锁。此时硬件就会用某种方式返回old变量的值给循坏,进行检查。

一个宠物精灵lock由于吃了某种果实,而出现了进化,变得强大,有了某种功能。他这个功能是无限恋爱且无缝衔接恋爱。每隔一段时间,lock会把这段感情封存在一个罐子中,也就是old中,然后他又会重新开启新的恋情,然后呢,某个人会把lock的上一段恋爱经历提交给丘比特。丘比特是恋爱之神。(恋爱=true 失恋=false。)

如果lock的上一段恋爱是失恋,那么丘比特就知道lock是一个无缝衔接的恋爱高手了,lock已经开始一段新的恋情,就会放他过去。然后他在临界区谈过之后,他就会失恋。

如果他上一段感情是恋爱,则表示他脚踏两只船,丘比特不会放过他,只有他结束了上一段感情之后,丘比特才会放过他,然后他在临界区谈过之后,他就会失恋,如此的进行循环。 

优点:实现简单,不会像软件操作一样,存在逻辑漏洞问题,适用于多处理机环境 

缺点:存在违反让权等待的原则的问题。当在while循环时,如果满足循环条件,会暂时无法访问临界区,而导致占用处理机的资源,一直执行tsl指令,导致忙等。

忙等状态:
当一个进程正处在某临界区内,任何试图进入其临界区的进程都必须进入代码连续循环,陷入忙等状态。连续测试一个变量直到某个值出现为止,称为忙等。

false+true--->lock(变量)--->old(变量)

2 Swap指令

 swap指令是由硬件完成的,使得进程能一气呵成的完成访问临界区的操作

硬件执行swap指令在while循环里面执行,old变量用来存储lock的值,lock变量里面用来存false和true的值,只有当old的值是false时,while循环才会跳过,如果是true时,则会一直循环执行,循环执行的逻辑是交换old和当前luck的值,进行交换的操作是定义一个布尔型变量temp,用来存储当前lock的值,然后进行交换,old值赋予当前lock,之前的lock值保存在temp里面,temp值赋予old。

都是先检查临界区是否被上锁,无论是否被上锁,都将当前的lock值设置为true上锁状态。

宠物吃了果实之后,学习了swap指令,以此来保护主人,免受其他人的干扰,宠物能够实现的功能是能使他的主人能够无限恋爱和无缝连接恋爱。

当丘比特发现lock的上一段感情是失恋,由于丘布特知道lock是恋爱高手,lock肯定现在已经从失恋的状态下出来,重新进行了恋爱,所以丘比特就让lock处对象去了,处了一段时间之后,lock就会失恋,如此的仅从循环。

当丘比特发现lock的上一段感情还是恋爱的时候,丘比特就知道了,他是在脚踏两只船,就会一直等他上一段感情,失恋之后,才会放他过去。

3 关开中断指令

开关中断指令的作用是使进程能一气呵成的进入临界区,访问临界资源,不会发生进程的切换。

当进程进入临界区之前会处理机会执行关中断指令进行关闭中断,在访问完临界区之后,处理机会执行开中断指令。

缺点:1:不适用于多处理机。

当处理机执行了关中断指令之后,关中断的操作只能作用于这一个处理机上,当有其他处理机的进程也想访问这个临界区的资源时,就会有可能同时访问临界区,造成违反了忙则等待的原则。

当处理机这个管家如果有好几个的话呢,一个管家只能服务一个主人,一个管家有了这个技能之后,会保护主人进行工作,但是如果有其他的管家也会了这个技能之后,可能会抢自己家主人的工作,这就不行了。

         2:只能内核进程能使用此指令,用户进程不能访问。

由于关开中断指令权限非常大,属于特权指令,在他发挥作用的时候,只能是在处理机处于内核态的时候,才能对处理机发挥作用。还有就是只能适用操作系统的内核进程,不能让用户进程使用,否则非常危险。

处理机是为进程服务的。相当于一个管家,由于进程不老实,管家管不住它,所以管家就潜心修炼变得强大起来,使得进程不敢在胡作非为。但是呢,这个管家学习的技能由于太过强大,所以不能轻易使用,只能对一些特别管不住的进程服务,比如说内核进程,用户进程比较听话,这个管家就不能使用这个技能。。。。。。

以上几种方法,都无法解决让权等待问题,只要有while循环,就会

三 信号量

之所以出现信号量和原语是为了解决两方面的问题。

1:进程在进入区,无法一气呵成完成检查和上锁。

2:进程在进行while循环检查时会限入忙等状态。

信号量就是一个变量,和luck和old一样,信号量是储存当前系统中某种资源的数量

一对原语 wait和sigal 对信号量s来进行操作,原语的作用就是实现进程在进入区,检查和上锁的一气呵成。原语是一个程序段,通过执行关开中断指令,防止进程在进入区被中断。

这里可以理解这一对原语是两个函数,参数是s;

原语也可以是一个管家,他有技能,技能是关开中断指令,并且对信号量进行操作,一条龙服务,是为了保护主人,也就是进程在进入区不会受到伤害,可以平滑的进入临界区,平稳的离开退出区。

一整型信号量

进程需要使用资源的时候,进程就会进入进入区,进程在进入进入区的时候,会召唤他的wait管家,来为他保驾护航,执行了关中断指令,防止外界干扰,然后他的管家为对整型信号量s进行操作,来看看资源数量够不够,如果不够的话,就会一直循环等待,直至有了之后,会使s-1,表示我的主人已经占用了一个资源。在离开退出区的时候,进程会召唤他的signal原语,来为他保驾护航,使s+1,告诉系统,主人已经用完了资源,还给系统了。

1 在进入区,wait原语执行关中断指令,对s操作。

2 在退出区,signal原语执行开中断指令,对s操作。

缺点:由于wait管家在进行while循坏的时候,在发现资源机不够的时候,会一直循环检查,使处理机一直为这个进程服务,造成了忙等状态。

此整型信号量只是记录系统中资源的数量,并没有解决让权等待的问题,在while循环里面,仍然会由于资源不足,而一直循环等待。整型信号量没有多大的作用,只是wait和signal原语起了一定的作用。

处理机解析了wait和signal原语操作执行了关开中断操作。

二 记录

记录型信号量

记录型信号量与整型信号量的不同之处在于整型信号量没有发挥任何作用,如果说有作用的话,那就是为记录型信号量提供了一些思路,在整型信号量里面发挥作用的仅仅是那一对,对信号量进行操作的原语,执行关中断指令,防止了进程乱跑的问题。而记录型信号量真正解决了忙等的状态,在进程进入进入区之后,wait原语会像系统申请资源,value会减一,之后,去掉了while循环,不让进程去循环检查,不去傻傻的等待了,终究是错付了,此时会提供语句,问问系统中还剩多少个资源,如果不剩的话,那我就不死等了,我就去乖乖的去排队。

原理:对资源数量下手,为了避免忙等,当资源数不够的时候,使进程的状态改变,改成阻塞态。

当要进厕所,使用马桶的时候,当发现里面有人使用的时候,剩余的人不会在一直等待了,会调整自己的状态,自觉排队。

为了避免进程忙等,而提出了记录型信号量,记录型信号量是一个变量,里面的value用来存放剩余的资源数,struct process *L用来给等待队列排队。

在进入区 ,进程会召唤wait管家,调用资源,对信号量s进行操作,使value减1,此时为了避免忙等,不使用while循环,而使用if来进行判断。

如果自己占用一个资源的位置,而导致系统的资源变为了负值,则这个进程使用block原语主动进入阻塞态。

如果自己占用一个资源的位置,而系统的资源数量还是>=0,则进程正常进入临界区。

在退出区,进程会召唤signal管家,管家会对信号量s操作,使value的值+1,在进行判断,系统是否还有资源,若还显示负值,则有的进程在排队,则用wake原语来唤醒队列里的进程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值