死锁避免算法模拟实验——银行家算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验报告

死锁避免算法的模拟实验

——银行家算法

班级:2013级软件工程1班

学号:X X X

姓名:萧氏一郎

数据结构说明:

①可利用资源向量available, n个元素的数组,每个元素代表一类可用资源的数目, available [ i ] = k,表示系统中有Rj 类资源k 个。

②最大需求矩阵MAX, n3 m矩阵定义n 个进程时,m 类资源的最大

需求max ( i, j) = k 表示进程需要Rj类资源最大数目为k 。

③分配矩阵allocation, n3 m矩阵,表示n个进程的每个进程已分配资源情况, alloction ( i, j) = k表示进程i已分配Rj类资源k 个。

④需求矩阵need, n3 m矩阵,表示各进程仍需要各类资源, need ( i, j) = k表示进程i仍需要资源Rj的数目为k.由上述分析可知need i =max i - allocation i。

流程图:

源代码:

#include

int Isprocessallover(); //判断系统中的进程是否全部运行完毕

void Systemstatus(); //显示当前系统中的资源及进程情况

void Allow(int ,int *); //若进程申请不导致死锁,用此函数分配资源

void Forbidenseason(int ); //若发生死锁,则显示原因

int Banker(int ,int *); //银行家算法

int Availiable[5] = { 5,6, 6,5,4}; //初始状态,系统可用资源量

int Max[5][5] = {{1,2,3,2,3},{3,2,2,3,3},{7,0,2,3,3},{2,2,2,2,3},{4,3,3,1,3 }}; //各进程对各资源的最大需求量

int

Allocation[5][5]={{0,1,0,0,1},{2,0,0,1,1},{3,0,2,0,1},{2,1, 1,0,1},{0,0,2,0,1},}; //初始状态,各进程占有资源量

int

Need[5][5]={{1,1,3,2,2},{1,2,2,2,2},{4,0,0,3,2},{0,1,1,2,2} ,{4,3,1,1,2},}; //初始状态时,各进程运行完毕,还需要的资源量

int over[5]={0,0,0,0,0}; //标记对应进程是否得到所有资源并运行完毕

int main()

{

int i,j,k;

int process=0; //发出请求的进程

int decide=0; //银行家算法的返回值

int Request[5]={0,0,0,0,0}; //申请的资源量数组

int sourcenum=0; //申请的各资源量

/*判断系统中进程是否全部运行完毕*/

step1: if(Isprocessallover()==1)

{

puts("系统中全部进程运行完毕!");

return 0;

}

/*显示系统当前状态*/

Systemstatus();

/*人机交互界面*/

step2: printf("输入发出请求的进程(输入“0”退出系统):"); scanf("%d",&process);

if(process == 0)

{

printf("放弃申请,退出系统!");

return 0;

}

if(process<1 || process>5 ||over[process-1]==1)

{

puts("系统无此进程!");

goto step2;

}

puts("此进程申请各资源(A,B,C,D,E)数目: ");

for(i=0;i<5;i++)

{

printf("%c资源:",65+i);

scanf("%d",&sourcenum);

Request[i] = sourcenum;

}

/*用银行家算法判断是否能够进行分配*/

decide=Banker(process,Request);

if (decide==0)

{

/*将此进程申请资源分配给它*/

Allow(process,Request);

goto step1;

}

else

{

/*不能分配,显示原因*/

Forbidenseason(decide);

goto step2;

}

return 0;

}

int Isprocessallover()

{

int i,j;

int processnum=0;

for(i=0;i<6;i++)

{

//判断每个进程是否运行完毕

if(over[i]==1) processnum++;

}

if(processnum == 5) return 1; //系统中全部进程运行完毕

return 0;

}

void Systemstatus()

{

int i,j;

puts("此刻系统中存在的进程:");

for(i=0;i<5;i++)

if(over[i]!=1) printf("P%d ",i+1);

puts("");

puts("此刻系统可利用资源(单位:个):");

puts("A B C D E");

for(i=0;i<5;i++) printf("%d ",Availiable[i]);

puts("");

puts("此刻各进程已占有资源如下(单位:个):");

puts(" A B C D E");

for(i=0;i<5;i++)

{

if(over[i]==1) continue;

printf("P%d ",i+1);

for(j=0;j<5;j++) printf("%d ",Allocation[i][j]);

puts("");

}

puts("各进程运行完毕还需各资源如下(单位:个):"); puts(" A B C D E");

for(i=0;i<6;i++)

相关文档
最新文档