操作系统——进程同步

进程同步

在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。为了协调进程之间的相互制约关系,引入了进程同步的概念
1.临界资源。系统中有许多可以供进程共享的资源,但是有些资源同一时间只能供一个进程使用,这种资源称之为临界资源。所以临界资源的访问,必须是互斥进行的,在每个进程中,访问临界资源的那段代码称之为临界区,为了保证临界资源的正确使用,可以把资源分为4个部分。
进入区:判断是否能够进入临界资源,并设置正在访问临界区的标志
临界区:访问临界资源的代码。
退出区:将正在访问临界区的标志清楚
剩余区:代码中的其余部分。

在这里插入图片描述
2.同步
同步称为直接制约关系,是指为完成某种任务二建立的两个或者多个进程,这些进程因为需要某些位置上协调它们工作而等待,这种直接制约关系源于它们的合作。
3.互斥
互斥又称为间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一个进程才能访问临界资源。
为了禁止两个进程同时进入临界区,同步机制应该遵循以下准则:
(1)空闲让进:进阶区空闲可以允许一个请求进入临界区的进程立即进入临界资源。
(2)忙则等待:当已有进程进入临界区时,其他视图进入临界区的进程必须等待。
(3)有限等待:队请求访问的进程,因保证能在有闲时间内进入临界区。
(4)让权等待:当进程不能进入临界区时,应立即释放处理器,防止进程忙等待。
在这里插入图片描述

在这里插入图片描述

实现临界区互斥的基本方法

软件控制互斥

单标志法

算法思想:两个进程访问完临界区后,设置公共整形变量turn,用于指示被允许进入临界区的城城编号,若turn=1则进程1进入临界区,若turn=0则进程0进入临界区
在这里插入图片描述

双标志先检查法

设置布尔变量,标志每个进程队进入临界区的意愿,如果对方有进临界区的意愿则让对方先进
优点:不用交替进入,可连续使用
缺点:可能会同时进入临界区,在双方都检查出对方不想进入临界区,但是还没有表示自己想进入临界区的时候,处理器切换了,导致两个进程同时表示自己想进入临界区,但是这个室友已经检查完成了,导致两个进程同时访问临界资源。
在这里插入图片描述

双标志后检查法

和上一个方法一样,设置两个布尔变量,表示自己是否愿意进入临界区,区别在于,先表示自己想进入临界区,在确定对方是否想进入临界区。
优点:解决了两个进程不会同时进入临界区的问题
缺点:两个进程都表示了自己想进入临界区,但是双方都愿意让对方进入,这样导致两个进程都没有进入临界区,最后会导致进程饿死。
在这里插入图片描述

Peterson算法

设置单标志法的turn,也设置双标志法的flag,双方都想进入临界区,检查对方是否想进入临界区,如果对方想进,让对方先进,由于有turn的原因,所以最后一个进程检查完成之后,会让对方先进入临界区,这样就解决了之前算法的所有问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

硬件实现互斥方法

中断屏蔽方法

在一个进程使用处理机执行他的临界资源代码的时候,为了防止其他进程进入临界区,进程访问的最简单方法是,直接关掉中断,因为cpu只有在中断的时候才会进程切换。
在这里插入图片描述

Test and Set指令

这条指令是原子操作,在执行该代码的过程中是不允许打断的,在这个过程中让检查是否有人占用临界资源,并且表示自己想进
在这里插入图片描述

Swap指令

和testandset一样是允许被中断的指令,原理也是一样的。
在这里插入图片描述

在这里插入图片描述

总结

硬件方法的优点:适用于任意数目的进程,而不管是单处理机还是多处理机,简单、容错验证其正确性。可以支持进程内有多个临界区,只需为每个临界区设置一个布尔变量
缺点:进程等待进入临界区时需要耗费处理机时间,不能实现让全等待,因为是随机进入临界区,有的进程可以能一直都选不上,导致进程饿死。

信号量

信号量机制是一种,功能性比较强的机制,可用来解决互斥与同步的问题,它只能被两个标准的原语wain(S)和signal(S)来表示,也可以记为P操作和V操作

整型信号量

整型信号量被定义为一个用于表示自愿数目的整数量S,wait和signal
在wait操作中,只用信号量S <=0就会不断的测试,导致忙等,不满足让权等待
在这里插入图片描述

记录性信号量

记录型信号量不仅仅有代表资源数量的value还有一个进程链表L,用于连接所有等待该资源的进程
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

利用信号量实现同步

进程信号量解决进程之间的同步问题,在有顺序的代码执行的过程中,下层代码需要上层代码运行结束后才能运行,在下层代码前放一个p操作,p操作需要消耗一个临界资源,但是如果这个时候没有临界资源,就会进入阻塞队列一直等待,然后在上层代码后放置一个V操作,V操作会返还一个临界资源,这样下层资源前的P操作通过,这样就完成了同步的功能。
在这里插入图片描述

利用信号量实现异步

通过p操作来消耗临界资源,这样其他想进入临界资源的进程就只有自己阻塞等待临界资源空闲,当进程用完临界资源之后执行V操作,释放临界资源,并唤醒阻塞中的进程
在这里插入图片描述

利用信号量实现前驱关系

信号量可以用来表示前驱关系
在这里插入图片描述

真题

2020:
(1)空闲让进:进阶区空闲可以允许一个请求进入临界区的进程立即进入临界资源。
(2)忙则等待:当已有进程进入临界区时,其他视图进入临界区的进程必须等待。
(3)有限等待:队请求访问的进程,因保证能在有闲时间内进入临界区。
(4)让权等待:当进程不能进入临界区时,应立即释放处理器,防止进程忙等待。
互斥条件里面第四个让权等待不是必须满足的条件
2018:
若x是管程内的条件变量,则当进程执行X.wait()时所做的工作是阻塞该进程,并将其插入阻塞进程中,如果进程B执行了X.signal()操作那么会唤醒x对应的阻塞队列对头进程。

2016:
用tsl指令实行进程互斥伪代码如下

do{
	……
	while(TSL(&lock));
	critical section;
	lock=FALSE;
    ……
}whiletrue

由lock变量来负责唤醒阻塞态的进程
带带进入临界区带的进程不会主动放弃cpu会一直在while处 循环
该代码不满足让权等待
while(TSL(&lock));不会再关中断的时候执行,因为如果关了中断之后,就不会因为lock而跳出循环

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
管程条件变量是一种在并发编程中用于线程之间进行协调的一种机制。在操作系统中,通常使用互斥锁(Mutex)来保护共享资源,但有时单纯的互斥锁无法满足线程之间的协作需求,这时就需要使用条件变量。 在管程中,一个条件变量与一个或多个互斥锁相关联。线程可以根据条件变量的状态来决定是否继续执行。 条件变量由两个主要操作组成:wait和signal。当线程执行wait操作时,它会阻塞自己并释放相关的互斥锁,等待被其他线程通过signal操作唤醒。而当线程执行signal操作时,它会通知等待在条件变量上的一个或多个线程继续执行。 条件变量的使用一般遵循以下步骤: 1. 线程获取互斥锁。 2. 线程执行wait操作,如果条件不满足,则线程会被阻塞。 3. 当其他线程满足条件时,通过signal操作唤醒等待的线程。 4. 被唤醒的线程重新获取互斥锁,并检查条件是否满足。 5. 如果条件不满足,线程再次执行wait操作,继续等待。 6. 条件满足时,线程继续执行下去。 通过使用条件变量,可以有效地实现线程之间的协作和同步。它允许线程有选择地等待某个特定的条件满足,而不是简单地忙等待。这样可以提高程序的效率,并减少资源的浪费。 总之,管程条件变量是一种用于线程间协作的机制,通过wait和signal操作可以实现线程的阻塞和唤醒,使得线程能够有选择地等待某个特定条件的满足。它是并发编程中一个重要的工具,能够提高程序的效率和资源的利用率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值