银行家算法-安全性检查算法(C语言实现)
目录
1.题目要求
编辑2.安全性检查算法描述
初始化:
查找可执行进程:
执行进程并更新状态:
判断系统安全性:
3.代码实现
4.运行结果
1.题目要求
2.安全性检查算法描述
初始化:
- 设置两个向量:工作向量Work和布尔向量Finish。
- Work表示系统可提供给进程继续运行所需的各类资源数目,初始化为当前可用资源数量Available。
- Finish表示系统是否有足够的资源分配给进程,使之运行完成,初始化为false。
查找可执行进程:
- 从进程集合中找到一个满足以下条件的进程:Finish[i]=false且Need[i]<=Work。
- 如果找到这样的进程,则执行步骤3;否则,执行步骤4。
执行进程并更新状态:
- 假设进程Pi获得资源后可顺利执行,直至完成,并释放出分配给它的资源。
- 更新Work向量:Work+=Allocation[i]。
- 将Finish[i]设置为true,表示进程Pi已完成。
- 返回步骤2,继续查找下一个可执行进程。
判断系统安全性:
- 如果所有进程的Finish[i]都为true,则表示系统处于安全状态;否则,系统处于不安全状态。
3.代码实现
#include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> #define SOURNUM 3 #define MAX 5 char* safeList[5]; typedef struct PCB { char name[2]; //进程名 int max[SOURNUM]; //所需最大资源数 int allocation[SOURNUM]; //已分配资源数 int need[SOURNUM]; //当前所需资源数 int finish; //完成状态 }pcb; pcb pro[MAX] = { {"P0",{7, 5, 3}, {0, 1 ,0},{7, 4 ,3},-1}, {"P1",{3 ,2, 2}, {2, 0, 0},{1, 2 ,2},-1}, {"P2",{9, 0, 2}, {3, 0 ,2},{6, 0 ,0},-1}, {"P3",{2 ,2, 2}, {2, 1 ,1},{0, 1, 1},-1}, {"P4",{4 ,3 ,3}, {0 ,0, 2},{4, 3, 1},-1} }; int checkSafe(pcb pro[], int *available, int proNumber, int sourNumber) { int i, j, numsour = 0; int safeListnum = 0; while (safeListnum < proNumber) { int flag = -1;//判断这一轮有没有至少找到一个 for (i = 0; i < proNumber; i++) { numsour = 0; if (pro[i].finish == -1) { for (j = 0; j < sourNumber; j++) { if (pro[i].need[j] <= available[j]) numsour++; } if (numsour == sourNumber) { for (j = 0; j < sourNumber; j++) { available[j] += pro[i].allocation[j];//释放资源 } pro[i].finish = 1; flag = 1; safeList[safeListnum++] = pro[i].name;//加入到安全序列 if (safeListnum == proNumber)//已经找到了一个安全序列 return 1; } } } if (flag == -1)//这轮一个都没有找到 return -1; } } int main() { int proNumber = MAX, sourNumber = SOURNUM; int available[SOURNUM] = { 3,3,2 }; int flag = checkSafe(pro, available, proNumber, sourNumber); if (flag == 1) { printf("找到了一个安全序列:"); for (int i = 0; i < proNumber; i++) { if (i != proNumber-1) printf("%s->", safeList[i]); else printf("%s", safeList[i]); } printf(",T0时刻系统是处于安全状态。\n"); } else printf("找不到安全序列,T0时刻系统处于不安全状态。"); return 0; }