操作系统-进程互斥

信号量实现进程互斥

信号量代表系统中的某种资源数量。
信号量的初始值是资源数量。
申请资源时,信号量减1;当信号量小<0,阻塞当前要申请资源的进程。
使用完,毕释放资源时,信号量加1。唤醒阻塞队列里的进程。
wait对应下面的P操作, signal对应下面的V操作
在这里插入图片描述

生产者消费者问题

需要一个表示空闲缓冲区和一个产品数量的信号量实现同步操作。
同时需要一个互斥信号量(一般为1)使得同一时刻只有一个进程能够访问缓冲区。
注意: 互斥信号量在同信号量P操作(加锁)之后,不能颠倒顺序,否则可能会死锁。
在这里插入图片描述

死锁

各个进程互相等待对方手里的资源,导致各进程互相阻塞,无法向前推进。
死锁的4个条件:

  • 互斥条件:互斥的使用资源(不能多各进程共享)
  • 不剥夺条件:进程所获得的资源在使用完释放之前,不能由其他进程剥夺,只能等待执行完后主动释放。
  • 请求和保持条件:进程至少持有一个资源,又提出了新的资源请求。该资源又被其他进程占有,此时请求被阻塞,但又对自己的资源保持不放。
  • 循环等待条件:存在一种进程资源的循环等待链,链中进程持有的资源被下一个进程请求。

死锁产生的时机

  • 各进程对不可剥夺的资源的进程,可能产生死锁。可剥夺的资源不会产生死锁
  • 进程推进顺序非法,请求和释放的资源顺序不当,也会产生死锁
  • 信号量的使用不当,会产生死锁(参考生产者消费者)

破坏死锁

死锁的4个必要条件只要破坏其中一个就会破坏死锁,使进程推进下去。
1.1 破坏互斥条件:
把互斥资源改造成允许共享的资源(SPOOLing技术)

1.2 破坏不剥夺条件:
方案一:当某个进程请求不到资源时,必须释放自己持有的资源。
方案二:当某个进程需要的资源被其他进程占有,由操作系统协助吧想要的资源强行剥夺。(优先级进程)

1.3 破坏请求和保持条件:
在进程运行钱,一次请求所有的资源。一旦投入运行,这些资源都归他所有,不会再请求别的任何资源。
缺点:对使用频率不高的资源造成浪费,可能会导致饥饿

1.4 破坏循环等待条件:
给资源编号,规定每个进程按照递增的顺序请求资源。

避免死锁(银行家算法)

安全序列:
如果系统按照某种序列给进程分配资源,每个进程都能够顺利完成,则这个序列是安全的。一个系统中的安全序列可能不止一个。
如果分配了资源之后,系统找不到一个安全序列,则系统进入了不安全状态,这意味着之后可能所有的进程都无法顺利进行下去。

如果系统处于安全状态,则不会发生死锁。否则有可能发生死锁。

银行家算法的核心思想:
在资源分配之前预先判断这次分配是否睡导致系统进入不安全状态,如果是,则不予分配。

检测死锁

系统允许死锁发生,并检测是否发生死锁,破坏死锁。

我们可以用有向图来检测是否发生死锁,如果最终所有的边都可以消除(释放资源),则任务没有发生死锁,否则发生了死锁。

如下图(蓝色线表示请求资源,绿色线表示持有资源):
P1进程请求2个R2资源,而R2资源已经给P2分配了一个资源,剩余一个资源不足以满足P1,所以P1阻塞。
P2请求1个R1资源,而R1资源被P1持有2个被P2持有1个,剩余0个。不满足P2的请求,所以P2阻塞。
由于无法消除绿色持有边,则该系统有死锁发生。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值