进程互斥的软件实现方法
单标志法
有一个需要注意的点就是,注意上图中的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进程的做法一样:
剩余资源数进行一个更新:
然后以此类推即可:
这是理论推导,而在考试做题中用笔算会由更快的解法:
然后更新剩余可用资源数:
这样的方法可以更快的找到安全序列。
接下来还有找不安全序列的例子:
用代码实现银行家算法:
修改完数据之后:
回顾
死锁的处理策略—检测和解除
总览
死锁的检测