?? yinghangjia.cpp
字號(hào):
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<windows.h>
#define MAX_PROCESS 32 //最大進(jìn)程數(shù)
#define MAX_COURCE 64 //最大資源類別
int MAX_FACT_PROCESS; //實(shí)際總進(jìn)程數(shù)
int MAX_FACT_COURCE; //實(shí)際資源類別數(shù)
int Available[MAX_COURCE]; //可利用資源向量
int Max[MAX_PROCESS][MAX_COURCE]; //最大需求矩陣
int Allocation[MAX_PROCESS][MAX_COURCE]; //分配矩陣
int Need[MAX_PROCESS][MAX_COURCE]; //需求矩陣
int Request_PROCESS; //發(fā)出請(qǐng)求的進(jìn)程
//int Request_COURCE; //被請(qǐng)求資源類別
int Request_COURCE_NEMBER; //請(qǐng)求資源數(shù)
int *require,*s,k;
void clear();
void Read_Initiate(void);
void Write_Initiate(void);
void Allocated_list(void);
void Set_Need(void);
void Write_Allocation(void);
void Allocate_Source(void);
void set_require();
void Test_Safty();
void RUN(void);
struct COMP{
int value;
int num;
int next;
};
int flag=0;
void clear(){
for(int i=0;i<MAX_PROCESS;i++)
for(int j=0;j<MAX_COURCE;j++){
Allocation[i][j]=' ';
Max[i][j]=' ';
Need[i][j]=' ';
}
for(i=0;i<MAX_COURCE;i++)
Available[i]=' ';
}
void Read_Initiate(void){ //讀入初始化文檔
ifstream infile("Initiate.txt");
if(!infile){
cout<<"不能打開輸入文件:"<<"Initiate.txt"<<'\n';
exit(1);
}
cout<<"開始讀入初始化文檔"<<'\n';
int ch;
int Array[MAX_PROCESS*MAX_COURCE*2];
int num=0;
for(int i=0;i<MAX_PROCESS*MAX_COURCE*2;i++)
Array[i]=' ';
while(infile>>ch)
Array[num++]=ch;
num=0;
MAX_FACT_PROCESS=Array[num++];
MAX_FACT_COURCE=Array[num++];
for(int j=0;j<MAX_FACT_COURCE;j++)
Available[j]=Array[num++];
for( i=0;i<MAX_FACT_PROCESS;i++){
for(int j=0;j<MAX_FACT_COURCE;j++)
Max[i][j]=Array[num++];
}
infile.close();
}
void Write_Initiate(void){ //寫入初始化文檔(分配資源
ofstream outfile("Initiate.txt");
if(!outfile){
cout<<"不能打開初始化文檔:"<<'\n';
exit(1);
}
int Array[MAX_PROCESS*MAX_COURCE*2];
for(int i=0;i<MAX_PROCESS*MAX_COURCE*2;i++)
Array[i]=' ';
int num=0;
Array[num++]=MAX_FACT_PROCESS;
Array[num++]=MAX_FACT_COURCE;
for( i=0;i<MAX_FACT_COURCE;i++)
Array[num++]=Available[i];
for(i=0;i<MAX_FACT_PROCESS;i++)
for(int j=0;j<MAX_FACT_COURCE;j++)
Array[num++]=Max[i][j];
num=0;
outfile<<Array[num++]<<" ";
for(i=0;i<MAX_FACT_COURCE;i++)
outfile<<Array[num++]<<" ";
outfile<<'\n'<<Array[num++]<<endl;
for(i=0;i<MAX_FACT_PROCESS;i++){
for(int j=0;j<MAX_FACT_COURCE;j++)
outfile<<Array[num++]<<" ";
outfile<<endl;
}
DWORD m_delay=3000;
Sleep(m_delay);
outfile.close();
cout<<"修改初始化文檔成功!"<<endl;
}
void Allocated_list(void){ //讀入已分配資源列表
ifstream infile("Allocated_list.txt");
if(!infile){
cout<<"不能打開輸入文件:"<<"Allocated_list.txt"<<'\n';
exit(1);
}
cout<<"開始讀入已分配資源列表"<<'\n';
int ch,num=0;
int Array[MAX_PROCESS*MAX_COURCE];
for(int i=0;i<MAX_PROCESS*MAX_COURCE;i++)
Array[i]=' ';
while(infile>>ch)
Array[num++]=ch;
num=0;
for( i=0;i<MAX_FACT_PROCESS;i++)
for(int j=0;j<MAX_FACT_COURCE;j++)
Allocation[i][j]=Array[num++];
infile.close();
}
void Set_Need(void){ //設(shè)置需求矩陣
cout<<"設(shè)置需求矩陣"<<'\n';
for(int i=0;i<MAX_FACT_PROCESS;i++)
for(int j=0;j<MAX_FACT_COURCE;j++)
Need[i][j]=Max[i][j]-Allocation[i][j];
}
void Write_Allocation(void){ //修改資源分配列表(資源分配)
ofstream outfile("Allocated_list.txt");
if(!outfile){
cout<<"不能打開資源分配列表:"<<'\n';
exit(1);
}
for(int i=0;i<MAX_FACT_PROCESS;i++){
for(int j=0;j<MAX_FACT_COURCE;j++)
outfile<<Allocation[i][j]<<" ";
outfile<<endl;
}
DWORD m_delay=3000;
Sleep(m_delay);
cout<<"修改資源分配列表成功!"<<endl;
outfile.close();
}
void Allocate_Source(void){ //開始分配(已通過掃描和安全性檢測(cè))
for(int j=0;j<MAX_FACT_COURCE;j++){
cout<<'\n'<<"開始給第"<<Request_PROCESS+1<<"個(gè)進(jìn)程分配第"<<j+1
<<"類資源"<<require[j]<<"個(gè)"<<endl;
Available[j]=Available[j]-require[j];
Allocation[Request_PROCESS][j]=Allocation[Request_PROCESS][j]+require[j];
Need[Request_PROCESS][j]=Need[Request_PROCESS][j]-require[j];
}
Write_Initiate();
Write_Allocation();
Set_Need();
DWORD m_delay=3000;
Sleep(m_delay);
cout<<'\n'<<"祝賀您,資源分配已成功!"<<endl;
cout<<"相應(yīng)進(jìn)程所需資源如下:\n";
cout<<" \t";
for( j=0;j<MAX_FACT_COURCE;j++)
cout<<"第"<<j+1<<"類資源\t";
cout<<endl;
for(int i=0;i<MAX_FACT_PROCESS;i++){
cout<<"第"<<i+1<<"個(gè)進(jìn)程還需要"<<'\t';
for(int j=0;j<MAX_FACT_COURCE;j++){
cout<<Need[i][j]<<" \t";
if(Need[i][j]=0) k--;
cout<<"k="<<k<<endl;
}
cout<<endl;
}
g2: cout<<"*************************************************"<<'\n'<<"點(diǎn)擊1繼續(xù)執(zhí)行!"
<<'\n'<<"輸入2退出!"
<<'\n'<<"*************************************************"<<endl;
cin>>flag;
if(flag==2) exit(0);
else if(flag==1){
if(k>0&&Request_PROCESS==MAX_FACT_PROCESS-1){
cout<<"k="<<k<<endl;
set_require();
}
else{
cout<<"所有進(jìn)程已得到滿足,退出!\n";
exit(1);
}
}
else {
cout<<"輸入錯(cuò)誤,請(qǐng)重新輸入!"<<'\n';
goto g2;
}
}
void set_require(){
for(int i=0;i<MAX_FACT_PROCESS;i++){
Set_Need();
Request_PROCESS=i;
for(int j=0;j<MAX_FACT_COURCE;j++){
require[j]=0;
if(Need[Request_PROCESS][j]==0)
continue;
cout<<'\n'<<"輸入第"<<Request_PROCESS+1<<"個(gè)進(jìn)程\n"<<"第"<<j+1<<"類資源需求數(shù)目";
cin>>Request_COURCE_NEMBER;
require[j]=Request_COURCE_NEMBER;
}
cout<<'\n'<<"第"<<Request_PROCESS+1<<"個(gè)進(jìn)程\n";
for( j=0;j<MAX_FACT_COURCE;j++)
cout<<"請(qǐng)求第"<<j+1<<"類資源"<<require[j]<<"個(gè)"<<endl;
j=0;
RUN();
}
}
void Test_Safty(){ //安全性檢測(cè)
s=new int[MAX_FACT_PROCESS];//存放安全序列
int k=0,q=1;//k確定安全序列位置,q判斷是否某進(jìn)程是否通過安全檢測(cè)(1,通過,0,沒有通過)
cout<<'\n'<<"進(jìn)入安全性檢測(cè)!"<<endl;
int Work[MAX_COURCE];
for(int i=0;i<MAX_FACT_COURCE;i++)
Work[i]=' ';
for(i=0;i<MAX_FACT_COURCE;i++)
Work[i]=Available[i];
bool Finish[MAX_PROCESS][MAX_COURCE];
for(i=0;i<MAX_PROCESS;i++)
for(int j=0;j<MAX_COURCE;j++)
Finish[i][j]=false;
COMP Array[32][64];
for(i=0;i<MAX_PROCESS;i++)
for(int j=0;j<MAX_COURCE;j++){
Array[i][j].num=' ';
Array[i][j].value=' ';
}
for(i=0;i<MAX_FACT_PROCESS;i++)
for(int j=0;j<MAX_FACT_COURCE;j++){
Array[i][j].value=Need[i][j];
Array[i][0].num=i;
}
DWORD m_delay=3000;
Sleep(m_delay);
for(int j=0;j<MAX_FACT_COURCE;j++){
int m=0;
if(Finish[Request_PROCESS][j]==false&&Need[Request_PROCESS][j]<=Work[j])
{
Work[j]=Work[j]+Allocation[Request_PROCESS][j];
Finish[Request_PROCESS][j]=true;
m=1;
q*=m;
}
else{
m=0;
q*=m;
}
}
if(q==1){
s[k]=Request_PROCESS+1;
k++;
}
else
{
cout<<"未通過安全性測(cè)試1,不與以分配"<<endl;
exit(0);
}
g3: for(i=0;i<MAX_FACT_PROCESS;i++){
int m;
if(Array[i][0].num==Request_PROCESS)
continue;
for(int j=0;j<MAX_FACT_COURCE;j++)
if(Array[i][0].num!=Request_PROCESS&&Finish[Array[i][0].num][j]==false&&Need[Array[i][0].num][j]<=Work[j]){
Work[j]=Work[j]+Allocation[Array[i][0].num][j];
Finish[Array[i][0].num][j]=true;
m=1;
q*=m;
}
else{
m=0;
q*=m;
}
if(q==1){
s[k]=Array[i][0].num+1;
k++;
goto g3;
}
}
for(i=0;i<MAX_FACT_PROCESS;i++)
for(int j=0;j<MAX_FACT_COURCE;j++){
if(Finish[i][j]==true)
continue;
else{
cout<<"未通過安全性測(cè)試2,不與以分配"<<endl;
exit(0);
}
}
cout<<'\n'<<"找到一個(gè)安全序列:";
k=0;
for(i=0;i<MAX_FACT_PROCESS;i++){
cout<<"P"<<s[k]<<"--->";
k++;
}
cout<<'\n'<<"已通過安全性測(cè)試!"<<endl;
Allocate_Source();
}
void RUN(void){ //執(zhí)行銀行家算法
cout<<"*************************************************"<<'\n'<<"點(diǎn)擊1執(zhí)行銀行家算法!"
<<'\n'<<"點(diǎn)擊2退出!"
<<'\n'<<"*************************************************"<<endl;
cin>>flag;
if(flag==2)
exit(0);
if(flag==1)
{
cout<<"開始掃描請(qǐng)求信息!"<<endl;
DWORD m_delay=3000;
Sleep(m_delay);
for(int j=0;j<MAX_FACT_COURCE;j++)
if(Need[Request_PROCESS][j]==0)
continue;
if(require[j]>Need[Request_PROCESS][j])
{
cout<<"\n第"<<Request_PROCESS+1<<"個(gè)進(jìn)程還需要第"<<j+1<<"類資源"<<Need[Request_PROCESS][j]<<"個(gè)";
cout<<'\n'<<"第"<<Request_PROCESS+1<<"個(gè)進(jìn)程請(qǐng)求第"<<j+1<<"類資源"<<require[j]<<"個(gè)"<<endl;
cout<<"可是已超出該進(jìn)程尚需的該類資源的最大數(shù)量,所以不予以分配!!"<<endl;
cout<<"\n請(qǐng)重新輸入第"<<Request_PROCESS+1<<"個(gè)進(jìn)程第"<<j+1<<"類資源數(shù)目"<<endl;
cin>>Request_COURCE_NEMBER;
require[j]=Request_COURCE_NEMBER;
RUN();
}
if(require[j]>Available[j])
{
cout<<'\n'<<"第"<<Request_PROCESS+1<<"個(gè)進(jìn)程請(qǐng)求第"<<j+1<<"類資源"<<require[j]<<"個(gè)"<<endl;
cout<<"可是系統(tǒng)中尚無(wú)足夠的資源,所以進(jìn)入等待隊(duì)列!!"<<endl;
exit(0);
}
else{
// Available[j]=Available[j]-require[j];
// Allocation[Request_PROCESS][j]=Allocation[Request_PROCESS][j]+require[j];
// Need[Request_PROCESS][j]=Need[Request_PROCESS][j]-require[j];
cout<<"掃描通過"<<endl;
Sleep(m_delay);
Test_Safty();
}
}
else {
cout<<"輸入錯(cuò)誤,請(qǐng)重新輸入!"<<'\n';
RUN();
}
}
void main(void){
clear();
cout<<"※※※※※※※※※※※※※※※※※※※※"<<endl;
cout<<"※ 歡迎使用本系統(tǒng)! ※"<<endl;
cout<<"※ 作者:鄧申貴 ※"<<endl;
cout<<"※====================================※"<<endl;
cout<<"====輸入實(shí)際總進(jìn)程數(shù): ===="<<endl;
cin>>MAX_FACT_PROCESS;
cout<<"====輸入實(shí)際資源類別數(shù): ===="<<endl;
cin>>MAX_FACT_COURCE;
cout<<"========================================"<<endl;
require=new int[MAX_FACT_COURCE];
cout<<"====輸入資源向量: ===="<<endl;
for(int i=0;i<MAX_FACT_COURCE;i++){
cout<<"====第"<<i+1<<"類資源可用數(shù)目 ";
cin>>Available[i];
}
cout<<"========================================"<<endl;
cout<<"====建立需求矩陣\n"<<"====輸入相應(yīng)進(jìn)程的需求資源數(shù)目:\n";
for( i=0;i<MAX_FACT_PROCESS;i++){
cout<<"====輸入第"<<i+1<<"個(gè)進(jìn)程\n";
for(int j=0;j<MAX_FACT_COURCE;j++){
int m;
cout<<"====第"<<j+1<<"類資源所需數(shù)目:";
cin>>m;
if(m>Available[j]){
cout<<"====所需資源已超出可用資源數(shù)目,退出!\n";
exit(0);
}
else
Max[i][j]=m;
}
}
for( i=0;i<MAX_FACT_PROCESS;i++){
cout<<"輸入第"<<i+1<<"個(gè)進(jìn)程\n";
for(int j=0;j<MAX_FACT_COURCE;j++){
int a;
g1: cout<<"\n第"<<j+1<<"類資源已分配數(shù)目:";
cin>>a;
if(a>Max[i][j]) {
cout<<"超出最大可得資源數(shù)目,錯(cuò)誤!重新輸入!"<<endl;
goto g1;
}
else Allocation[i][j]=a;
Available[j]=Available[j]-Allocation[i][j];
}
}
Write_Initiate();
Read_Initiate();
cout<<endl<<"進(jìn)程數(shù)目:"<<MAX_FACT_PROCESS<<endl;
cout<<"資源種類:"<<MAX_FACT_COURCE<<'\n';
cout<<"可用資源數(shù)目:\n";
for( i=0;i<MAX_FACT_COURCE;i++)
cout<<"第"<<i+1<<"類資源:"<<Available[i]<<'\t';
DWORD m_delay=3000;
Sleep(m_delay);
cout<<"讀入成功"<<'\n';
k=MAX_FACT_PROCESS*MAX_FACT_COURCE;//k>0,還有進(jìn)程的需求沒得到滿足,可以繼續(xù)進(jìn)行,k==0退出
Write_Allocation();
Allocated_list();
cout<<" \t";
for(int j=0;j<MAX_FACT_COURCE;j++)
cout<<"第"<<j+1<<"類資源\t";
cout<<endl;
for(i=0;i<MAX_FACT_PROCESS;i++){
cout<<"第"<<i+1<<"個(gè)進(jìn)程已分配\t";
for(int j=0;j<MAX_FACT_COURCE;j++)
cout<<Allocation[i][j]<<" \t";
cout<<endl;
}
Sleep(m_delay);
cout<<"讀入成功"<<'\n';
Set_Need();
cout<<" \t";
for( j=0;j<MAX_FACT_COURCE;j++)
cout<<"第"<<j+1<<"類資源\t";
cout<<endl;
for(i=0;i<MAX_FACT_PROCESS;i++){
cout<<"第"<<i+1<<"個(gè)進(jìn)程還需要\t";
for(int j=0;j<MAX_FACT_COURCE;j++)
cout<<Need[i][j]<<" \t";
cout<<endl;
}
Sleep(m_delay);
cout<<"設(shè)置成功"<<'\n';
cout<<"開始讀入請(qǐng)求向量"<<'\n';
set_require();
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -