目的:陆续整理近一年的学习收获
设Request i是进程Pi的请求向量,如果Request i[j]=K,表示进程P i需要K个R j类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:
修改值操作:Available[j]:= Available[j]-Requesti[j];
Allocation[i,j]:= Allocation[i,j]+Requesti[j];
Need[i,j]:= Need[i,j]-Request i[j];
系统所执行的安全性算法可描述如下:
这个例子在Abraham Silberschatz的《Operation System Concepts》上可以找到:
假设现在有5个进程P0—P1,有三种资源ABC,系统目前的资源调配情况如下面这张列表:
我们先通过安全状态检测算法看一看目前的系统状态是否是安全的:
因为Need[P1] < Available,所以 Available = 3 3 2 + 2 0 0 = 5 3 2, Finish[P1] = true
这时Available就成了5 3 2,继续往下找
发现Need[P3] < Available,所以 Available = 5 3 2 + 2 1 1 = 7 4 3, Finish[P3] = true
在接下来
Need[P4] < Available, Available = 7 4 3 + 0 0 2 = 7 4 5,Finish[P4] = true
Need[P0] < Available, Available = 7 4 5 + 0 1 0 = 7 5 5,Finish[P0] = true
Need[P2] < Available, Available = 7 5 5 + 3 0 2 = 10 5 7,Finish[P2] = true
算到这里Finish中所有的元素都已经置为了true,也就是说所有的进程都已经执行完毕了,目前系统处于安全状态~
如果现在P1发出一个请求Request = 1 0 2
因为1 0 2既小于Need[P1]又小于Available,所以我们调用资源请求算法,计算之后的结果如下:
Available = 3 3 2 - 1 0 2 = 2 3 0
Allocation = 2 0 0 + 1 0 2 = 3 0 2
用红色标出的数据就是与前一状态不同的部分
然后我们在调用安全状态检测算法检查变化后的系统是否处于安全状态就可以了,步骤和一面完全一样
typedef struct{
char ID;//进程程名
int Max[MaxNum];//进程所需所有资源
int Allocation[MaxNum];//进程已分配资源
int Need[MaxNum];//进程还需要资源
int Available[MaxNum];////系统可分配资源
}PRO;
static int n;//行,进程数
static int m;//列,资源数
static int Request[MaxNum];//指定执行进程所需资源
static int SafeOrder[MaxNum];//安全执行顺序
void Enter();//初始化,输入进程已分配资源、仍需资源、系统可分配资源,计算出进程所需最大资源
bool Safe();//判断当前是否安全
void banker();//银行家算法
void display();//显示结果
//判断当前状态是否安全
bool Safe(){
int work[MaxNum];
bool Finish[MaxNum];//是否安全
for (int i=0;i P"<
//执行银行家算法,检测执行某一进程后是否安全
void banker(){
int i,j;
int chooseP;
bool RequestNeed = false;
bool RequestAvailable = false;
cout<>chooseP;
cout<<"输入请求: ";
while(RequestNeed==false){
for (int i=0;i>Request[i];
}
for (i=0;i pro[chooseP].Need[i]){
cout<<"所需要的资源数已超过它所宣布的最大值,请重新输入"< pro[0].Available[i]){
cout<<"尚无足够资源,请重新输入"<
#include
#include
#include
using namespace std;
#define MaxNum 20
typedef struct{
char ID;//进程程名
int Max[MaxNum];//进程所需所有资源
int Allocation[MaxNum];//进程已分配资源
int Need[MaxNum];//进程还需要资源
int Available[MaxNum];////系统可分配资源
}PRO;
static PRO pro[MaxNum]; //进程结构体
static int n;//行,进程数
static int m;//列,资源数
static int Request[MaxNum];//指定执行进程所需资源
static int SafeOrder[MaxNum];//安全执行顺序
void Enter();//初始化,输入进程已分配资源、仍需资源、系统可分配资源,计算出进程所需最大资源
bool Safe();//判断当前是否安全
void banker();//银行家算法
void display();//显示结果
int main(){
Enter();
Safe();
banker();
return 0;
}
//初始化,输入进程已分配资源、仍需资源、系统可分配资源,计算出进程所需最大资源
void Enter(){
int i,j;
cout<<"请输入进程数: ";
cin>>n;
cout<<"请输入资源数: ";
cin>>m;
//初始化进程名
for (i=0;i>pro[0].Available[i];
}
cout<<"请输入Allocation: "<>pro[i].Allocation[j];
}
}
cout<<"请输入 Need: "<>pro[i].Need[j];
}
}
for (i=0;i P"<>chooseP;
cout<<"输入请求: ";
while(RequestNeed==false){
for (int i=0;i>Request[i];
}
for (i=0;i pro[chooseP].Need[i]){
cout<<"所需要的资源数已超过它所宣布的最大值,请重新输入"< pro[0].Available[i]){
cout<<"尚无足够资源,请重新输入"<