7-3 模拟银行家算法(操作系统) (60 分)

请你编写一个实现银行家算法的程序,输入进程需要的最大资源需求,进程已经拥有的系统资源和还预留的系统资源,再输入T0时刻Pi申请的系统资源数,请用银行家算法进行安全性检查,如果系统安全,则输出进程运行的安全序列,如果系统不安全,输入unsafe。 要求:按资源需求量最小优先的原则选取进程的运行顺序。

输入格式:

输入信息: 2 5 // 资源数 进程数 2 4 // 进程需要最大资源数 10 2 5 4 3 1 4 2 2 0 // 进程已拥有的资源数 3 2 1 4 2 1 0 0 2 7 // 系统预留的资源数 0 0 4 // 进程编号 申请数 0进程申请(0,4)

输出格式:

输出信息: 如果存在安全序列输出: safe P00 P03 P02 P04 P01 如果不存在安全序列输出: unsafe

输入样例:

在这里给出一组输入。例如:

2 5
2 4 
10 2
5 4
3 1
4 2
2 0
3 2
1 4
2 1
0 0
2 7
0 0 4

输出样例:

在这里给出相应的输出。例如:

safe
P00 
P03 
P02 
P04 
P01

参考GPT和自己的思路:

首先需要明确几个概念:

  1. 最大需求矩阵 Max[ProcessNum, ResourceNum] 表示每个进程对每种资源的最大需求,即进程需要的最大资源需求。
  2. 已分配矩阵 Allocation[ProcessNum, ResourceNum] 表示每个进程已经获得的各种资源数目。
  3. 需求矩阵 Need[ProcessNum, ResourceNum] 表示每个进程还需要的各种资源数目。
  4. 可利用资源矩阵 Available[ResourceNum] 表示系统现在可用的各种资源数目。

安全检查:

安全状态定义:若存在一个安全序列(即进程运行的顺序),使得进程按顺序顺利执行完毕并释放所有资源,不会发生死锁,那么系统处于安全状态(Safe)。

安全检查的主要思路是模拟进程的执行过程,找到一个满足安全状态定义的安全序列。

主要步骤:

  1. 初始时,将所有进程的 Need 矩阵和 Allocation 矩阵相减,得到 Need 矩阵。
  2. 检查系统中是否存在一个进程,其 Need 矩阵每个元素均小于等于 Available 矩阵每个元素,如果找到这样的进程,则加入安全序列,将该进程所占用的资源释放,加入 Available 矩阵中。
  3. 重复上述过程,直到找不到这样的进程为止。如果找到了安全序列,则系统安全,输出安全序列;否则系统不安全,输出 unsafe。

按资源需求量最小优先的原则选取进程的运行顺序,即在 2 中每次选择 Need 矩阵需求量最小的那个进程进行操作。

具体实现可以参考以下代码: