操作系统实验报告.doc_第1页
操作系统实验报告.doc_第2页
操作系统实验报告.doc_第3页
操作系统实验报告.doc_第4页
操作系统实验报告.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机操作系统题目: 银行家算法和存储管理 学 院: 信息工程学院 专 业: 计算机科学与技术(交通) 学 号: 201424020331 姓 名: 段志强 指导教师: 刘晓春 2016年 11 月 27 日实验一 银行家算法1. 实验内容:设计的主要内容是模拟实现银行家算法。2. 实验要求与目的:本设计的目的是通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。要求如下:(1) 模拟一个银行家算法;(2) 初始化时让系统拥有一定的资源;(3) 用键盘输入的方式申请资源;(4) 如果预分配后,系统处于安全状态,则修改系统的资源分配情况;(5) 如果预分配后,系统处于不安全状态,则提示不能满足请求。3. 实验原理:银行家算法, 顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。显然,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁。4.源代码:#include #include #include # define m 50# define true 1# define false 0int no1; /进程数int no2; /资源数int r;int allocationmm,needmm,availablem,maxmm;char name1m,name2m; /定义全局变量void main()void check();void print(); /提前声明int i,j,p=0,q=0;char c;int requestm,allocation1mm,need1mm,available1m;printf(*n);printf(* 银行家算法的设计与实现 *n);printf(*n);printf(请输入进程总数:n);scanf(%d,&no1);printf(请输入资源种类数:n);scanf(%d,&no2);printf(请输入Max矩阵:n);for(i=0;ino1;i+)for(j=0;jno2;j+)scanf(%d,&maxij); /输入已知进程最大资源需求量printf(请输入Allocation矩阵:n);for(i=0;ino1;i+)for(j=0;jno2;j+)scanf(%d,&allocationij); /输入已知的进程已分配的资源数for(i=0;ino1;i+)for(j=0;jno2;j+)needij=maxij-allocationij; /根据输入的两个数组计算出need矩阵的值printf(请输入Available向量n);for(i=0;ino2;i+)scanf(%d,&availablei); /输入已知的可用资源数print(); /输出已知条件check(); /检测T0时刻已知条件的安全状态if(r=1) /如果安全则执行以下代码doq=0;p=0;printf(n请输入请求资源的进程号:n);for(j=0;j=no1)printf(输入错误,请重新输入:n);continue;else break;printf(n请输入该进程所请求的资源数requestj:n);for(j=0;jno2;j+)scanf(%d,&requestj);for(j=0;jneedij) p=1;/判断请求是否超过该进程所需要的资源数if(p)printf(请求资源超过该进程资源需求量,请求失败!n);elsefor(j=0;javailablej) q=1;/判断请求是否超过可用资源数if(q)printf(没有做够的资源分配,请求失败!n);else /请求满足条件for(j=0;jno2;j+)available1j=availablej;allocation1ij=allocationij;need1ij=needij;/保存原已分配的资源数,仍需要的资源数和可用的资源数availablej=availablej-requestj;allocationij+=requestj;needij=needij-requestj;/系统尝试把资源分配给请求的进程print();check(); /检测分配后的安全性if(r=0) /如果分配后系统不安全for(j=0;jno2;j+)availablej=available1j;allocationij=allocation1ij;needij=need1ij;/还原已分配的资源数,仍需要的资源数和可用的资源数printf(返回分配前资源数n);print();printf(n你还要继续分配吗?Y or N ?n);/判断是否继续进行资源分配c=getche();while(c=y|c=Y);void check() /安全算法函数int k,f,v=0,i,j;int workm,am;int finishm;r=1;for(i=0;ino1;i+)finishi=false; / 初始化进程均没得到足够资源数并完成for(i=0;ino2;i+)worki=availablei; /worki表示可提供进程继续运行的各类资源数k=no1;dofor(i=0;ino1;i+)if(finishi=false)f=1;for(j=0;jworkj)f=0;if(f=1) /到还没有完成且需求数小于可提供进程继续运行的资源数的进程finishi=true;av+=i; /记录安全序列号for(j=0;j0);f=1;for(i=0;ino1;i+) /判断是否所有的进程都完成if(finishi=false)f=0;break;if(f=0) /若有进程没完成,则为不安全状态printf(系统处在不安全状态!);r=0;elseprintf(n系统当前为安全状态,安全序列为:n);for(i=0;ino1;i+)printf(p%d ,ai); /输出安全序列void print() /输出函数int i,j;printf(n);printf(*此时刻资源分配情况*n);printf(进程名 | Max | Allocation | Need |n);for (i = 0; i no1; i+)printf( p%d/%d ,i,i);for (j = 0; j no2; j+)printf(%d ,maxij);for (j = 0; j no2; j+)printf( %d ,allocationij);for (j = 0; j no2; j+)printf( %d ,needij);printf(n);printf(n);printf(各类资源可利用的资源数为:);for (j = 0; j no2; j+)printf( %d,availablej);printf(n);5.程序显示截图6. 心得体会:通过本次实验,我知道了可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。 为保证资金的安全,银行家规定: (1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客; (2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量; (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款; (4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金. 操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。实验二 存储管理1. 实验内容:设计一个请求页式存储管理方案,并编写模拟程序实现之。淘汰算法采用两种不同的算法如:FIFO和LRU,并比较它们的不同之处。2. 实验目的与要求:要求学生通过实验加深理解虚拟存储技术的特点,并掌握请求页式管理的页面置换算法。3. 实验原理:不同的置换算法,可使同一组进程发生的缺页率不同,如果采用的置换算法不当,会大大降低CPU的使用高效率。FIFO算法优先置换最先进入内存的页。LRU每次选择离当前时间被访问最远的页置换。4. 源代码: #include #include#include#include#define Myprintf printf(|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|n) /*表格控制*/ #define bsize 4 /物理块大小#define psize 16 /进程大小typedef struct page int num; /*记录页面号*/ int time; /*记录调入内存时间*/ Page; /* 页面逻辑结构,结构为方便算法实现设计*/ Page bbsize; /*内存单元数*/ int cbsizepsize; /*暂保存内存当前的状态:缓冲区*/ int queue100; /*记录调入队列*/ int K; /*调入队列计数变量*/ int phbbsize=0; /物理块标号int propsize=0; /进程序列号int flagbsize = 0; /进程等待次数(存放最久未被使用的进程标志)int i = 0, j = 0,k = 0; /i表示进程序列号,j表示物理块号int m = -1, n = -1; /物理块空闲和进程是否相同判断标志int max = -1,maxflag = 0; /标记替换物理块进程下标int count = 0; /统计页面缺页次数int* build()printf(随机产生一个进程序列号为:n);int i = 0; for(i=0; ipsize; i+) proi = 10*rand()/(RAND_MAX+1)+1; printf(%d ,proi); printf(n); return(pro);/*/查找空闲物理块/*int searchpb()for(j=0; jbsize; j+) if(phbj = 0) m = j; return m; break; return -1;/*/查找相同进程/*int searchpro()for(j = 0; j bsize; j+) if(phbj = proi) n = j; return j; return -1;/*/初始化内存/*void empty()for(i=0;ibsize;i+)phbi=0; count=0; /计数器置零/*/先进先出页面置换算法/*void FIFO() for(i = 0; ipsize; i+) m=searchpb(); n=searchpro();/找flag值最大的 for(j = 0; j maxflag) maxflag = flagj; max = j; if(n = -1) /不存在相同进程 if(m != -1) /存在空闲物理块 phbm = proi; /进程号填入该空闲物理块 count+; flagm = 0; for(j = 0;j = m; j+) flagj+; m = -1; else /不存在空闲物理块 phbmax = proi; flagmax = 0; for(j = 0;j bsize; j+) flagj+; max = -1; maxflag = 0; count+; else /存在相同的进程 phbn = proi; for(j = 0;j bsize; j+) flagj+; n = -1; for(j = 0 ;j bsize; j+) printf(%d ,phbj); printf(n); printf(缺页次数为:%dn,count);printf(n);/*/*/*初始化内存单元、缓冲区*/ void Init(Page *b,int cbsizepsize) int i,j; for(i=0;ipsize;i+) bi.num=-1; bi.time=psize-i-1; for(i=0;ibsize;i+) for(j=0;jpsize;j+) cij=-1; /*取得在内存中停留最久的页面,默认状态下为最早调入的页面*/ int GetMax(Page *b) int i; int max=-1; int tag=0; for(i=0;imax) max=bi.time; tag=i; return tag; /*判断页面是否已在内存中*/ int Equation(int fold,Page *b) int i; for(i=0;i=0) bval.time=0; for(i=0;ibsize;i+) if (i!=val) bi.time+; else queue+K=fold;/*记录调入页面*/ val=GetMax(b); bval.num=fold; bval.time=0; for(i=0;ibsize;i+) if (i!=val) bi.time+; void LRU() int i,j; K=-1; Init(b, c); for(i=0;ipsize;i+) Lruu(proi,b); c0i=proi; /*记录当前的内存单元中的页面*/ for(j=0;jbsize;j+) cji=bj.num; /*结果输出*/ printf(内存状态为:n); Myprintf; for(j=0;jpsize;j+) printf(|%2d ,proj); printf(|n); Myprintf; for(i=0;ibsize;i+) for(j=0;jpsize;j+) if(cij=-1) printf(|%2c ,32); else printf(|%2d ,cij); printf(|n); Myprintf; printf(n调入队列为:); for(i=0;iK+1;i+) printf(%3d,queuei); printf(n缺页次数为:%6dn缺页率:%16.6f,K+1,(float)(K+1)/psize); /*/主函数/*void main()int sel ; do printf(ttt-ttt);printf(ttt -欢迎进入操作系统界面- ttt);printf(ttt-tttn);printf(tttttt); printf(ttt 虚拟内存 ttt);printf(ttt-ttt); printf(ttt 1、产生随机序列 ttt);printf(ttt-ttt); printf(ttt 2、最久未使用(LRU) ttt);printf(ttt-ttt); printf(ttt 3、先进先出(FIFO) ttt);printf(ttt-ttt);printf(ttt 4、两种算法的比较() ttt);printf(ttt-ttt);printf(ttt 0、退出(Exit) ttt); printf(ttttttn); printf(请选择所要执行的操作(0/1/2/3/4):);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论