操作系统 进程管理(三)——进程同步方法简述

目录

进程同步的基本概念

1)两种形式的制约关系

2)Critical section(临界区)

3)Mutual exclusion(互斥)

4)Dead lock(死锁)

5)Starvation(饥饿)

6)面包问题(锁的概念)

同步机制原则

实现进程互斥的方法

方法一 基于软件的解决方案

算法一 x

算法二 x

算法三 x

算法四——Peterson算法 1981 √

算法五——Backery算法作为补充

方法二  禁用硬件中断

(一)锁方法 TS互斥

(二)交换指令Swap方法

方法三  信号量机制

1)整型信号量

2).记录型信号量

3)AND型信号量集机制

 3)一般信号量集机制


在多道系统中,并发执行的诸进程之间,既有独立性,又有制约性。

独立性是指各进程都可独立地向前推进;

制约性是指由于资源共享和进程合作所引起的进程之间的相互依赖和相互制约的关系。进程之间的相互制约关系有两种:互斥和同步,互斥也可看作是一种同步,一种特殊的同步。

进程同步的基本概念

1)两种形式的制约关系

(1)间接相互制约关系。

(2) 直接相互制约关系。

2)Critical section(临界区)

临界区是指进程中的一段需要访问共享资源并且当一个进程处于响应代码区域时编不会被执行的代码区域。

3)Mutual exclusion(互斥)

当一个进程处于临界区并访问共享资源时,没有其他进程会处于临界区并且访问任何相同的共享资源。

4)Dead lock(死锁)

两个或以上的进程,在相互等待完成特定任务,而最终没法将自身任务进行下去。

5)Starvation(饥饿)

一个可执行的进程,被调度器持续忽略,以至于虽然处于可执行状态却不被执行。

6)面包问题(锁的概念)

-Lock (锁)∶在门、抽屉等物体上加上保护性装置,使得外人无法访问物体内的东西,只能等待解锁后才能访问。

-Unlock(解锁):打开保护性装置,使得可以访问之前被锁保护的物体类的东西。

-Deadlock (死锁)∶A拿到锁1,B拿到锁2,A想继续拿到锁2后再继续执行,B想继续拿到锁1后再继续执行。导致A和B谁也无法继续执行。

同步机制原则:

空闲让进:当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效利用临界资源

忙则等待:当已有进程进入临界区时,表明临界资源正在被占用,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥使用

有限等待:对要求访问临界资源的进程,应保证在有限时间内能进入到自己的临界区,以免陷入死等的状态

让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以避免进程陷入忙等状态

实现进程互斥的方法

解决临界区问题的三个必须标准:互斥访问, 进入(即不死锁), 有限等待(即不饿死)

方法一 基于软件的解决方案

 算法一 x

缺点:满足互斥,但是Starvation。须轮流使用临界区,不能同一进程使用两次

           一个进程失败,另一个将被永久阻塞。

算法二 x

缺点:不能互斥,若起初设置flag[i]和flag[j]都为false,那么可以先执行 1再执行2,这样就同时进入临界区了。

算法三 x

缺点:  满足互斥,但是死锁先执行1再执行2,两者都无法进入临界区

算法四——Peterson算法 1981 √

这个佬讲得很好:Peterson‘s Algorithm皮特森算法详解_我知道你是高手的博客-CSDN博客_皮特森算法

flag数组:为了判定是否有其他进程想要进入临界区(避免如果没有其他进程想要进入,当前进程一直空等)

turn变量:为想要进入临界区的进程进行排序(turn==i则Pj在前,turn==j则Pi在前),先提出申请的进程优先进入临界区,其他进程等待,就这样实现了对临界区访问的互斥。

若Pi和Pj都想进入临界区,i先提出申请,j后提出申请,进入while循环判定时turn==i(Pi执行turn=j在前,Pj执行turn=i在后,所以while循环中的turn==i);先提出申请的进程先进入临界区;Pi走到while循环,此时flag[j]==true,turn==i,不满足循环条件,跳出(若是Pj不想进入临界区压根就没有提出申请,那么flag[j]==false,更不满足循环条件),Pi就可以继续进入critical section;Pj走到while循环,但是因为此时flag[i]==ture且turn==i,Pj陷入while循环中无法进入critical section,Pj需要一直等到Pi退出临界区时置flag[i]==false才能跳出循环,进入临界区;

算法五——Backery算法作为补充

方法二  禁用硬件中断

 没有中断,没有上下文切换,因此没有并发

        >硬件将中断处理延迟到中断被启用之后
        >大多数现代计算机体系结构都提供指令来完成

(一)锁方法 TS互斥

进入临界区 >禁用中断

离开临界区 >开启中断

(二)交换指令Swap方法

缺点:一旦中断被禁用,线程无法被停止,整个系统都会停下,可能导致其他线程starvation

           临界区若可以任意长,无法限制响应中断所需时间:忙等

方法三  信号量机制

1)整型信号量

抽象数据类型:一个整形(sem),两个原子操作

  • P(): sem减1,如果sem<0,等待,否则继续(wait(S))
  • v(): sem加1,如果sem<=0,唤醒一个等待的P(signal(S))

ps:

  • Sem表示空闲资源数(锁方法中仅为一个,或一个进程使用
  • P操作申请一个资源,V操作释放一个资源。
  • 缺点: 忙等,故把这种PV操作称为忙等PV操作。
  • P.V操作必须为原子操作,对于单处理机,可用禁止中断实现, 对于多处理机,要用软件协助解决。
  • P.V操作必须成对出现。

e.g.计算机系统的打印机  图from:信号量机制_fFee-ops的博客-CSDN博客_信号量机制

2).记录型信号量

——为克服“忙等”,重新对信号量和P.V操定义

图from: 信号量机制_fFee-ops的博客-CSDN博客_信号量机制

注意:

    S.Value  >0  表示某类可用资源的数量

                  <0  其绝对值为因请求该资源而被阻塞的进程数

    S.Value的初值为1时,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量。

3)AND型信号量集机制

基本思想:

  • 将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放;(类似于数据库中的事务)
  • 对若干个临界资源的分配,采取原子操作方式要么全部分配到进程,要么一个也不分配;
  • 为此,在wait操作中,增加了一个“AND”条件,故称为AND同步;

定义如下:

 3)一般信号量集机制

每次只能获得或释放一个单位的临界资源太低效;

当资源数量低于某一下限值时,便不予分配;

基于以上两点对And信号进行扩充。

 特殊情况讨论:

(1)Swait(S,d,d)

    此时在信号量集中只有一个信号量,但它允许每次申请d个资源,当现有资源数少于d时,不予分配。

(2)Swait(S,1,1)

    此时的信号量集蜕化为一般的记录型信号量(S1)或互斥信号量(S = 1 )

(3)Swait(S,1,0)。    相当于一个可控开关

    这是一种很特殊且很有用的信号量,不分配资源。

    当S>=1时,允许多个进程进入某特定区;

    当S=0,将阻止任何进程进入特定区。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值