东南大学操作系统实验报告--银行家算法

时间:2019-05-14 13:44:46下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《东南大学操作系统实验报告--银行家算法》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《东南大学操作系统实验报告--银行家算法》。

第一篇:东南大学操作系统实验报告--银行家算法

操作系统实验三:银行家算法的实现

一、基本信息:

a)实验题目:银行家算法的实现 b)完成人姓名:韩璐璐 c)学号:71114115 d)报告日期:2016.5.27

二、实验目的

通过实验,加深对多实例资源分配系统中死锁避免方法——银行家算法的理解,掌握Windows环境下银行家算法的实现方法,同时巩固利用Windows API进行共享数据互斥访问和多线程编程的方法。

三、实验内容

1.在Windows操作系统上,利用Win32 API编写多线程应用程序实现银行家算法。

2.创建n个线程来申请或释放资源,只有保证系统安全,才会批准资源申请。3.通过Win32 API提供的信号量机制,实现共享数据的并发访问。

四、程序运行时的初值和运行结果(系统截图)

五、源程序并附上注释 #include #include #include #include using namespace std;int r[3] = { 3, 3, 2 };//系统拥有的资源 int r0 = 0, r1 = 0, r2 = 0;//记录申请资源 class pcb { public: int id;bool state;int max[3];int alc[3];int need[3];

pcb(){ } void init(){

state = false;

cout << “请输入进程的id,各个资源总需求量和已占用资源” << endl;

cin >> id;

cout << “a,b,c三种资源的最大使用量” << endl;

cin >> max[0] >> max[1] >> max[2];

cout << “a,b,c三种资源的已占有量” << endl;

cin >> alc[0] >> alc[1] >> alc[2];} int rd(int n){

return rand()%(n + 1);

} int request(){

// Sleep(1000);

r0 = rd(max[0]alc[1]);

r2 = rd(max[2]alc[0]))&& r1 ==(max[1]alc[2]))

{

r[0] = r[0] + alc[0];

r[1] = r[1] + alc[1];

r[2] = r[2] + alc[2];

return 1;

}

return 2;

} };bool safe(vector

temp, int i){ int u = r[0]r1, l = r[2]1;j++)

temp[j] = temp[j + 1];temp.pop_back();int size = temp.size();//记录下容器内还有多少个进程

// int range[size];//记录下队列

int x = 0;//计数器

while(!temp.empty()){

static int j = 0;

if((temp[j].max[0]temp[j].alc[1])<= k &&

(temp[j].max[2]1;e++)

temp[e] = temp[e + 1];

temp.pop_back();

if(j >= temp.size())

j = 0;

}

else

{

j++;

if(j >= temp.size())

j = 0;

}

x++;

if(x ==(size*size))

{

cout << “没有安全队列,以上情况不成立” << endl;

cout << endl;

return false;

}

} return true;} int main(){ srand(time(0));pcb p[4];vector

vp;for(int i = 0;i<4;i++){

p[i].init();

vp.push_back(p[i]);} int x = 0;//计算器

int c;cout << “请选择分配资源方法:1.银行家算法 2.随机算法” << endl;cin >> c;switch(c){ case 1:

while(!vp.empty())

{

int a;

static int i = 0;

if((a = vp[i].request())!= 0)

{

if(a == 1)

endl;

r[1] << “ c

{

cout << ”进程“ << vp[i].id << ”已经结束“ <<

for(int j = i;j

r[1] = r[1]r2;

cout << ”a资源还剩“ << r[0] << ” b资源还剩“ << r[1] << ” c资源还剩“ << r[2] << endl;

cout << endl;

}

i++;

if(i >= vp.size())

i = 0;

}

}

else

i++;

if(i >= vp.size())

i = 0;

x++;

if(x >= 200)

{

cout << ”初始化的表不安全“ << endl;

return 0;

}

}

cout << ”进程已经全部结束“ << endl;

break;case 2:

while(!vp.empty())

{

int a2;

static int i2 = 0;

if((a2 = vp[i2].request())!= 0)

{

if(a2 == 1)

{

cout << ”进程“ << vp[i2].id << ”已经结束“ << endl;

for(int j = i2;j

r[1] = r[1]r2;

cout << ”a资源还剩“ << r[0] << ” b资源还剩“ << r[1] << ” c资源还剩“ << r[2] << endl;

cout << endl;

i2++;

if(i2 >= vp.size())

i2 = 0;

}

}

else

i2++;

if(i2 >= vp.size())

i2 = 0;

x++;

if(x >= 200)

{

cout << ”产生死锁“ << endl;

return 0;

}

}

cout << ”进程已经全部结束“ << endl;

break;default:

cout << ”选择错误“ << endl;

break;

} system(”pause");return 1;}

要求:实验报告以电子版的形式通过Email提交给助教,做到内容翔实、图表清晰,层次分明,标题突出。

一班 助教老师:丁文江 Email:dingwj@seu.edu.cn 二班 助教老师:张润环 Email:seu-zrh@seu.edu.cn 两位助教老师工作地点:九龙湖校区计算机楼333房间

第二篇:操作系统银行家算法实验报告

实验四

死锁

一、实验目的

当系统的总资源数m小于或等于所有进程对对资源的最大需求时,就可能产生 死锁。死锁会引起计算机系统的瘫痪。银行家算法是在实现资源分配时避免死锁的一个著名算法,该算法是在能确保系统处于安全状态时才把资源分配给申请者。通过本实验使学生能进一步理解死锁的概念,并能选择一个算法来避免死锁。

二、实验题目

系统中有m个同类资源被n个进程共享,每个进程对资源的最大需求数分别为S1, S2,…,Sn,且 Max(Si)<=m,(i=1,2,…n)。进程可以动态地申请资源和释放资源。编写一个程序,现银行家算法,当系统将资源分配给某一进程而不会死锁时,就分配之。否则,推迟分配,并显示适当的信息。

三、数据结构

主要数据结构:

Struct aa { void Print();//用于打印输出表格的函数 void Input();//用于输入的函数

void tryfenpei(int i);//试分配函数 void refenpei(int i);//恢复数据函数 void checksafe(int s);//安全检测函数 };

四、银行家算法的流程图 开始初始化资源类数c=3,进程数t=5初始化Available[c],Max[t][c],Allocation[t][c],Need[t][c],Request[c]输入进程数iInt f=0f

五、源代码

#include #include “stdio.h” const unsigned short c = 3;//资源类数 const unsigned short t = 5;//进程数

void Print();//用于打印输出表格的函数 void Input();//用于输入的函数

void tryfenpei(int i);//试分配函数 void refenpei(int i);//恢复数据函数 void checksafe(int s);//安全检测函数

//定义初始化数组 int Available[c], Max[t][c], Allocation[t][c], Need[t][c], Request[c];

int in;//用户选择的进程号

int main(int argc, char *argv[]){ int i;char ch='Y';cout<<“初始化数据如下:”<>in){ if(in<0||in>4){ cout<<“不存在该进程,请重新输入”<>Request[i]){ if(Request[i]<0)cout<<“错误!输入的数字无效.”<Need[in][i])cout<<“错误!超出进程需求量”<Available[i])cout<<“错误!系统还没有足够的可用资源量满足进程需要”<

cout<<“试分配完成!”<

cout<<“需要继续实验吗?(y-继续 n终止)”;} else if(ch=='N'||ch=='n'){ cout<<“感谢您的使用,祝您愉快!”<>ch);return 0;}

void Print(){ int i,j;cout<<“ 进程个数 : ”<0){ cout<<“ |”;} cout<

void Input(){ for(int j=0;j>Available[j]){ if(Available[j]<0)cout<<“输入数字无效,请重新输入”<

{ for(int m=0;m>Max[l][m]){ if(Max[l][m]<0)cout<<“输入数字无效,请重新输入”<>Allocation[l][m])if(Allocation[l][m]<0)cout<<“输入数字无效,请重新输入”<

void tryfenpei(int i){ for(int f=0;f

//安全检测函数

void checksafe(int s){ int Work, flag, temp[t], i,j,l=0,k=0;bool Finish[t];for(i=0;i

} if(l==5)//一共有三类资源A B C,一条进程下面的安全性检测只检测了A类。如果A类通过了,那么还要判断B类,C类。否则不用 { for(i=0;i

} i=s;//s传递进来赋给i,s是用户输入的进程号(有主函数里的in传递进来)while(i

if(Finish[i]==false&&Need[i][j]<=Work){ Work=Work+Allocation[i][j];Finish[i]=true;temp[k]=i;//cout<<“temp=”<”;cout<

六、执行结果:

七、实验总结

通过本次实验了解到用银行家算法来预防死锁是可靠的,但也是非常保守的,因为它限制了进程对资源的存取,从而降低了进程的并发运行程度。死锁检测并不限制进程对资源的申请,只要有,就分配,但这也可能造成死锁。但由于死锁并不是经常发生的,故大大提高了系统运行的效率。

总之,通过本实验,使我进一步加深理解和掌握银行家算法。

第三篇:操作系统银行家算法(避免死锁)实验报告

操作系统实验:银行家算法

姓名:李天玮

班级:软工1101 实验内容:

在windows系统中实现银行家算法程序。

学号:201126630117 实现银行家算法所用的数据结构:

假设有5个进程3类资源,则有如下数据结构: 1.MAX[5,3] 5个进程对3类资源的最大需求量。2.AVAILABLE[3]系统可用资源数。

3.ALLOCATION[5,3]5个进程已经得到3类资源的资源量。4.NEED[5,3]5个进程还需要3类资源的资源量。

银行家算法:

设进程1提出请求Request[N],则银行家算法按如下规则进行判断。(1)如果Request[N]<=NEED[1,N],则转(2);否则,出错。(2)如果Request[N]<=AVALIABLE,则转(3);否则,出错。(3)系统试探非配资源,修改相关数据。

AVALIABLE=AVALIABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

安全性检查:

(1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE.(2)从晋城集合中找到一个满足下述条件的进程,FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4)。

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

WORK=WORK+ALLOCATION FINISH[i]=TRUE GOTO(2)

(4)如所有进程FINISH[M]=TRUE,则表示安全;否则系统不安全。

1.用init()函数对于数据的初始化

关键代码:

#define M 5 #define N 3

void init(){

cout<<“请输入5个进程对3类资源最大资源需求量:”<

} cout<<“请输入系统可用的资哩源数:”<

{ } cin>>AVAILABLE[j];for(int j=0;j>MAX[i][j];} //cout<

cout<<“请输入5个进程已经-的到的3类资源的资源量:”<

for(int i=0;i

} cout<<“请?输?入?5个?进?程ì还1需è要癮3类え?资哩?源′的?资哩?源′量?:”<

} for(int j=0;j>NEED[i][j];} //cout<>ALLOCATION[i][j];} //cout<

}// Stack around the variable 'AVAILABLE' was corrupted.显示数据详细信息

进行测试 输入一号进程号,并给需要申请资源设定为{1,0,2}

检验错误输入时候的报错信息

检验当再次申请0号资源并申请资源数目为{0,2,0}时,系统提示系统不安全申请不成功。

每当验证申请成功后会进行的修改操作:

if(flag=='Y'||flag=='y')//进?行D数簓据Y修T改?

{ changdata(i);

}

} if(chkerr(0)){

} else showdata();rstordata(i);showdata();else showdata();cout<>flag;退?出?演Y示?”;

第四篇:银行家算法_实验报告

课程设计报告

课程设计名称 共享资源分配与银行家算法

系(部)

专业班级

指导教师

年 月 日

、目

一、课程设计目的和意义...................................................................................3

二、方案设计及开发过程..............................................................................................3

1.课题设计背景.................................................................................................................3 2.算法描述

............................................................................................................................3 3.数据结构

............................................................................................................................4 4.主要函数说明.................................................................................................................4 5.算法流程图......................................................................................................................5

三、调试记录与分析

四、运行结果及说明

..............................................................................................6

1.执行结果.........................................................................................................................6 2.结果分析.........................................................................................................................7

五、课程设计总结...................................................................................................8

、一、程设计目的和意义

计算机科学与技术专业学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,其目的在于加深催操作系统基础理论和基本知识的理解,加强学生的动手能力.银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法

二、方案设计及开发过程

1.课题设计背景

银行家算法又称“资源分配拒绝”法,其基本思想是,系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给他,现在系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。此时系统中的资源就更多了。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配给他。请进程等待

2.算法描述

1)如果Request[i] 是进程Pi的请求向量,如果Request[i,j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查: 如果Requesti[j]<= Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。

2)如果Requesti[j]<=Available[j],便转向步骤3,否则,表示尚无足够资源,进程Pi须等待。

3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值: Available[j]:=Available[j]-Requesti[j];Allocation[i,j]:=Allocation[i,j]+Requesti[j];Need[i,j]:=Need[i,j]-Requesti[j];

、4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程pi等待。

3.数据结构

1.可利用资源向量AVAILABLE。这是一个含有M个元素的数组,其中的每一个元素代表一类可利用的资源数目,其3初始值是系统中所配置的该类全部可哦那个资源的数目,其数值随该类资源的分配和回收而动态的改变。

2.最大需求矩阵MAX。这是一个M*N的矩阵,它定义了系统中N个进程中的每一个进程对M类资源的最大需求。

3.分配矩阵ALLOCATION。这也是一个M*N的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。

4.需求矩阵NEED。这也是一个M*N的矩阵,用以表示每一个进程尚需的各类资源数。5.NEED[R,W]=MAX[R,W]-ALLOCATION[R,W]

4.主要函数说明

主要的常量变量

#define W 10 //最大进程数W=10 #define R 20 //最大资源总数R=20 int AVAILABLE[R];//可利用资源向量 int MAX[W][R];//最大需求矩阵 int ALLOCATION[W][R];//分配矩阵 int NEED[W][R];//需求矩阵 int Request[R];//进程请求向量

void changdata(int k);//进程请求资源数据改变 int chksec(int s);//系统安全性的检测

主要模块

void inputdata()void showdata()void changdata(int k)void restoredata(int k)int chksec(int s)int chkmax(int s)

、5.算法流程图

三、调试记录与分析

调试通过,程序未出错

、四、运行结果及说明

1.执行结果

、2.结果分析

银行家算法就是当接收到一个系统资源的分配后找到一个安全序列,使得进程间不会发生死锁,若发生死锁则让进程等待。

、五、课程设计总结

通过本次银行家算法实验,加深了我对银行家算法的了解,掌握了如何利用银行家算法避免死锁。实验中遇到点问题,通过查阅资料、询问老师顺利解决。通过这次的实践,使我的理论知识更加的牢固。

附录

程序源码:

#include using namespace std;#define FALSE 0 #define TRUE 1 #define W 10 //最大进程数W=10 #define R 20 //最大资源总数R=20 int M;int N;int ALL_RESOURCE[W];int AVAILABLE[R];//可利用资源向量 int MAX[W][R];//最大需求矩阵 int ALLOCATION[W][R];//分配矩阵 int NEED[W][R];//需求矩阵 int Request[R];//进程请求向量 void inputdata();//数据输入 void showdata();//数据显示

void changdata(int k);//进程请求资源数据改变 void restoredata(int k);//数据恢复 int chksec(int s);//系统安全性的检测 int chkmax(int s);//检测最大需求

void bank();//检测分配的资源是否合理

int main(){ int i,j;inputdata();//安全性算法 for(i=0;i=M)

、cout<<“错误提示:经安全性检查发现,系统的初始状态不安全!!n”<

{

int i=0,j=0,p;cout<<“请输入总进程数:”<>M;if(M>W)cout<W);cout<>N;if(N>R)cout<R);cout<>ALL_RESOURCE[i];cout<>MAX[i][j];if(MAX[i][j]>ALL_RESOURCE[j])cout<ALL_RESOURCE[j]);} } cout<

、for(j=0;j

do{ cin>>ALLOCATION[i][j];

if(ALLOCATION[i][j]>MAX[i][j])

cout<

}while(ALLOCATION[i][j]>MAX[i][j]);} } cout<

NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];for(j=0;j

AVAILABLE[j]=0;} } }

void showdata()//银行家算法

{ int i,j;cout<<“各种资源的总数量,即向量all_resource为:”<

cout<

、cout<

cout<

void changdata(int k)//进程请求资源数据改变

{ int j;for(j=0;j

AVAILABLE[j]=AVAILABLE[j]-Request[j];

ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];

NEED[k][j]=NEED[k][j]-Request[j];} }

void restoredata(int k)//数据恢复

{ int j;for(j=0;j

ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];

NEED[k][j]=NEED[k][j]+Request[j];} }

int chksec(int s)//系统安全性的检测

{ int WORK,FINISH[W];int i,j,k=0;for(i=0;i

FINISH[i]=FALSE;for(j=0;j

WORK=AVAILABLE[j];

、i=s;do

{ if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)

{

WORK=WORK+ALLOCATION[i][j];

FINISH[i]=TRUE;

i=0;

}else

{ i++;

}

}while(i

if(FINISH[i]==FALSE)

{ return 1;

} } return 0;}

int chkmax(int s)//检测最大需求

{ int j,flag=0;for(j=0;j

if(MAX[s][j]==ALLOCATION[s][j])

{ flag=1;

AVAILABLE[j]=AVAILABLE[j]+MAX[s][j];

MAX[s][j]=0;

} } return flag;} void bank(){ int i=0,j=0;char flag='Y';while(flag=='Y'||flag=='y'){ i=-1;while(i<0||i>=M){ cout<<“请输入需申请资源的进程号(从P0到P”<

cin>>i;if(i<0||i>=M)

、cout<<“输入的进程号不存在,重新输入!”<

cin>>Request[j];if(Request[j]>NEED[i][j])

{ cout<<“进程P”<

cout<<“申请不合理,出错!请重新选择!”<

flag='N';

break;

}

else

{ if(Request[j]>AVAILABLE[j])

{ cout<<“进程P”<

cout<<“申请不合理,出错!请重新选择!”<

flag='N';

break;

}

} } if(flag=='Y'||flag=='y'){ changdata(i);

if(chksec(i))

{ cout<

cout<<“该分配会导致系统不安全!!本次资源申请不成功,不予分配!!”<

cout<

restoredata(i);

}

else

{ cout<

cout<<“经安全性检查,系统安全,本次分配成功,且资源分配状况如下所示:”<

cout<

showdata();

if(chkmax(i))

{cout<<“在资源分配成功之后,由于该进程所需的某些资源的最大需求量已经满足,”<

cout<<“因此在进程结束后系统将回收这些资源!”<

showdata();

、}

} } cout<>flag;}}

第五篇:银行家算法实验报告

计算机操作系统实验报告

一、实验名称:银行家算法

二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

三、问题分析与设计:

1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。

2、银行家算法步骤:(1)如果Requesti<or =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。

(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。

(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:

Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。

3、安全性算法步骤:

(1)设置两个向量

①工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;②布尔向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。

(2)从进程集合中找到一个能满足下述条件的进程:

①Finish[i]=false ②Need

(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

Work=Work+Allocation;Finish[i]=true;转向步骤(2)。

(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。

4、流程图: 系统主要过程流程图

银行家算法流程图

安全性算法流程图

四、实验代码:

//#define M 5 //#define N 3 #include //本实验中使用到的库函数 #include #include int max[5][1];//开始定义银行家算法中需要用到的数据 int allocation[5][1];int need[5][1];int available[1];int request[5][1];char *finish[5];int safe[5];int n,i,m;int k=0;int j=0;int work[1];int works[5][1];

void line()//美化程序,使程序运行时更加明朗美观 { printf(“-----------------n”);} void start()//表示银行家算法开始 { line();printf(“ 银行家算法开始n”);printf(“--死锁避免方法 line();} void end()//表示银行家算法结束 { line();printf(” 银行家算法结束,谢谢使用n“);line();} void input()//输入银行家算法起始各项数据 {

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

{

printf(”请输入进程P%d的相关信息:n“,n);

printf(”Max:“);

for(m=0;m<1;m++)

scanf(”%d“,&max[n][m]);

printf(”Allocation:“);

for(m=0;m<1;m++)

scanf(”%d“,&allocation[n][m]);

n”);

}

for(m=0;m<1;m++)

need[n][m]=max[n][m]-allocation[n][m];printf(“请输入系统可利用资源数Available:”);for(m=0;m<1;m++)

} void output()//输出系统现有资源情况 { line();printf(“资源情况 Max Allocation Need Availablen”);printf(“进程 A A A A n”);line();for(n=0;n<5;n++){ printf(“P%d%3d%3d%3d”,n,max[n][0],allocation[n][0],need[n][0]);

} line();}

void change()//当Request[i,j]<=Available[j]时,系统把资源分配给进程P[i],Available[j]和Need[i,j]发生改变

{ for(m=0;m<1;m++){ if(n==0)else

printf(“n”);

printf(“%3d%3dn”,available[0]);scanf(“%d”,&available[m]);

} } available[m]-=request[i][m];allocation[i][m]+=request[i][m];need[i][m]-=request[i][m];void outputsafe()//输出安全序列的资源分配表 { printf(“该安全序列的资源分配图如下:n”);line();printf(“资源情况 Work Need Allocation Work+Allocation Finishn”);printf(“进程 A A A A n”);line();for(n=0;n<5;n++)

printf(“P%d%9d%3d%3d%5d%12sn”,safe[n],works[safe[n]][0],need[safe[n]][0],allocation[safe[n]][0],works[safe[n]][0]+allocation[safe[n]][0],finish[n]);line();} int check()//安全性算法 { printf(“开始执行安全性算法……n”);for(m=0;m<1;m++)//数组work和finish初始化

work[m]=available[m];for(n=0;n<5;n++){

} finish[n]=“false”;safe[n]=0;k=0;for(m=0;m<5;m++)for(n=0;n<5;n++)

if(strcmp(finish[n],“false”)==0 && need[n][0]<=work[0])//查找可以分配资源但尚未分配到资源的进程

{

safe[k]=n;//以数组safe[k]记下各个进程得到

分配的资源的顺序

works[safe[k]][0]=work[0];

放出分配给它的资源

work[0]+=allocation[n][0];//进程执行后释

finish[n]=“ture”;//finish[n]变为1以示该进

程完成本次分

}

k++;for(m=0;m<5;m++)//判断是否所有进程分配资源完成{

0

素都为ture } else

if(m==4)//此处m=4表示所有数组finish的所有元if(strcmp(finish[m],“false”)==0){

printf(“找不到安全序列,系统处于不安全状态。n”);return 0;//找不到安全序列,结束check函数,返回 {

printf(“找到安全序列P%d->P%d->P%d->P%d->P%d,系统是安全的n”,safe[0],safe[1],safe[2],safe[3],safe[4]);

} return 1;} void main()//主程序开始 { start();for(;j==0;)//确认输入数据的正确性,若输入错误,重新输入

{

入:“);

} printf(”数据确认无误,算法继续。n“);if(check()==0)//若check函数返回值为0,表示输入的初始数据找不到安全序列,无法进行下一步,程序结束

{

} for(;j==1;)//当有多个进程请求资源时,循环开始

{

printf(”请输入请求资源的进程i(0、1、2、3、4):“);//输入发出请求向量的进程及请求向量 end();exit(0);input();printf(”以下为进程资源情况,请确认其是否正确:n“);output();printf(”数据是否无误:n正确:输入1n错误:输入0n请输

}

j=1;

outputsafe();//输出安全序列的资源分配表

scanf(“%d”,&j);

scanf(“%d”,&i);printf(“请输入进程P%d的请求向量Request%d:”,i,i);for(n=0;n<1;n++)

scanf(“%d”,&request[i][n]);

for(;request[i][0]>need[i][0];)//若请求向量大于需求资源,则认为是输入错误,要求重新输入

{

printf(“数据输入有误,请重试!n请输入进程P%d的请求向量Request%d:”,i,i);

提供分配

n“,i);

} if(request[i][0]<=available[0])//判断系统是否有足够资源

for(n=0;n<1;n++)

scanf(”%d“,&request[i][n]);{

} else

printf(”系统没有足够的资源,进程P%d需要等待。printf(“系统正在为进程P%d分配资源……n”,i);change();//分配资源 j=0;if(j==0)//j=0表示系统有足够资源分配的情况 {

printf(“当前系统资源情况如下:n”);//输出分配资源后的系统资源分配情况

分配无效

output();

if(check()==0)//若找不到安全系列,则之前的资源 {

printf(“本次资源分配作废,恢复原来的资源分配

状态。n”);

资源状态

输入:“);

for(m=0;m<1;m++)//恢复分配资源前的系统

}

}

{

}

output();//输出系统资源状态

available[m]+=request[i][m];allocation[i][m]-=request[i][m];need[i][m]+=request[i][m];printf(”是否还有进程请求资源?n是:输入1n否:输入0n请

scanf(“%d”,&j);//若还有进程请求资源,j=1,之前的for循环条件满足

} end();}

五、程序执行结果:

六、实验总结

多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。

下载东南大学操作系统实验报告--银行家算法word格式文档
下载东南大学操作系统实验报告--银行家算法.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    银行家算法实验报告

    计算机操作系统实验报告 何美西109253030212 一、 实验名称:银行家算法 二、 实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资......

    操作系统课程设计实验报告-用C++实现银行家算法

    操 作 系 统 实 验 报 告 (2) 学院:计算机科学与技术学院 班级:计091 学号:姓名: 时间:2011/12/30 目 录 1. 实验名称……………………………………………………3 2. 实验目的…......

    死锁_银行家算法实验报告

    实验目的 银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死......

    银行家算法《操作系统》课程设计报告

    《操作系统》课程设计报告课题:银行家算法专业计算机科学与技术学生姓名班级计算机学号指导教师信息工程学院一、实验要求和实验目的实验目的:本课程设计是学生学习完《操作系......

    操作系统实验报告-利用银行家算法避免死锁(推荐五篇)

    计算机操作系统实验报告 题 目 利用银行家算法避免死锁一、 实验目的: 1、加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 2、要求编写和......

    操作系统实验报告(clock算法)

    实验四 页面置换算法 一、实验目的 本实验主要对操作系统中请求分页式内存管理及其应用的一些关键算法进行模拟。学生通过设计与实现Clock算法,能够加强对相应理论的理解,并对......

    银行家算法实验报告[推荐阅读]

    实验三 银行家算法 (1)死锁产生的原因和必要条件是什么? 原因: a) 系统资源不足; b) 进程运行推进的顺序不合适; c) 资源分配不当。 如果系统资源充足,进程的资源请求都能够得到满......

    计算机操作系统 课程设计报告 银行家算法

    《计算机操作系统》 课 程 设 计 报 告 题 目: 银行家算法班 级: XXXXXXXXXXXXXXXX 姓 名: XXM 学 号: XXXXXXXXXXXX 指导老师: XXXXXXXXXXXXXX 设计时间: XXXXXXXXXXXXXXX......