一、 需求分析
说明程序设计的任务和目的,明确规定下述内容:
掌握进程资源的分配、死锁的检测和安全序列的生成方法
(1) 输入的形式和输入值的范围;
输入给定进程的进程编号
已在程序中预置好进程信息
(2) 输出的形式;
安全序列
(3) 程序所能达到的功能;
用银行家算法模拟资源分配
(4) 测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
依次输入
进程1 请求资源 1 2 3
进程3 请求资源 1 0 0
进程2 请求资源 3 6 9
输出安全序列或提示不安全序列
二、 概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
intAvailable[MaxNumber]; //最初状态的可分配资源
intSAvailable[MaxNumber]; //时时状态的可分配资源
intMax[MaxNumber][MaxNumber]; //Max
intAllocation[MaxNumber][MaxNumber]; //Allocation
intNeed[MaxNumber][MaxNumber]; //Need
int Request[MaxNumber];//Request
intSafeOrder[MaxNumber]; //存放安全序列
boolFinished[MaxNumber]; //存放各进程是否完成
三、 详细设计
实现程序模块的具体算法。
bool bank(int* availabled, intn, intm)
四、 调试分析
调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析;
算法虽然在纸上很容易算出,但在编程时需要用二维数组进程操作,经过多次调试后终于成功运行
五、 用户使用说明
程序的使用说明,列出每一步的操作步骤。
运行程序--输入请求进程的编号--输入请求的资源--显示运行结果
六、 测试结果
列出测试结果,包括输入和输出。
七、 附录
带注释的源程序,注释应清楚具体;
#include "stdafx.h"
#include<iostream>
#include<string>
#include<sstream>
#include<fstream>
using namespace std;
const static int MaxNumber = 100;
int Available[MaxNumber]; //最初状态的可分配资源
int SAvailable[MaxNumber]; //时时状态的可分配资源
int Max[MaxNumber][MaxNumber]; //Max
int Allocation[MaxNumber][MaxNumber]; //Allocation
int Need[MaxNumber][MaxNumber]; //Need
int Request[MaxNumber]; //Request
int SafeOrder[MaxNumber]; //存放安全序列
bool Finished[MaxNumber]; //存放各进程是否完成
void print(int n, int m);
bool compare(int* a, int* b, int n);
bool bank(int* availabled, int n, int m);
static int jd; //帮助判断数据
int _tmain(int argc, _TCHAR* argv[])
{
cout << "----------预防进程死锁的银行家算法:\n";
int n, m, i, j, k; //n:进程; m:资源数i,j,k循环累加变量
//读文件
ifstream in("test.txt");
string s;
for (i = 0; i<4, getline(in, s); i++)
{
istringstream sin(s);
switch (i)
{
case 0: sin >> n >> m;
break;
case 1: for (j = 0; j<n; j++)
{
for (k = 0; k<m; k++)
sin >> Allocation[j][k];
}
break;
case 2: for (j = 0; j<n; j++)
{
for (k = 0; k<m; k++)
sin >> Need[j][k];
}
break;
case 3: for (j = 0; j<m; j++)
sin >> Available[j];
break;
}
}
//初始化Max值
for (i = 0; i<n; i++)
{
for (j = 0; j<m; j++)
{
Max[i][j] = Allocation[i][j] + Need[i][j];
}
}
print(n, m); //资源未请求时,输出各资源情况
//初始化SAvailable值
for (i = 0; i<m; i++)
SAvailable[i] = Available[i];
if (bank(SAvailable, n, m))
{
int number;
while (true)
{
cout << "请输入申请资源的进程号:";
cin >> number;
if (number<0)
break;
cout << "请输入请求的各资源数::";
for (int j = 0; j<m; j++)
{
//资源请求后,改变相应影响到的SAvailable、Need、Allocation值
cin >> Request[j];
Available[j] -= Request[j];
Need[number][j] -= Request[j];
Allocation[number][j] += Request[j];
}
//资源请求后,输出各资源情况
//SAllocation重新赋值
for (i = 0; i<m; i++)
SAvailable[i] = Available[i];
cout << "正在处理..." << endl;
bank(SAvailable, n, m); //n:进程; m:资源数
if (jd == 0)
{
for (int j = 0; j<m; j++)
{
//资源请求后,改变相应影响到的SAvailable、Need、Allocation值
Available[j] += Request[j];
Need[number][j] += Request[j];
Allocation[number][j] += Request[j];
}
}
}
}
}
bool bank(int* availabled, int n, int m)
{ //数组available存放可分配资源
int L = 0, i; //L为已完成的进程数量
for (i = 0; i<n; i++)
Finished[i] = false; //初始化全部进程都未完成
for (i = 0; i<n; i++)
{
for (int j = 0; j < n; j++)
{
if (Finished[j] == false && compare(availabled, Need[j], m))
{ //进程未完成且可分配资源满足该进程需求
for (int k = 0; k<m; k++)
availabled[k] += Allocation[j][k];
Finished[j] = true;
SafeOrder[L] = j;
L++;
break;
}
}
}
if (L == n)
{
jd = 1;
cout << "安全序列:";
for (int s = 0; s<n; s++) //输出安全序列
cout << "P" << SafeOrder[s] << " ";
cout << endl;
return true;
}
else
{
jd = 0;
cout << "不安全序列!" << endl;
return false;
}
}
bool compare(int* a, int* b, int n)
{ //比较数组a和数组b中的各个元素的大小,
//a都大于b,则输出true;如果a中有一个小于b,立即输出false
for (int i = 0; i<n; i++)
if (a[i]<b[i])
{
return false;
}
return true;
}
void print(int n, int m)
{ //打印各类值
int i, j;
cout << " " << "Max" << " " << "Allocation" << " " << "Need" << " " << "Available" << endl;
for (i = 0; i<n; i++)
{
cout << " " << "P" << i << " ";
for (j = 0; j<m; j++)
{
cout << Max[i][j] << " ";
}
cout << " ";
for (j = 0; j<m; j++)
{
cout << Allocation[i][j] << " ";
}
cout << " ";
for (j = 0; j<m; j++)
{
cout << Need[i][j] << " ";
}
if (i == 0)
{
cout << " ";
for (j = 0; j<m; j++)
cout << Available[j] << " ";
}
cout << endl;
}
}