原题:实验四 文件系统-代码阅读并调试实验
1.阅读下面源代码,写出程序功能。
2.阅读代码,分析代码中算法并说明。
3.调试并运行代码,写出结果。
答题内容略,本文仅逐段解析实验代码,以及在文章最后附上算法流程图。
头文件和自定义变量,特别强调,本程序只支持资源种类数为3种以下的情况。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int Available[10]; //可使用资源向量 int Max[10][10]; //最大需求矩阵 int Allocation[10][10] = { 0 }; //分配矩阵 int Need[10][10] = { 0 }; //需求矩阵 int Work[10]; //工作向量 int Finish[10]; //是否有足够的资源分配,状态标志 int Request[10][10]; //进程申请资源向量 int Pause[10]; int arr[4] = { 0 }; //各类资源总数 int List[10]; int i, j; int n; //系统资源总数 int m; //总的进程数 int a; //当前申请的进程号 int l, e; //计数器 int b = 0, c = 0, f = 0, g; //计数器 int z = 0;给系统进行安全性检测的函数,因为程序只支持系统资源种数不大于3的情况,所以打印安全序列表头时只考虑资源种数分别为1、2、3的情况。
int securitycheck() //安全性检测 { printf("\n\n");//开始打印表头(安全序列表) printf("\t\t\t※ 安全性检测 ※\n\n"); if (n == 3) { printf(" 工作向量 尚需求量 已分配 工作向量+已分配\n进程 "); for (c = 1; c <= 4; c++) { for (j = 1; j <= n; j++) { printf(" %d类", j); } } } if (n == 2) { printf(" 工作向量 尚需求量 已分配 工作向量+已分配\n进程 "); for (c = 1; c <= 4; c++) { for (j = 1; j <= n; j++) { printf(" %d类", j); } } } if (n == 1) { printf(" 工作向量 尚需求量 已分配 工作向量+已分配\n进程 "); for (c = 1; c <= 4; c++) { printf(" %d类\t", 1); } }//打印表头结束 for (i = 1; i <= m; i++) { Pause[i] = Available[i];/*Pause[i]只是一个暂时寄存的中间变量, *为防止在下面安全性检查时, *修改到Available[i]而代替的一维数组*/ Finish[i] = false; //初始化使所有进程都处于未被满足资源状态 } /*考虑极端情况,每次循环都只能给一个进程分配资源, *所以使用两层范围1-m的循环才能确保遍历完进程,寻找到安全序列*/ for (g = 1; g <= m; g++) { for (i = 1; i <= m; i++) { b = 0; //计数器初始化,统计能满足进程P[i]需求的资源种数 for (j = 1; j <= n; j++) { if (Need[i][j] <= Pause[j])//可以满足进程j类资源需求 { b = b + 1; } if (Finish[i] == false && b == n)//进程没被分配过且资源可满足进程所有需求 { Finish[i] = true;//进程被分配资源了 printf("\nP[%d] ", i); //依次输出进程安全序列 for (l = 1; l <= n; l++)//系统资源可利用量,即work { printf(" %2d ", Pause[l]); } for (j = 1; j <= n; j++)//进程的需求量 { printf(" %2d ", Need[i][j]); } for (j = 1; j <= n; j++)//进程以获得的资源数 { printf(" %2d ", Allocation[i][j]); } for (j = 1; j <= n; j++)//进程归还资源后的系统资源剩余量 { printf(" %2d ", Pause[j] + Allocation[i][j]); } for (l = 1; l <= n; l++)//进程归还资源,更新数据 { Pause[l] = Pause[l] + Allocation[i][l]; } } } } } printf("\n\n"); for (i = 1; i <= m; i++) { if (Finish[i] == true) f = f + 1; //统计Finish[i]==true的个数 } if (f == m)//系统安全 { printf("safe state"); printf("\n\n系统剩余资源量: "); for (i = 1; i <= n; i++) { printf(" %d ", Available[i]); } f = 0; //将计数器f重新初始化,为下一次提出新的进程申请做准备 return 1; } else//系统不安全 { printf("unsafe state "); for (i = 1; i <= n; i++)//恢复系统各种资源的数据 { Available[i] = Available[i] + Request[a][i]; Allocation[a][i] = Allocation[a][i] - Request[a][i]; Need[a][i] = Need[a][i] + Request[a][i]; } return 0; } }初始化系统资源和进程信息
void initialize() //初始化 { printf("请输入系统的资源种类数:"); scanf("%d", &n); for (i = 1; i <= n; i++) { printf("第%d类资源总数:", i); scanf("%d", &arr[i]); } printf("请输入进程总数:"); scanf("%d", &m); for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) { printf("进程P[%d]对第%d类资源的最大需求量:", i, j); scanf("%d", &Max[i][j]); } printf("\n"); } for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) { printf("进程P[%d]对第%d类资源已分配数:", i, j); scanf("%d", &Allocation[i][j]); Need[i][j] = Max[i][j] - Allocation[i][j]; } printf("\n"); } for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) { arr[i] -= Allocation[j][i]; } } for (i = 1; i <= n; i++) Available[i] = arr[i]; securitycheck(); }进行进程资源申请的函数
void mainrequest() //进程申请资源 { printf("请输入申请资源的进程:"); scanf("%d", &a); for (i = 1; i <= n; i++) { printf("请输入进程P[%d]对%d类资源的申请量:", a, i); scanf("%d", &Request[a][i]); if (Request[a][i] > Need[a][i]) { printf("\n出错!进程申请的资源数多于它自己申报的最大需求量\n"); return; } if (Request[a][i] > Available[i]) { printf("\nP[%d]请求的资源数大于可用资源数,必须等待\n", a); return; } } for (i = 1; i <= n; i++) { //以下是试探性分配 Available[i] = Available[i] - Request[a][i]; Allocation[a][i] = Allocation[a][i] + Request[a][i]; Need[a][i] = Need[a][i] - Request[a][i]; } int ret = securitycheck(); if (ret == 1)//系统安全 { int key = 0; for (j = 1; j <= n; j++) { if (Need[a][j] == 0) { key++; } } if (key == n)//进程资源需求都被满足 { for (j = 1; j <= n; j++)//归还资源 { Available[j] += Allocation[a][j]; Allocation[a][j] = 0; } } } }显示系统资源分配情况
void mainshow() //显示系统资源分配情况 { printf("\n\n"); if (n == 3) { printf(" 已分配 最大需求量 尚需要量 \n进程"); } if (n == 2) { printf(" 已分配 最大需求 尚需要量 \n进程"); } for (i = 1; i <= 3; i++) { for (j = 1; j <= n; j++) { printf(" %d类", j); } } for (i = 1; i <= m; i++) { printf("\nP[%d]", i); for (j = 1; j <= n; j++) { printf(" %2d ", Allocation[i][j]); } for (j = 1; j <= n; j++) { printf(" %2d ", Max[i][j]); } for (j = 1; j <= n; j++) { printf(" %2d ", Need[i][j]); } } printf("\n\n系统剩余资源量: "); for (i = 1; i <= n; i++) { printf(" %d ", Available[i]); } printf("\n"); }提供功能菜单
void menu() //显示功能菜单 { printf("\n\n\t\t卐卍※§ 银行家算法 §※卐卍\n"); printf("\n\n\t\t\t1:初始化"); printf("\n \t\t\t2:进程进行资源申请"); printf("\n \t\t\t3:资源分配状态"); printf("\n \t\t\t4:退出程序"); printf("\n\n\t\t\t\t\t 请输入你的选择: "); }主函数
int main() { int key = 0; printf("\n\n"); while (1) { menu(); scanf("%d", &key); printf("\n\n"); switch (key) { case 1: initialize(); break; case 2: mainrequest(); break; case 3: mainshow(); break; case 4: printf("\n\n\t\t\t谢谢使用 \n"); printf("\n\t\t\tSee you next time !\n\n\n"); system("pause"); return 0; } } system("pause"); return 0; }程序流程图:
总流程图
系统安全性检测流程
初始化流程
处理进程资源申请流程