操作系统银行家算法实验报告3篇(银行家算法实验设计思路)
下面是范文网小编收集的操作系统银行家算法实验报告3篇(银行家算法实验设计思路),供大家赏析。
操作系统实验:银行家算法
姓名:李天玮
班级:软工1101 实验内容:
在windows系统中实现银行家算法程序。
学号: 实现银行家算法所用的数据结构:
假设有5个进程3类资源,则有如下数据结构: [5,3] 5个进程对3类资源的最大需求量。[3]系统可用资源数。
[5,3]5个进程已经得到3类资源的资源量。[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 cout<<“请输入5个进程已经-的到的3类资源的资源量:”< for(int i=0;i } cout<<“请?输?入?5个?进?程ì还1需è要癮3类え?资哩?源′的?资哩?源′量?:”< } for(int j=0;j }// 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< 计算机操作系统实验报告 一、实验名称:银行家算法 二、实验目的:银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 三、问题分析与设计: 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();} 五、程序执行结果: 六、实验总结 多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。 操作系统实验三:银行家算法的实现 一、基本信息: A)实验题目:银行家算法的实现 b)完成人姓名:韩璐璐 c)学号: d)报告日期: 二、实验目的 通过实验,加深对多实例资源分配系统中死锁避免方法——银行家算法的理解,掌握Windows环境下银行家算法的实现方法,同时巩固利用Windows API进行共享数据互斥访问和多线程编程的方法。 三、实验内容 1.在Windows操作系统上,利用Win32 API编写多线程应用程序实现银行家算法。 2.创建n个线程来申请或释放资源,只有保证系统安全,才会批准资源申请。3.通过Win32 API提供的信号量机制,实现共享数据的并发访问。 四、程序运行时的初值和运行结果(系统截图) 五、源程序并附上注释 #include 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];_back();int size = ();//记录下容器内还有多少个进程 // int range[size];//记录下队列 int x = 0;//计数器 While(!()){ 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]; _back(); if(j >= ()) j = 0; } else { j++; if(j >= ()) 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(); _back(p[i]);} int x = 0;//计算器 int c;cout << “请选择分配资源方法:1.银行家算法 2.随机算法” << endl;cin >> c;switch(c){ case 1: While(!()) { 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<()r0; r[1] = r[1]r2; cout << ”a资源还剩“ << r[0] << ” b资源还剩“ << r[1] << ” c资源还剩“ << r[2] << endl; cout << endl; } i++; if(i >= ()) i = 0; } } else i++; if(i >= ()) i = 0; x++; if(x >= 200) { cout << ”初始化的表不安全“ << endl; return 0; } } cout << ”进程已经全部结束“ << endl; break;case 2: While(!()) { 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<()r0; r[1] = r[1]r2; cout << ”a资源还剩“ << r[0] << ” b资源还剩“ << r[1] << ” c资源还剩“ << r[2] << endl; cout << endl; i2++; if(i2 >= ()) i2 = 0; } } else i2++; if(i2 >= ()) i2 = 0; x++; if(x >= 200) { cout << ”产生死锁“ << endl; return 0; } } cout << ”进程已经全部结束“ << endl; break;default: cout << ”选择错误“ << endl; break; } system(”pause");return 1;} 要求:实验报告以电子版的形式通过Email提交给助教,做到内容翔实、图表清晰,层次分明,标题突出。 一班 助教老师:丁文江 Email:dingwj@ 二班 助教老师:张润环 Email:seu-zrh@ 两位助教老师工作地点:九龙湖校区计算机楼333房间操作系统银行家算法实验报告2
操作系统银行家算法实验报告3