银行家算法等.docx
- 文档编号:3971050
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:29
- 大小:147.09KB
银行家算法等.docx
《银行家算法等.docx》由会员分享,可在线阅读,更多相关《银行家算法等.docx(29页珍藏版)》请在冰豆网上搜索。
银行家算法等
课内实验报告
课程名:
操作系统
任课教师:
沈超
专业:
信息管理与信息系统
学号:
姓名:
二○一六至二○一七年度第一学期
南京邮电大学经济与管理学院
《操作系统》课程实验第一次实验报告
实验内容及基本要求:
实验项目名称:
调度系统的设计与实现
实验类型:
设计
每组人数:
1
实验内容及要求:
实验内容:
本次实验的主要内容是模拟调度系统的实现,包括高级、中级和低级调度的管理系统实现,调度算法的设计与实现以及银行家算法的设计设计与实现。
本次实验主要包括两部分内容:
1、模拟具有三级调度的计算机系统进程运行过程,设计进程调度算法,将其存入进程文件中。
如:
进程1:
运行5秒后有3秒的I/O操作,之后有10秒的运行,结束。
可以写成:
”p1:
r5,io3,r3e;”。
编程实现调度算法函数,设计优先级、时间片大小和并发进程个数,系统不断从进程文件中读出进程信息,选择一种进程调度算法,模拟进程的运行及调度过程,比较不同算法在周转时间和平均周转时间上的差异。
针对进程文件里面的数据为正常、缺项、格式不正确等各种情况,检测程序的执行结果。
2、理解安全性算法和银行家算法的核心机制:
针对3类资源、5个进程的情况,设计相应的数据结构,分别表示每个进程占用各类资源的情况;编程实现安全性算法函数,编制主函数,动态输入资源的占用情况,进程的资源申请,调用安全性函数,实现银行家算法;输入可分配和不可分配的请求,测试系统的正确性。
实验要求:
进程调度模拟程序根据一个进程调度文件,模拟进程的各种调度过程,用适合的表达方式表示出来。
银行家算法程序提供一个用户界面,可以在上边发出资源申请命令,系统应能给出是否可以接受申请,并且有结论输出。
思考:
1、终端型进程流适合使用哪种调度算法?
长批处理作业适合使用哪种调度算法?
2、动态优先级调度算法的优先级变化率应该如何设置?
实验结果:
1.进程调度过程的模拟
(1)概述
选择一个调度算法,实现处理机调度。
设计要求:
1)进程调度算法包括:
先来先服务算法,时间片轮转算法,最高优先数优先优先算法,
动态优先级算法。
2)可选择进程数量
3)本程序包括四种算法,用C或C++语言实现,执行时在主界面选择算法(可
用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),
执行,显示结果。
(2)设计原理
1)先来先服务算法FCFS
每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作
业,将它们调入内存,为它们分配资源创建进程,然后放入就绪队列。
2)时间片轮转法RR
系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
(3)最高优先数优先优先算法
SPF短进程优先调度算法是从就绪队列中选出一个估计运行时间最短的进程,
将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
#include
#include
#include
usingnamespacestd;
#defineP_NUM3//进程数
#defineP_TIME2//时间片长度
#defineMIN-9999
enumstate//进程状态
{
ready,//就绪
run,//执行
wait,//阻塞
finish//完成
};
classPcb
{
public:
staticvoidprint(){};
~Pcb();
protected:
char*name;//进程名
intallTime;//需要运行时间
intcpuTime;//已用cpu时间
stateprocess;//进程状态
};
classHPcb:
publicPcb
{
public:
staticvoidprint();
staticvoidhighS();
staticintgetFirst();
private:
intfirstNum;
};
HPcbhpcb[P_NUM];
classFPcb:
publicPcb
{
public:
staticvoidprint();
staticvoidfcfs();
private:
intcomeTime;
};
FPcbfpcb[P_NUM];
classRPcb:
publicPcb
{
public:
staticvoidprint();
staticvoidrr();
};
RPcbrpcb[P_NUM];
voidRPcb:
:
rr()
{
intii,i=0;
intk=0;
for(;i { char*ch; ch=newchar[1]; cout<<"请输入第"< "< cin>>ch; rpcb[i].name=newchar[strlen(ch)+1]; strcpy(rpcb[i].name,ch); cin>>rpcb[i].allTime; rpcb[i].cpuTime=0; rpcb[i].process=ready; } do { for(i=0;i if(rpcb[i].process==ready) {rpcb[i].cpuTime+=P_TIME; rpcb[i].process=run; if(rpcb[i].cpuTime>=rpcb[i].allTime)//该进程执行完成 { rpcb[i].cpuTime-=P_TIME; system("cls"); print(); Sleep(1000); rpcb[i].process=finish; rpcb[i].cpuTime=rpcb[i].allTime;//防止所用时间超过总的时间 system("cls"); print(); Sleep(1000); } else { rpcb[i].cpuTime-=P_TIME; system("cls"); print(); Sleep(1000); rpcb[i].cpuTime+=P_TIME; rpcb[i].process=ready; } } } for(i=0;i if(rpcb[i].process! =ready) k++; if(k==2) {for(i=0;i if(rpcb[i].process==run) break; rpcb[i].cpuTime+=P_TIME; rpcb[i].process=run; if(rpcb[i].cpuTime>=rpcb[i].allTime)//该进程执行完成 {rpcb[i].process=finish; rpcb[i].cpuTime=rpcb[i].allTime;//防止所用时间超过总的时间 system("cls"); print(); Sleep(1000); } else { system("cls"); print(); Sleep(1000); rpcb[i].process=run; } } for(ii=0;ii if(rpcb[ii].process! =finish) break; }while(ii cout<<"所有进程已运行完成! "< } voidHPcb: : highS()//最高优先数优先的调度算法 { intii,f,i=0; for(;i { char*ch; ch=newchar[1]; cout<<"请输入第"< "< cin>>ch; hpcb[i].name=newchar[strlen(ch)+1]; strcpy(hpcb[i].name,ch); cin>>hpcb[i].firstNum>>hpcb[i].allTime; hpcb[i].cpuTime=0; hpcb[i].process=ready; } do { f=getFirst(); hpcb[f].cpuTime+=P_TIME; hpcb[f].firstNum--; hpcb[f].process=run; if(hpcb[f].cpuTime>=hpcb[f].allTime)//该进程执行完成 { hpcb[f].cpuTime-=P_TIME; system("cls"); print(); Sleep(1000); hpcb[f].firstNum=MIN; hpcb[f].process=finish; hpcb[f].cpuTime=hpcb[f].allTime;//防止所用时间超过总的时间 system("cls"); print(); Sleep(1000); } else { hpcb[f].cpuTime-=P_TIME;//为了输出改变前的相关信息 hpcb[f].firstNum++;//为了输出改变前的相关信息 system("cls"); print(); Sleep(1000); hpcb[f].cpuTime+=P_TIME; hpcb[f].firstNum--; hpcb[f].process=ready; } for(ii=0;ii if(hpcb[ii].firstNum! =MIN) break; }while(ii cout<<"所有进程已运行完成! "< } Pcb: : ~Pcb() { delete[]name; } voidFPcb: : fcfs()//先来先服务算法 { inti=0; for(;i { char*ch; ch=newchar[1]; cout<<"请输入第"< "< cin>>ch; fpcb[i].name=newchar[strlen(ch)+1]; strcpy(fpcb[i].name,ch); cin>>fpcb[i].allTime; fpcb[i].comeTime=i+1; fpcb[i].cpuTime=0; fpcb[i].process=ready; } for(i=0;i { for(intj=0;j { fpcb[i].cpuTime+=P_TIME;//第i个进程所用时间加个时间片 if(fpcb[i].cpuTime fpcb[i].process=run;//将其状态设为就绪态 if(fpcb[i].cpuTime>=fpcb[i].allTime) { if((i+1)! =P_NUM)//如果第i+1个进程不是最后一个进程,便于下一个程序从就绪状态到运行状态 { fpcb[i].cpuTime-=P_TIME; system("cls"); print(); Sleep(1000); fpcb[i].cpuTime+=P_TIME; fpcb[i].cpuTime=fpcb[i].allTime; fpcb[i].process=finish; fpcb[i+1].process=run; system("cls"); print(); Sleep(1000); } else { fpcb[i].cpuTime-=P_TIME; system("cls"); print(); Sleep(1000); fpcb[i].process=finish; fpcb[i].cpuTime=fpcb[i].allTime; system("cls"); print(); Sleep(1000); } } else {fpcb[i].cpuTime-=P_TIME; system("cls"); print(); Sleep(1000); fpcb[i].cpuTime+=P_TIME; } } } cout<<"所有进程已运行完成! "< } intHPcb: : getFirst()//得到优先级最高的进程 { intk=0; for(inti=1;i if(hpcb[k].firstNum k=i; returnk; } voidHPcb: : print() { cout<<"**********************************************"< cout<<"进程名"<<"\t"<<"还需运行时间\t"<<"已用CPU时间"<<"\t"<<"优先级"<<"\t"<<"状态"< for(inti=0;i { cout< < switch(hpcb[i].process) { casewait: cout<<"阻塞态"< caseready: cout<<"就绪态"< caserun: cout<<"运行态"< casefinish: cout<<"完成态"< } } cout<<"---------------------------------------------------------------------"< cout< } voidRPcb: : print() { cout<<"********************************************"< cout<<"进程名"<<"\t"<<"还需运行时间\t"<<"已用CPU时间"<< "\t"<<"状态"< for(inti=0;i { cout< < switch(rpcb[i].process) { casewait: cout<<"阻塞态"< caseready: cout<<"就绪态"< caserun: cout<<"运行态"< casefinish: cout<<"完成态"< } } cout<<"---------------------------------------------------------------------"< cout< } voidFPcb: : print() { cout<<"***********************************************"< cout<<"进程名"<<"\t"<<"还需运行时间\t"<<"已用CPU时间" <<"\t"<<"状态"< for(inti=0;i { cout< "\t\t"< switch(fpcb[i].process) { casewait: cout<<"阻塞态"< caseready: cout<<"就绪态"< caserun: cout<<"运行态"< casefinish: cout<<"完成态"< } } cout<<"---------------------------------------------------------------------"< cout< } voidmain() { charch; cout<<"请选择算法: \n1.先来先服务算法\n2.时间片轮转调度算法\n3.最高优先数优先的调度算法\n"< cin>>ch; if(ch=='1') FPcb: : fcfs(); elseif(ch=='2') RPcb: : rr(); elseif(ch=='3') HPcb: : highS(); } 2.安全性算法和银行家算法的核心机制 银行家算法原理: 我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。 为保证资金的安全, 银行家规定: (1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客; (2)顾客可以分期贷款,但贷款的总数不能超过最大需求量; (3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款; (4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金. 操作系统按照银行家制定的规则为进程分配资源, 当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系 统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。 当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。 若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。 银行家算法 进程i发出请求资源申请, (1)如果Request [j]<=need[i,j],转向步骤 (2),否则认为出错,因为他所需要的资源数已经超过它所宣布的最大值。 (2)如果: Request i[j]<=available[i,j],转向步骤(3),否则表示尚无足够资源,进程i需等待。 (3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值: 可利用资源向量Available[i,j]= Available[i,j]- 最大需求矩阵Request [j]; 分配矩阵Allocation[i][j]= Allocation[i][j]+ Request [j]; 需求矩阵need[i][j]= need[i][j]- Request [j]; (4)试分配后,执行安全性检查,调用check()函数检查此次资源分配后系统是否处于安全状态。 若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。 (5)用do{…}while循环语句实现输入字符y/n判断是否继续进行资源申请。 安全性检测算法 (1)设置两个向量: 工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work=Available。 工作向量Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。 开始时先做Finish[i]=false;当有足够的资源分配给进程时,再令Finish[i]=true。 (2)在进程中查找符合以下条件的进程: 条件1: Finish[i]=false; 条件2: need[i][j]<=Work[j]若找到,则执行步骤(3)否则,执行步骤(4) (3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work[j]=Work[j]+Allocation[i][j]; Finish[i]=true; gotostep (2); (4)如果所有的Finish[i]=true都满足,则表示系统处于安全状态,否则,处于不安全状态。 流程图 程序源代码 #include #include #include #include #definem50 intno1;//进程数 intno2;//资源数 intr; intallocation[m][m],need[m][m],available[m],max[m][m]; charname1[m],name2[m];//定义全局变量 voidmain() { voidcheck(); voidprint(); inti,j,p=0,q=0; charc; intrequest[m],allocation1[m][m],need1[m][m],available1[m]; printf("**********************************************\n"); printf("*银行家算法的设计与实现*\n"); printf("**********************************************\n"); printf("请输入进程总数: \n"); scanf("%
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)