操作系统学习:进程管理(续)

进程互斥的软件实现方法

在这里插入图片描述

单标志法

在这里插入图片描述
有一个需要注意的点就是,注意上图中的while是一个死循环,因为while括号后面是一个分号。
但是单标志法也有问题:
在这里插入图片描述

双标志先检查法

在这里插入图片描述

双标志后检查法

在这里插入图片描述

Peterson算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

回顾

在这里插入图片描述

进程互斥的硬件实现方法

总览

在这里插入图片描述

中断屏蔽方法

在这里插入图片描述

TestAndSet指令

在这里插入图片描述

Swap指令

在这里插入图片描述

回顾

在这里插入图片描述

信号量机制(记录型信号量重点)

总览

在这里插入图片描述

信号量机制

在这里插入图片描述

信号量机制—整型信号量

在这里插入图片描述

信号量机制—记录型信号量

在这里插入图片描述
以下面的例子进行解释(注意结合上面图中的wait和signal原语代码部分进行分析):
在这里插入图片描述
现在假设CPU为P0进程服务,则会调用wait原语,先对value进行-1,然后系统判断此时是有打印机资源的,于是分配一台打印机给P0:
在这里插入图片描述

然后假设CPU切换到了P1进程,同样的,执行wait原语,进行value-1,系统分配一台打印机资源给P0进程,此时value为0了,因为两台打印机都分配完了:
在这里插入图片描述
然后CPU又到了P2进程,执行wait原语,value-1导致value的值现在为-1,结合代码可以知道,当value小于0时,说明此时系统内没有剩余的资源可以给P2了,所以P2进程会被block原语所阻塞,并被挂到等待队列L当中:
在这里插入图片描述
接下来CPU又为P3进程服务,同理如下:
在这里插入图片描述
假设现在CPU又到了为P0服务,P0在使用完打印机之后,执行signal原语,结合代码可以知道,在signal原语中首先会对value+1,所以value由原来的-2变为-1,因为现在-1依然小于等于0,就意味着在等待队列当中依然还有进程正在等待使用这个资源,所以P0进程会在signal原语当中进行一个wakeup原语的操作来唤醒等待队列当中位于队头的进程,并将打印机资源分配给它:
在这里插入图片描述
下面的分析都是依葫芦画瓢,不再赘述。
总结一下记录型信号量:
在这里插入图片描述

回顾

在这里插入图片描述

用信号量机制实现进程互斥、同步和前驱关系

信号量机制实现进程互斥

在这里插入图片描述

信号量机制实现进程同步

什么是进程同步?
在这里插入图片描述
在这里插入图片描述

信号量机制实现前驱关系

在这里插入图片描述

回顾

在这里插入图片描述

生产者消费者问题

问题描述:
在这里插入图片描述
上图中假设缓冲区的大小为5。
依照题目的意思,现在缓冲区是空的,所以生产者可以把产品放入缓冲区中:
在这里插入图片描述
如上图中显示,此时缓冲区已经满了,所以生产者无法再往里面冲入产品:
在这里插入图片描述
同样,只有缓冲区不为空时,消费者才能从中取出产品,否则必须等待。
在这里插入图片描述
在这里插入图片描述
根据上述分析,我们设置信号量如下:
在这里插入图片描述

如何实现

在这里插入图片描述
在这里插入图片描述
最好是不要将不相关的代码放到临界区代码之中(即PV操作之间),因为这会降低进程的并发度。

回顾

在这里插入图片描述

多生产者-多消费者问题

问题描述

在这里插入图片描述

问题分析

在这里插入图片描述

代码实现

在这里插入图片描述
思考下面的问题:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
总结一下:
在这里插入图片描述
在这里插入图片描述

吸烟者问题

问题描述

在这里插入图片描述

问题分析

在这里插入图片描述
在这里插入图片描述

代码实现

在这里插入图片描述
总结一下:
在这里插入图片描述

读者-写者问题

问题描述

在这里插入图片描述

问题分析

在这里插入图片描述

代码实现

在这里插入图片描述
但是上面的代码会有以下问题:
在这里插入图片描述
解决办法如下:
在这里插入图片描述
所以最后的完整版代码如下:
在这里插入图片描述
但是这样的解决方式也有弊端:
在这里插入图片描述
解决的方法同之前的一样,再加一个互斥信号量即可:
在这里插入图片描述
总结一下:
在这里插入图片描述

哲学家进餐问题

问题描述

在这里插入图片描述

问题分析

错误方式如下:
在这里插入图片描述
在这里插入图片描述

代码实现

在这里插入图片描述
在这里插入图片描述
总结一下:
在这里插入图片描述

管程

总览

在这里插入图片描述

为什么要引入管程

在这里插入图片描述

管程的定义和基本特征

在这里插入图片描述

用管程解决生产者消费者问题

在这里插入图片描述
总结一下:

在这里插入图片描述
Java语言当中也有类似于这样的管程机制:
在这里插入图片描述

回顾

在这里插入图片描述

死锁

总览

在这里插入图片描述

什么是死锁

在这里插入图片描述
在这里插入图片描述

死锁、饥饿、死循环的区别

在这里插入图片描述

死锁产生的必要条件

在这里插入图片描述

什么时候会发生死锁

在这里插入图片描述

死锁的处理策略

在这里插入图片描述

回顾

在这里插入图片描述

死锁的处理—预防死锁

总览

在这里插入图片描述

破坏互斥条件

在这里插入图片描述

破坏不剥夺条件

在这里插入图片描述

破坏请求和保持条件

在这里插入图片描述

破坏循环等待条件

在这里插入图片描述

回顾

在这里插入图片描述

死锁的处理策略—避免死锁(非常重要)

总览

在这里插入图片描述

什么是安全序列

在这里插入图片描述
所以分析结果得知,给B借30亿是不安全的。
在这里插入图片描述
在这里插入图片描述
所以由上面两张图可以知道,按照T->B->A,A->T->B的顺序给他们借钱是可行的。

安全序列、不安全状态、死锁的关系

在这里插入图片描述
在这里插入图片描述

银行家算法

在这里插入图片描述
以该问题为例进行银行家算法的分析:
在这里插入图片描述
我们会将剩余的可用资源与每一个进程进行比对,如上图是对P0进行匹配,发现是无法满足P0进程所需要的资源数的。
在这里插入图片描述
上图中,与P1进程进行比对时,发现是可以满足P1进程的资源需要的,所以我们如果把资源分配给P1资源的话,等P1进程任务结束后就会归还资源,所以剩余可用资源数就可以增加到(5,3,2),因为P1进程是安全的,所以我们将其加入安全序列。
接下来我们进行第二轮的对比:
在这里插入图片描述

和P0对比,发现无法满足,于是继续往下:在这里插入图片描述

P1进程因为已经确认是安全的,且运行完毕了,所以不再考虑P1。与P2进程比睿,发现也无法满足:
在这里插入图片描述
与P3比对,发现是可以满足其资源需求的,于是分配给它,和P1进程的做法一样:
在这里插入图片描述
剩余资源数进行一个更新:
在这里插入图片描述
然后以此类推即可:
在这里插入图片描述
这是理论推导,而在考试做题中用笔算会由更快的解法:
在这里插入图片描述
然后更新剩余可用资源数:
在这里插入图片描述
这样的方法可以更快的找到安全序列。

接下来还有找不安全序列的例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用代码实现银行家算法:
在这里插入图片描述
修改完数据之后:
在这里插入图片描述

回顾

在这里插入图片描述

死锁的处理策略—检测和解除

总览

在这里插入图片描述

死锁的检测

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

死锁的接触

在这里插入图片描述

回顾

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

在地球迷路的怪兽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值