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

下载本文档

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

文档简介

综合实验报告( 2009- 2010年度第六学期)名 称:操作系统原理综合实验B 题 目:小型仿真操作系统的设计院 系: 班 级: 学 号: 学生姓名: 指导教师: 设计周数: 一周 成 绩: 日期: 2实验一:单处理器系统的进程调度1实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。2实验内容与要求(1)设计多个进程并发执行的模拟调度程序,每个程序由一个PCB表示。(2)模拟调度程序可任选两种调度算法之一实现。(3)程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。3实验原理建立进程循环链表,进程信息包括进程名和需要运行的时间,每次运行一次,系统的运行时间加1,当运行到所需时间时将其状态设为1,说明此进程运行完毕,删除此进程,直到所有进程都运行完毕。4实验源程序#include #include #define NULL 0int Name5=1,2,3,4,5;struct PCB char name;/PCB名字 int RunTime;/PCB已运行时间 int RequestTime;/PCB要求运行时间 char status;/PCB状态 struct PCB* head;/指向上一个PCB结构体的指针变量 struct PCB* next;/指向下一个PCB结构体的指针变量;struct PCB pcb1,pcb2,pcb3,pcb4,pcb5,*p,*q;/定义PCB各参数的初值,输入各个进程的运行时间Value() =Name0; =Name1; =Name2; =Name3; =Name4;/定义PCB状态,初态为R pcb1.status=R; pcb2.status=R; pcb3.status=R; pcb4.status=R; pcb5.status=R;/定义PCB运行时间,初值为0 pcb1.RunTime=0; pcb2.RunTime=0; pcb3.RunTime=0; pcb4.RunTime=0; pcb5.RunTime=0;/给PCB的要求运行时间赋值 coutendl; cout请给各个PCB的要求运行时间赋值(int):endl; cout第一个PCB pcb1.RequestTime; cout第二个PCB pcb2.RequestTime; cout第三个PCB pcb3.RequestTime; cout第四个PCB pcb4.RequestTime; cout第五个PCB pcb5.RequestTime; return 0;/使PCB连接成循环队列Connect()/PCB的前驱 pcb1.head=&pcb5; pcb2.head=&pcb1; pcb3.head=&pcb2; pcb4.head=&pcb3; pcb5.head=&pcb4;/PCB的后续 pcb1.next=&pcb2; pcb2.next=&pcb3; pcb3.next=&pcb4; pcb4.next=&pcb5; pcb5.next=&pcb1; return 0;/显示输入display() cout-endl; cout 进程名称 下一进程名 运行时间; cout 要求时间 状态endl; cout-endl; return 0;/PCB执行Run() Value(); Connect();/ struct PCB pcb1,pcb2,pcb3,pcb4,pcb5,*p,*q; char a; int num,n,PcbNum=5,Number=5,flag=1;/PcbNum表示进程执行过程中进程的个数,n表示已执行完毕的进程个数 q=NULL; /flag=1时程序继续 coutendl;coutnum; coutRequestTime=0)|(p-RequestTime=p-RunTime) /要求运行时间为0或要求运行时间运行时间时statusE p-status=E; else /否则,运行时间1 p-RunTime=p-RunTime+1; cout进程运行情况如下所示:endlendl; cout当前正在执行的进程名称为:nameendlendl; display(); while(nRequestTime=0)|(p-RequestTime=p-RunTime)/要求运行时间为0或要求运行时间运行时间时statusE p-status=E; couttnamet next-namet RunTimet RequestTime; coutt statusendl; cout-endl; coutRunTime=p-RequestTime)&(n=1)/该进程执行完毕 q=p; Number=Number-1; p=p-next;/指向下一进程 n+; PcbNum=Number; if(q!=NULL) if(q-RunTime=q-RequestTime)/有一个进程块执行完毕 q-status=E; q-head-next=q-next; q-next-head=q-head; cout-进程name已执行完毕!-endlnext; q=p; else p=p-next; if(q=NULL) p=p-next; if(PcbNum!=0) flag=0; cout-要继续运行程序请按Enter键两次-endl; a=getchar(); if(a=getchar() flag=1; else cout输入错误!endl; cout- 程序结束!-endl; flag=0; if(PcbNum=0) flag=0; cout-进程经已全部执行完毕!-endl; return 0;main() Run(); return 0;5实验结果6实验结论与总结 本实验基本达到了实验目的。 通过本次实验,我进一步熟悉了时间片轮转法进行进程调度,本次实验实现比较简单,只要实现每运行一次,运行时间加1,进行下一个进程,当运行时间达到要求服务时间时,进程运行结束,从链表中删除该进程,实验时并无太大的困难,比较简单的实现了,最后,感谢老师耐心的指导。实验二:批处理系统中作业调度1实验目的加深对作业调度算法的理解。2实验内容此实验模拟批处理系统中的作业调度,并采用响应比高者优先算法作为作业调度算法。3实验原理 实验采用最高响应比算法实现对作业的调度,响应比为作业的等待时间和作业估计执行时间之比。在不断调用进程的过程中,作业的响应比动态变化。 输入作业数量,输入作业信息,用数组储存,当达到设置的作业数量时,输入结束,依次判断每个作业是否满足条件,满足的话在进行下面的运算,在第一次作业调度时,找到到达时间最早的那个作业,输出,若不止一个最早,就调度第一个最早到达的。然后修改系统运行时间和每个作业的相关信息,用flag进行标记,当flag为0时表示作业仍未到达,当为1时,表示作业等待,flag=2时,作业调度完。执行多次操作,知道作业全部调度完为止。4实验源程序#include #include#includeusing namespace std;#define max 100 struct jcbstring name; /*作业名*/int length; /*作业长度,所需主存大小*/int printer; /*作业执行所需打印机的数量*/int tape; /*作业执行所需磁带机的数量*/int runtime; /*作业估计的执行时间*/int waittime; /*作业在输入井中的等待时间*/int reachtime;int flag;JCBmax; /*作业控制块类型定义*/int tape,printer;int memory;int n,w;static systemruntime=0;void input( )/创建进程,等待时间/执行时间响应比高 int c;n=0;cout输入作业个数:c;while(c!=0)coutJCB; coutJCBn.length; coutJCBn.printer; coutJCBn.tape; coutJCBn.reachtime; coutJCBn.runtime; JCBn.flag =0; JCBn.waittime =0; n+; c-; void judge()w=0;for(int j=0;jn;j+)if(JCBj.length=memory&JCBj.printer=printer&JCBj.tape=tape) JCB=JCB;JCBw.length=JCBj.length;JCBw.printer=JCBj.printer;JCBw.tape=JCBj.tape;JCBw.reachtime=JCBj.reachtime;JCBw.runtime=JCBj.runtime;JCBw.flag=JCBj.flag;JCBw.waittime=JCBj.waittime;w=w+1;n=w; void output() cout 作业相关信息endl; cout作业名t作业长度t打印机t磁带机t到达时间t运行时间endl;for(int i=0;in;i+)coutJCB tJCBi.length ttJCBi.printer tJCBi.tape tJCBi.reachtime ttJCBi.runtime endl;void hrrn() int waittime; int mintime;/*最早到达时间*/ int q=0; int k,i,j; int runtime; double hrrf; mintime=JCB0.reachtime ; for(i=1;in;i+)/判断最早到达的作业 if(JCBi.reachtime mintime) mintime=JCBi.reachtime ; for(i=0;in;i+) if(JCBi.reachtime =mintime) coutJCB ; JCBi.flag =2; for(j=0;jn;j+) if(j=i)continue; if(JCBj.reachtime=JCBi.reachtime +JCBi.runtime )/作业正在执行时,有作业到达 JCBj.waittime=JCBi.reachtime+JCBi.runtime-JCBj.reachtime ;/等待时间 JCBj.flag =1; runtime=JCBi.reachtime +JCBi.runtime;/系统的执行时间 break; k=1;while(kn)for(i=0;in;i+)if(JCBi.flag =1)/等待状态中的作业 hrrf=(JCBi.waittime+JCBi.runtime) /JCBi.runtime ;/i的响应比计算,i是第一个状态值为1的break; for(j=i+1;jhrrf) hrrf=(JCBj.waittime+JCBj.runtime) /JCBj.runtime; q=j; if(q!=0)/有响应比i作业的响应比高的作业 coutJCB ; JCBq.flag =2; runtime+=JCBq.runtime ; else/没有比i响应比更高的 coutJCB ; JCBi.flag =2; runtime+=JCBi.runtime ; q=0; for(i=0;in;i+) if(i=q)continue; if(JCBi.flag =2) continue; else if(JCBi.flag =1) JCBi.waittime +=JCBq.runtime ; else if(JCBi.reachtime =runtime) JCBi.flag =1; JCBi.waittime =runtime-JCBi.reachtime ; k+; void main() cout系统资源情况:endl;coutmemory; coutprinter;couttape; input();judge(); output();cout作业输出序列为:endl;hrrn();coutendl; 5实验结果6实验结论与总结 本实验基本达到了实验目的。 我所设计的本实验实现的功能比较简单,通过本实验,我进一步熟悉掌握了高响应比的算法原理,而且我设计的实验每次只处理一个作业,只要有作业执行时其他作业到达就是等待状态,由于我所实现的功能比较简单,因此在实现上也没有遇到太大的问题,一些小问题都在老师和同学的帮助下解决了,比较顺利的完成了本次实验,最后,感谢老师耐心的指导。实验三:银行家算法1实验目的和要求银行家算法是避免死锁的一种重要方法,要求编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。2实验内容1)设计进程对各类资源最大申请表示及初值确定。2)设定系统提供资源初始状况。3)设定每次某个进程对各类资源的申请表示。4)编制程序,依据银行家算法,决定其申请是否得到满足。3实验原理银行家算法 设进程I提出请求RequestN,则银行家算法按如下规则进行判断。(1)如果RequestN=NEEDI,N,则转(2);否则,出错。(2)如果RequestN=AVAILABLE,则转(3);否则,出错。(3)系统试探分配资源,修改相关数据:AVAILABLE=AVAILABLE-REQUESTALLOCATION=ALLOCATION+REQUESTNEED=NEED-REQUEST(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。3安全性检查(1)设置两个工作向量WORK=AVAILABLE;FINISHM=FALSE(2)从进程集合中找到一个满足下述条件的进程,FINISHi=FALSENEED=WORK如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。WORK=WORK+ALLOCATIONFINISH=TRUEGOTO2(4)如所有的进程FinishM=true,则表示安全;否则系统不安全。 根据题意,建立M个进程,每个进程有N个资源数,用单链表实现,初始化进程信息,编制安全序列检查函数,在主函数中判断请求是否合理,若合理进行试探性分配,调用安全序列检查函数。安全性检查时,控制循环执行的次数为M次,若有一次的序列无法分配,则退出,提示不存在安全序列。若存在,打印序列。4实验源程序#include #include #include #define M 5 /总进程数#define N 3 /总资源数/M个进程对N类资源最大资源需求量int MAXMN=7,5,3,3,2,2,9,0,2,2,2,2,4,3,3;/系统可用资源数int AVAILABLEN=3,3,2; /M个进程已经得到N类资源的资源量int ALLOCATIONMN=0,1,0,2,0,0,3,0,2,2,1,1,0,0,2;/M个进程还需要N类资源的资源量int NEEDMN=7,4,3,1,2,2,6,0,0,0,1,1,4,3,1;typedef struct sourcechar name4;/进程名int MaxN;/进程所需最大资源int AllocationN;/进程已有资源int NeedN;/进程还需资源int Finish;/是否有足够的资源分配给进程int RequestN;/进程请求资源struct source *next;source; source *head;source *input(source *head)source *p,*q;for(int i=0;iM;i+)p=new source;coutp-name; for(int j=0;jMaxj=MAXij;p-Allocationj=ALLOCATIONij;p-Needj=NEEDij;p-Finish=0;p-Requestj=0; if(i=0) head=p;/头指针指向第一个资源 else q-next=p;q=p; q-next=0;return head;/返回头指针/建立链表并给给进程赋值/资源状况的输出函数void output(source *head) source *p;p=head; cout当前各进程资源情况endl; cout-endl; cout进程t MAXt Allocationt Needt Availabletendl;cout name ; for(int i=0;iN;i+) coutMaxi ;coutt; for( i=0;iN;i+) coutAllocationi ;coutt; for( i=0;iN;i+) coutNeedi ;coutt; for( i=0;iN;i+) coutAVAILABLEi ;coutnext;p!=0;p=p-next) cout name ;for(int i=0;iN;i+) coutMaxi ;coutt; for( i=0;iN;i+) coutAllocationi ;coutt; for( i=0;iN;i+) coutNeedi ;coutt; coutendl;cout-endl;void secure(source *head,source *s) source *x,*y; int j,WorkN;/工作向量Work int flag,tt=0; cout进行安全序列检查endl; for(int i=0;iN;i+) Worki=AVAILABLEi; for(tt=0;ttFinish=1) y= y-next ;/一个进程执行完成 指针指向下一个进程 for( int i=0;iNeedinext; if(flag!=N)/可用资源小于进程所需资源 for(int i=0;iRequesti; s-Allocationi-=s-Requesti; s-Needi+=s-Requesti; cout不存在安全序列,不可分配资源endl; return; else/执行进程 coutname ; for(i=0;iAllocationi; x-Finish=1; cout存在安全序列endl; coutnext) y-Finish =0; void main()int flag1,flag2,flag3; source *p,*s;char name4;head=input(head);output(head);cout申请资源的进程名,若不需申请,输入$:name;while(strcmp(name,$)!=0)/字符比较 flag3=-1;flag1=flag2=0;p=head;while(p!=0)&(strcmp(p-name,name)!=0) p=p-next;if(p=0) cout无此进程endl; flag3=0;elses=p;coutnameendl ; cout输入所需三类资源值:endl; for(int i=0;is-Requesti; for( i=0;iRequestiNeedi) flag1+=1;/判断条件一 if(flag1!=N) coutERRORS!资源请求过大endl;for(i=0;iRequesti=0;flag3=0;flag1=0; else for( i=0;iRequesti=AVAILABLEi) flag2+=1;/判断条件二 if(flag2!=N) cout系统无足够资源endl;flag2=0; flag3=0; else/可满足请求,进行资源分配 for(i=0;iRequesti; s-Allocationi+=s-Requesti; s-Needi-=s-Requesti; flag3=1; if(flag3=1) secure(head,s); /分配后进行安全序列检测 cout申请资源的进程名,若不需申请,输入$:name;5.实验结果 6实验结论与总结本次实验基本达到了实验目的。通过本次实验,我更加深刻的掌握了新行家算法的原理和执行过程,本次实验主要的难点在于实现银行家算法的执行过程,主要是实现循环查找,使用链表实现,顺序查找,在这个程序实现时出现了一点儿问题,循环链表执行时出现了一点儿小问题,通过老师的指导和同学的帮助,逐渐解决了这个问题,但是程序只能找到一个安全序列,并不能把多个安全序列都找出来,算是基本实现了此次试验,最后感谢老师耐心的指导。实验四:主存储器空间的分配和回收1实验目的一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。2实验内容本实验模拟在两种存储管理方式下的主存分配和回收。3实验原理最先适应算法要求按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。在主函数中初始化内存分配,编写内存分配和回收函数,分配时,根据申请作业的大小和内存空间的分配情况,采用最先适应算法,找到合适的进行分配,回收作业时,若无足够的空表目登记,则退出,否则,若回收作业与空闲区上邻或下邻,要合并空闲区。4实验源程序#include#include#include#define m 5#define n 10 structint first;int length;int flag;Vblockm,Am; struct int first; int length; char name20;Cblockn,Bn;void print() cout_endl; cout 起址 长度 状态 endl; for(int i=0;im;i+) if(Vblocki.flag=1) couttVblocki.firstKttVblocki.lengthKt 未分配 endl; else if(Vblocki.flag=0) couttttt 空表目 endl; cout_endl; void request()int len,k;char name20;coutname; coutlen;for(int i=0;i=len) for(int j=0;jn;j+)if(Cblockj.length=0)break;Cblockj.first=Vblocki.first;Cblockj.length=len;strcpy(C,name);Vblocki.first+=len; Vblocki.length-=len;break; if(i=m) cout无足够空间分配,退出endl;return;if(Vblocki.length=0) for( k=i+1;km;k+) Ak.length=Vblockk.length; Ak.first=Vblockk.first; Ak.flag=Vblockk.flag; for(k=i;km-1;k+) Vblockk.first=Ak+1.first;Vblockk.length=Ak+1.length;Vblockk.flag=Ak+1.flag;Vblockm-1.first=0;Vblockm-1.length=0;Vblockm-1.flag=0;cout作业name已分配endl;void freeblock()int t=0,w=0,k,j,ww,kk;char name20;coutname;while(t!=n)&(strcmp(C,name)!=0) t+;/Cblockt为待撤销的作业if(t=n)cout无此作业,退出endl;return; for( w=0;wm;w+)if(Vblockw.flag=0) Vblockw.first=Cblockt.first;Vblockw.length=Cblockt.length;Vblockw.flag=1;ww=w;break;/Vblockw为回收的新空间if(w=m)cout无空表目登记,退出endl;return; for( k=0;kw;k+)if(Vblockw.firstVblockk.first)for(kk=k;kkw;kk+)Akk.first=Vblockkk.first; Akk.length=Vblockkk.length; Akk.flag=Vblockkk.flag;Vblockk.first=Vblockw.first; Vblockk.length=Vblockw.length;Vblockk.flag=Vblockw.flag;for(kk=k+1;kk=w;kk+)Vblockkk.first=Akk-1.first;Vblockkk.length=Akk-1.length;Vblockkk.flag=Akk-1.flag;break; for(k=0;kw;k+) if(Vblockk.first+Vblockk.length=Vblockk+1.first)Vblockk.length+=Vblockk+1.length;if(Vblockk+2.flag=0) Vblockk+1.flag=0; else for(j=k+2;j=w;j+)Aj.first=Vblockj.first;Aj.length=Vblockj.length;Aj.flag=Vblockj.flag;for(j=k+1;jw;j+) Vblockj.first=Aj+1.first;Vblockj.

温馨提示

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

评论

0/150

提交评论