《操作系统》实验
实验二 银行家算法
一.实验目的
1、理解死锁的定义、原因和必要条件。
2、掌握银行家算法和安全性算法的基本思想。
3、能够编程模拟利用银行家算法和安全性算法避免死锁的实现过程。
二.使用的设备和仪器
计算机+Windows XP +Visual C++6.0
三.实验内容及要求
编写一程序,能够模拟银行家算法和安全算法来避免死锁。假设系统资源有A、B、C三种,可以运行4个进程。该程序具备的基本功能为:
1、程序可以输入3种资源的数目,4个进程对3种资源的最大需求量、已分配量和需求量。
2、能够判断某一时刻系统是否处于安全状态,如果处于安全状态能够给出安全序列。
3、当某进程提出资源申请时,能够判断是否能把资源分配给申请进程。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define index_max 5
//线程
typedef struct PCB{
int id;
int Max[3];
int allocation[3];
int Need[3];
}PCB;
PCB MY_PCB[index_max]={
0};//定义max个线程初始化为0
//初始化资源数量
int Availabl[3]={
2,3,3};
//分配
void distribution(){
for(int i=0;i<index_max;i++){
MY_PCB[i].id=i+1;
printf("请输入第%d个进程的MAX(A B C)用空格隔开\n",i+1);
scanf("%d %d %d",&MY_PCB[i].Max[0],&MY_PCB[i].Max[1],&MY_PCB[i].Max[2]);
getchar();
printf("请输入第%d个进程的allocation(A B C)用空格隔开\n",i+1);
scanf("%d %d %d",&MY_PCB[i].allocation[0],&MY_PCB[i].allocation[1],&MY_PCB[i].allocation[2]);
getchar();
printf("请输入第%d个进程的Need(A B C)用空格隔开\n",i+1);
scanf("%d %d %d",&MY_PCB[i].Need[0],&MY_PCB[i].Need[1],&MY_PCB[i].Need[2]);
getchar();
}
printf("请输入剩下的Availabl的资源数(A B C)用空格隔开\n");
scanf("%d %d %d",&Availabl[0],&Availabl[1],&Availabl[2]);
getchar();
}
//核心算法
void algorithm(){
int l=0;
int r=0;//双指针
int falg=0;//标志
while(l<=r){
if(l>=index_max|| falg==1) break;
if(r>=index_max){
r=l; falg=1; }
int a = MY_PCB[r].Need[0]<=Availabl[0];
int b = MY_PCB[r].Need[1]<=Availabl[1];
int c = MY_PCB[r].Need[2]<=Availabl[2];
if(a&&b&&c){
PCB tep=MY_PCB[l];
MY_PCB[l]=MY_PCB[r];
MY_PCB[r]=tep;
/*******************/
Availabl[0]+=MY_PCB[l].allocation[0];
Availabl[1]+=MY_PCB[l].allocation[1];
Availabl[2]+=MY_PCB[l].allocation[2];
l++;
r=l;
}else{
r++;
}
}//while
if(falg==1){
printf("此时线程不安全");
return;//退出;
}else{
printf("此时线程安全可,可按照如下线程执行:\n");
for(int i=0;i<index_max-1;i++){
printf("%d-->",MY_PCB[i]);
}
printf("%d",MY_PCB[index_max-1]);
}
}
int main(){
printf("银行家算法======= 班级:计科204 学号:208612 姓名:奉海龙\n");
distribution();
algorithm();
getchar();
return 0;
}
截图: