开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天
一、本篇笔记重点内容:
- 算法介绍
- 问题分析和功能流程定义
- 设计思路
二、 详细知识点介绍:
算法介绍
死锁会引起计算机工作僵死,造成整个系统瘫痪。因此,死锁现象是操作系统尤其是大型系统中必须设法防止的。操作系统在解决死锁问题的时候,有四个大的方向,分别是预防死锁,避免死锁,检测死锁和解除死锁。银行家算法是一种最具有代表性的避免死锁算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。
问题分析和功能流程定义
问题分析:
设计程序模拟避免进程死锁的银行家算法的工作过程。假设有系统中有n个进程P1, … ,Pn,进程共享m类可分配的系统资源R1, … ,Rm,进程可动态的申请和释放资源,系统按各进程的申请动态的分配资源。
在T0时刻,进程Pi分配到的j类资源为Allocation[i][j]个,它还需要j类资源Need[i][j]个,系统目前剩余j类资源Work[j]个,现采用银行家算法进行资源分配避免死锁的发生。
核心功能:
1)状态安全性检查:根据安全性算法判断当前T0时刻系统状态是否安全,如果安全,打印出安全序列。
2)利用银行家算法进行资源分配避免死锁:对于某一个时刻T1,某进程Pk会提出请求Request(R1, … ,Rm),判断是否可以分配给Pk进程请求的资源。具体流程是:首先根据该进程需求矩阵和当前系统可用资源数量来判断该进程申请的资源数是否合理,若合理,则系统进行试分配,分配成功后进行状态安全性检查,若存在安全序列使得系统处于安全状态,则此次资源分配成功,同意该进程申请。若试分配后系统不存在安全状态,则表明程序可能会进入死锁状态,撤销此次分配。
程序执行流程:
l 系统初始化。
l 读入文本文件中所需的数据。
l 进行功能选择:状态安全性检查或使用银行家算法进行资源分配。进入具体功能模块中运行。
l 用户使用完毕,退出系统。
设计思路
运行程序时用户设定系统中进程数目和可利用资源的种类数目。读入文本文件中最大需求矩阵MAX,已分配资源矩阵Allocation ,并根据其计算出需求资源矩阵Need、进程当前可利用资源矩阵Available。根据安全性算法判断当前T0时刻系统状态是否安全。某时刻进程请求资源Request,利用系统中银行家算法试分配资源以及安全性算法判断能否产生一个安全性队列,若能,则给该进程分配成功,否则,不予分配。系统能显示各个进程申请和释放资源,以及系统动态分配资源的过程,便于用户观察和分析。
主要数据结构:
l 可利用资源向量Available:是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K个。
l 最大需求矩阵Max:这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
l 分配矩阵Allocation:这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
l 需求矩阵Need。:这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
l 其中:Need[i,j]=Max[i,j]-Allocation[i,j]
安全性算法流程:安全性算法是银行家算法执行中的子算法,用于检查进程的安全状态。银行家算法是计算某一个进程对资源的需求问题,安全性算法是计算所有的进程在各自的银行家算法执行下,是否处于安全状态。
银行家算法流程:
l 假设 Pi 进程提出请求各类资源。
l 如果各资源请求数量 <= Need,就继续步骤;否则出错,因为请求资源不能超过还需要获得的资源。
l 如果各资源请求数量 <= Available,就继续步骤;否则出错,因为请求资源不能超过系统此时还可以分配的资源 Available
l 系统试探分配资源,并修改下列数据:
(1) Available = Available - 各资源请求数量;表示分配给 Pi请求资源后,还剩多少系统可分配资源
(2) Allocation = Allocation + 各资源请求数量;表示 Pi 已经获得的资源
(3) Need = Need - 各资源请求数量;表示进程 Pi 还需要获得的资源
此时执行安全性算法,计算系统继续运行是否存在一个安全序列使得系统处于安全性状态,安全状态就是系统能按照某种进程推进顺序(安全序列)进行。