【操作系统】进程互斥、同步与死锁

互斥与同步 

  • 同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。
  • 互斥亦称间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。

为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:

  • 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
  • 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待
  • 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
  • 让权等待当进程不能进入临界区时,应立即释放处理机,防止进程忙等待



信号量机制





信号量机制的应用

  • 一个信号量对应一种资源
  • 信号量的值 = 这种资源的剩余数量(信号量的值如果小于0,说明此时有进程在等待这种资源)
  • P(S):申请一个资源s,如果资源不够就阻塞等待
  • V(S):释放一个资源s,如果有进程在等待该资源,则唤醒一个进程

🍒实现进程互斥

  • 不同的临界资源需要设置不同的互斥信号量
  • P、V操作必须成对出现。缺少 P(mutex) 就不能保证临界资源的互斥访问。缺少 V(mutex) 会导致资源永不被释放,等待进程永不被唤醒。
  • 互斥问题,信号量初值为1
  • 当 mutex = 1 时执行 P 操作不会出现进程阻塞现象,但是 P 操作执行完后 mutex = 0
  • 当 mutex = 0 时执行 P 操作会出现进程阻塞现象,只有访问临界区的进程执行 V 操作后 mutex = 1 ,阻塞才会解除

🍒实现进程同步

  • 同步问题,信号量初值一般设置为0
  • 先执行的代码块后需要再执行一个 V 操作 ,即可以认为是对同步信号量的加一操作,表示后执行的操作可以执行了;
  • 后执行的代码块前需要再执行一个 P 操作 ,即可以认为是通过判断同步信号量的值以确定自己是否可以执行;

具体问题

1. 生产者与消费者问题:

2. 多生产者与多消费者问题:

  • 在生产者-消费者问题中,如果缓冲区大小为1,那么有可能不需要设置互斥信号量就可以实现互斥访问缓冲区的功能。当然,这不是绝对的,要具体问题具体分析。
  • 在考试中如果来不及仔细分析,可以加上互斥信号量,保证各进程一定会互斥地访问缓冲区。但需要注意的是,实现互斥的P操作一定要在实现同步的P操作之后,否则可能引起“死锁”。
     

3. 吸烟者问题:

  • 可以为我们解决“可以生产多个产品的单生产者”问题提供一个思路。
  • “轮流让各个吸烟者吸烟”必然需要“轮流的在桌上放上组合一、二、三”,可以用一个整型变量 i 实现这个“轮流”过程的。
  • 若一个生产者要生产多种产品(或者说会引发多种前驱事件),那么各个V操作应该放在各自对应的“事件”发生之后的位置。

4. 读者-写者问题:

  • 核心思想在于设置了一个计数器 count 用来记录当前正在访问共享文件的读进程数,我们可以用count的值来判断当前进入的进程是否是第一个/最后一个读进程,从而做出不同的处理。
  • 另外,对count 变量的检查和赋值不能一气呵成导致了一些错误,如果需要实现“一气呵成”,自然应该想到用互斥信号量
  • 最后,还要认真体会是如何解决“写进程饥饿”问题的。

5. 哲学家进餐问题:

  • 哲学家进餐问题的关键在于解决进程死锁
  • 这些进程之间只存在互斥关系,但是与之前接触到的互斥关系不同的是,每个进程都需要同时持有两个临界资源,因此就有“死锁”问题的隐患。
  • 如果遇到了一个进程需要同时持有多个临界资源的情况,应该参考哲学家问题的思想,分析题中给出的进程之间是否会发生循环等待,是否会发生死锁。

管程

管程是一种特殊的软件模块,有这些部分组成:

  1. 局部于管程的共享数据结构说明
  2. 对该数据结构进行操作的一组过程(过程其实是某个函数
  3. 对局部于管程的共享数据设置初始值的语句
  4. 管程有一个名字
  5. 局部于管程的数据只能被局部于管程的过程所访问;
  6. 一个进程只有通过调用管程内的过程才能进入管程访问共享数据;
  7. 每次仅允许一个进程在管程内执行某个内部过程。



死锁

  • 死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。
  • 饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。
  • 死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑 bug 导致的,有时是程序员故意设计的。

产生死锁的必要条件 

  1. 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待 这种资源)。
  2. 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
  3. 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
  4. 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。

发生死锁时一定有循环等待,但是发生循环等待时未必死锁
如果同类资源数大于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有一个,那循环等待就是死锁的充分必要条件了。
 


🎯银行家算法

安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。


死锁的检测与接触


依次消除与不阻塞进程相连的边,直到无边可消,所谓不阻塞进程是指其申请的资源数还足够的进程

解除死锁

  1. 资源剥夺法
  2. 撤销进程法(终止进程法)
  3. 进程回退法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉淀体育生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值