广工操作系统实验报告.docx

上传人:夺命阿水 文档编号:947811 上传时间:2024-01-23 格式:DOCX 页数:21 大小:64.04KB
返回 下载 相关 举报
广工操作系统实验报告.docx_第1页
第1页 / 共21页
广工操作系统实验报告.docx_第2页
第2页 / 共21页
广工操作系统实验报告.docx_第3页
第3页 / 共21页
广工操作系统实验报告.docx_第4页
第4页 / 共21页
广工操作系统实验报告.docx_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《广工操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《广工操作系统实验报告.docx(21页珍藏版)》请在课桌文档上搜索。

1、操作系统实验报告学生学院计算机学院专业班级计科8班学号学生姓名指导教师2023年12月29日目录1实验一进程调度52实验二作业调度93实验三可变式分区分配184实验四简单文件系统26实验一进程调度一、实验目的编写并调试一个模拟的进程调度程序,采用“短进程优先调度算法对五个进程进行调度。以加深对进程的概念及进程调度算法的理解.二、实验内容及要求编写并调试一个模拟的进程调度程序,采用“短进程优先调度算法对五个进程进行调度。三、实验设计方案及原理在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。对调度的处理又都可采用不同的调度方式和调度算法。调度算法是指:根据系统的资源分配

2、策略所规定的资源分配算法。短进程优先调度算法是指对短进程优先调度的算法,它是从后备队列中选择个或者假设干个进程,将处理机分配给它,使它立即执行并-直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。四、重要数据结构或源程序中疑难局部的说明,需附详细注释#includestdio.h#include#include#definegetpch(type)(type*)malloc(sizeof(typc)#defineNULLOstructpcb*定义进程控制块PCB*/charname10;进程名charstate;/状态intsuper;优先数intntime;需要运行时间intrtim

3、e;运行时间structpcb*link;)*ready=NULL,*p;typedefstructpcbPCB;intnum;sort()/*建立对进程进行短进程优先排列函数*/PCB*first,*second;intinsert=0;if(ready=NULL)(pntime)ntime)/*需要运行时间最小者,插入队首*/(p-link=ready;ready=p;else/*进程比拟需要运行时间,插入适当的位置中*/(first=ready;second=first-link;While(SecondI=NLJLL)(if(p-ntime)ntime)/*假设插入进程比当前进程需要运

4、行时间小,*/*插入到当前进程前面*/p-link=second;first-link=p;Second=NULL;insert=1;)else/*插入进程需要运行时间最大,那么插入到队尾*/(first=first-Iink;second=second-link;)if(insert=O)first-link=p;1voidinput()/*建立进程控制块函数*/inti;/clrscr();/*清屏*/printf(n请输入进程数scanf(%d,(fcnum);fbr(i=O;iname);printf(n输入进程需要运行时间门;scanf(%d,ntime);printf(n);p-r

5、time=O;p-state=w;p-link=NULL;sort();/*调用sort函数水/)voidmain()户主函数*/(inti,len,h=0;charch;input();ch=getchar();Printfen调度序列为:);p=ready;fbr(i=num;iO;i-)printf(%s,p-name);p=p-link;printf(nn进程已经完成.n);ch=getchar();1五、程序运行结果七、结果分析与实验小结结果正确。短进程优先需要把进程按左右运行时间排序,然后让其按顺序执行即可。实验二作业调度一、实验目的:用高级语言编写和调试一个或多个作业调度的模拟程

6、序,以加深对作业调度算法的理解。二、实验内容:1 .写并调试一个单道处理系统的作业等待模拟程序。2 .作业等待算法:分别采用先来先效劳(FCFS),响应比高者优先(HRN)的调度算法。3 .由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。4 .每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待W(Wait)、运行R(RUn)和完成F(FiniSh)三种状态之一。每个作业的最初状态总是等待

7、W。5 .对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。5、重要数据结构或源程序中疑难局部的说明,需附详细注释三、实验设计方案及原理编写一个程序将输入的进程按其提交时间进行排列,按排列顺序进行调度,计算其开始时间、完成时间、周转时间等数值四、重要数据结构或源程序中疑难局部的说明,需附详细注释先来先效劳#include*stdio.h*#include#includeedefinegetpch(type)(type*)malIoc(sizeof(type)ttdefineNULLOstructpcb*定义进程控制块P

8、CB*/charname10;进程名charstate;状态intsuper;优先数intntime;需要运行时间intrtime;运行时间intctime;提交时间intstime;开始时间intftime;完成时间intttime;周转时间floatdtime,带权周转时间structpcb*link;)*ready=NULL,*p:typedefstructpcbPCB;intnum;voidsort()*建立对进程先来先效劳排列函数*/PCB*first,*second;intinsert=0;if(ready=NULL)|(p-ctime)ctime)/*到达时间最小者,插入队首*/

9、(p-link=ready;ready=p;else/*进程比拟到达时间,插入适当的位置中*/first=ready;second=first-link:whiIe(second!=NULL)if(p-ctime)ctime)*假设插入进程比当前进程到达时间小,*/*插入到当前进程前面*/p-link=second;first-link=p;Second=NULL;insert=1;)else/*插入进程到达时间最大,那么插入到队尾*/(first=first-link;second=second-link:)if(insert=O)first-link=p;)voidinput()*建立进程

10、控制块函数*/(inti;/clrscr();/*清屏*/printf(*n请输入进程数:”);scanf(*%d*,&num);for(i=0;iname);printf(*11输入提交时间:”);scanf(*%d*,p-ctime):printf(11输入进程需要运行时间:”);scanf(*%d*,p-ntime);printf(*n*);p-rtime=O;p-state=,w,;p-Iink=NULL;sort();/调用SOrt函数*/)voidmain()/*主函数*/PCB*first,*second;i11ti,x,y;floatsI=Ots2=0;charch;input

11、();ch=getchar();输出Printf(进程名t开始时间t完成时间t周转时间t带权周转时间n);second=ready;first=ready;first-ftime=O;for(i=num;i0:i)if(second-ctimefirst-ftime)/*计算完成时间,周转时间等*/second-stime=second-ctime:elsesecond-stime=first-ftime;second-ftime=(second-ntime)+(second-stime);second-ttime=(second-ftime)-(second-ctime);x=second-

12、ttime;y=second-ntime;second-dtime=(float)x/(float)y;printf(%st%dt%dt%dt%fn*,second-name,second-stime,second-ftime,second-ttime,second-dtime);sl=sl+second-ttime;s2=s2+second-dtime;if(second-link!=NULL)first=second;second=second-link:)sl=slnum;s2=s2num;Printf(n平均周转时间=%fn”,si);Printfe平均周转时间=%fnn”,s2);P

13、rintf(按任意键结束”);ch=getchar();)响应比includeinclude#include#definegetpch(type)(type*)malIoc(sizeof(type)ttdefinenullOintn;floatTl=O,T2=0;inttimes=0;structjeb作业控制块charname10;作业名intctime;作业到达时间intstime;作业开始时间intntime;作业豳要运行的时间floatsuper;作业的响应比intftime:作业完成时间floatttime:作业周转时间floatdtime;作业带权周转时间charstate;作业状

14、态structjcb*next;结构体指针*ready=NULL,*p,*q;typedefstructjcbJCB;voidinital()建立作业控制块队列,先将其排成先来先效劳的模式队列inti:Printf(n输入作业数:”);scanf(*%d*l&n):for(i=0;iname);Printf(n输入作业到达时间:”);scanf(*%d*,p-ctime);Printf(n输入作业需要运行的时间:”);scanf(*%d*,p-ntime);p-state=jW;p-next=NULL;if(ready=NULL)ready=q=p;elseq-next=p;q=p;)void

15、output(JCB*q)*显示所有作业的情况*/JCB*pr=readyjfloatf=0.O;Printf(所有作业的情况:n);列表显示所有作业的情况Printf(作业名tt到达时间t所需运行间t响应比tt作业状态n);printf(*%stt%dtt%dtt%ft%cn*,q-name,q-ctime,q-ntime,q-super,q-state);while(pr)(if(pr-supername,pr-ctime,pr-ntime,f,pr-state);elseprintf(*%stt%dtt%dtt%ft%cn*,pr-name,pr-ctime,pr-ntime,pr-su

16、per,pr-state);pr=pr-next;)voiddisp(JCB*q)显示作业运行后的周转时间及带权周转时间等/显示高响应比算法调度作业后的运行情况output(q);Printf(n作业%s正在运行,估计其运行情况:n*,q-name);Printf(开始运行时刻t完成时刻t周转时间t带权周转时间t相应比nn);printf(*%dtt%dtt%ft%ft%fn*,q-stimelq-ftime,q-ttime,q-dtime,q-super);getchar();)voidrunning(JCB*p)运行作业(if(p=ready)先将要运行的作业从队列中别离出来(ready=

17、p-next;p-next=NULL;)elseq=ready;while(q-next!=p)q=q-next;q-next=p-next;)p-stime=times;计算作业运行后的完成时间,周转时间等等p-state=*R,:p-ftime=p-stime+p-ntime;p-ttime=(float)(p-ftime-p-ctime);p-dtime=(float)(p-ttimep-ntime);Tl+=p-ttime;T2+=p-dtime;disp(p);调用disp()函数,显示作业运行情况times+=p-ntime;p-state=*F,:Printf(n作业%s已经完成

18、!n请输入任意键继续n”,p-name);free(p);释放运行后的作业getchar();)voidsuper()计算队列中作业的高响应比JCB*padv;padv=ready;doif(padv-state=*W&(PadV-ctime)super=(float)(times-padv-ctime+padv-ntime)padv-ntime;)padv=padv-next;whiIe(padv!=NULL);)voidfinal()最后打印作业的平均周转时间,平均带权周转时间floats,t;t=Tln;s=T2n;getcharO:printf(nn作业已经全部完成!”);Printf

19、(n%d个作业的平均周转时间是:%,n,t);Printf(n%d个作业的平均带权周转时间是%f:nnn*,n,s);)voidhrn()高响应比算法JCB*min;inti,iden;system(*cls*);inital();for(i=0;istate=jW,Ap-ctimesupermin-super)min=p;p=p-next;whiIe(p!=NULL);running(min);调用running。函数)final();调用running。函数)voidmain()主函数(hrn();getchar();Printf(按回车结束n);getchar();/SyStem(cis

20、);五、程序运行结果七、结果分析与实验小结实验三动态分区分配方式的模拟一、实验目的:了解动态分区分配方式中的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解二、实验内容:(1)用C语言分别实现采用首次适应算法和最正确适应算法的动态分区分配过程和回收过程。其中,空闲分区通过空闲分区链(表)来管理;在进行内存分配时,系统优先使用空闲区低端的空间。(2)假设初始状态下,可用的内存空间为640KB,并有以下的请求序列: 作业1申请130KB 作业2申请60KB 作业3申请100KB 作业2释放60KB 作业4申请200KB 作业3释放100KB 作业1释放130KB 作业5申请

21、140KB 作业6申请60KB 作业7申请50KB 作业8申请60KB请分别采用首次适应算法和最正确适应算法进行内存的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。三、实验设计方案及原理首次适应算法:使用该算法进行内存分配时,从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。最正确适应算法:该算法总是把既能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优

22、的。孤立地看,该算法似乎是最优的,但事实上并不一定。因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。同时每次分配后必须重新排序,这也带来了一定的开销。五、重要数据结构或源程序中疑难局部的说明,需附详细注释include*stdio.h*#includeeincludettdefineFree0空闲状态ItdefineBusy1已用状态defineOK1完成defineERROR0出错ttdefineMAX_length640最大内存空间为KBtypedefintStatus;typedefstructfreearea定义一个空闲区说明表结构(intID;分区号lo

23、ngsize;分区大小longaddress;分区地址intstate;/状态ElemType;/线性表的双向链表存储结构typedefstructDuLNode/double1inkedlistElemTypedata:structDuLNode*prior;前趋指针structDuLNode*next;后继指针DuLNode,*DuLinkList;DuLinkListblockfirst;头结点DuLinkListblocklast;尾结点Statusalloc(int);内存分配Statusfree(int);内存回收StatusFirstfit(int,int);首次适应算法Stat

24、usBestfit(int,int);/最正确适应算法voidShoW();查看分配StatusInitbIOCk();开创空间表StatusInitbloCk()/开创带头结点的内存空间链表(blockfirst=(DuLinkList)malloc(sizeof(DuLNode);blocklast=(DuLinkList)malIoc(sizeof(DuLNode);blockfirst-prior=NULL;blockfirst-next=blocklast;blocklast-prior=blockfirst;blocklast-next=NULL;blocklast-data.ad

25、dress=O;blocklast-data.size=MAXlength;blocklast-data.ID=O;blocklast-data.State=Free;returnOK;)/分配主存StatusalIoc(charch)intID=O1request=O;Printf(请输入作业(分区号):”);scanf-s(*%d*,&ID);Printf(请输入需要分配的主存大小(单位:KB):);scanf-s(*%d*,&request);if(requestdata.ID=ID;temp-data.size=request;temp-data.State=Busy;DuLNode*

26、p=blockfirst-next;while(p)(if(p-data.State=Free&p-data.size=request)有大小恰好适宜的空闲块p-data.State=Busy;p-data.ID=ID;returnOK;break;)if(p-data.State=Free&p-data.sizerequest)有空闲块能满足需求且有剩余”temp-prior=p-prior;temp-next=p;temp-data.address=p-data.address;p-prior-next=temp;p-prior=temp;p-data.address=temp-data.

27、address+temp-data.size;p-data.size-=request;returnOK;break;)p=p-next;)returnERROR;)/最正确适应算法StatusBest_fit(intID,intrequest)intch;记录最小剩余空间DuLinkListtemp=(DuLinkList)malIoc(sizeof(DuLNode);temp-data.ID=ID;temp-data.size=request;temp-data.State=Busy;DuLNode*p=blockfirst-next;DuLNode*q=NULL;记录最正确插入位置whi

28、le(p)/初始化最小空间和最正确位置if(p-data.State=Free&(p-data.sizerequest|p-data.size=request)(q=p;ch=p-data.size-request;break;)p=p-next;)while(p)(if(p-data.State=Free&p-data.size=request)空闲块大小恰好适宜p-data.ID=ID;p-data.State=Busy;returnOK;break;)if(p-data.State=Free&p-data.sizerequest)空闲块大于分配需求if(p-data.size-reque

29、stdata.Size-request;更新剩余最小值q=P;更新最正确位置指向)p=p-next;)if(q=NULL)returnERROR:没有找到空闲块else找到了最正确位置并实现分配temp-prior=q-prior;temp-next=q;temp-data.address=q-data.address;q-prior-next=temp:q-prior=temp;q-data.address+=request;q-data.size=ch;returnOK;)/主存回收Statusfree(intID)DuLNode*p=blockfirst;while(p)(if(p-da

30、ta.ID=ID)p-data.State=Free;p-data.ID=Free;if(p-prior-data.State=Free)与前面的空闲块相连(p-prior-data.size+=p-data.size;p-prior-next=p-next;p-next-prior=p-prior;)if(p-next-data.State=Free)与后面的空闲块相连(p-data.size+=p-next-data.size;if(p-next-next!=NULL)p-next-next-prior=p;p-next=p-next-next;)break;)p=p-next;)retu

31、rnOK;)/显示主存分配情况voidshow()(printf(+n”);Printf(+主存分配情况+n”);Printf(+n”);DuLNode*p=blockfirst-next;while(p)Printf(分区号:”);if(p-data.ID=Free)printf(*Freen*);elseprintf(*%dn*,p-data.ID):Printf(起始地址:%dn*,p-data.address);Printf(分区大小:%dKBn*,p-data.size);Printf(状态:);if(p-data.State=Free)Printf(空闲n);elsePrintf(

32、已分配Vr);printf(*n);p=p-next;/主函数voidmain()charch;算法选择标记Printf(请选择分配算法:n);Printf(1首次适应算法n);printf(*2最正确适应算法n);ch=getchar();InitblockO;开创空间表charchoice;操作选择标记whiIe(I)printf(*printf(*printf(*1:分配内存2:回收内存3:查看分配n);2n);printf(*0:退出n);Printf(请输入您的操作:“);scanfs(*%d*,&choice);if(choice=l)alloc(ch);/分配内存elseif(c

33、hoice=2)/内存回收intID:Printf(请输入您要释放的分区号:“);SCanf_s(%d”,&ID);free(ID);)elseif(choice=3)ShOW();显示主存elseif(choice=0)break;退出else输入操作有误(Printf(输入有误,请重试!n):continue;)六、程序运行结果分配前三个空间首次适应算法最后结果七、结果分析与实验小结释放2后最正确适应算法最后结果实验四文件管理一、 实验目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。二、 预习与参考:教材中文件系统的相关

34、知识。三、 实验要求(设计要求)1.要求设计一个n个用户的文件系统,文件目录采用两级结构;2 .对文件必须设置保护措施;3 .至少有Create、deleteopen、close、read、Write等命令。四、调试及结果测试:实现对文件的Create、delete、open、close、read、Write操作。五、重要数据结构或源程序中疑难局部的说明,需附详细注释#include,stdio.h#include#include#defineFree0空闲状态#defineBUSyl己用状态#defineOK1完成#defineERRoRO/出错#defineMAX_length640最大内

35、存空间为640KBtypedefintStatus;typedefstructfreearea/定义个空闲区说明表结构intID;分区号longsize;分区大小longaddress;分区地址intstate;状态(ElemType;/线性表的双向链表存储结构typedefstructDuLNode/doublelinkedlist(ElemTypedata;structDuLNode*prior;/前趋指针structDuLNode*next;后继指针IDuLNode,*DuLinkList;DuLinkListblock_first;头结点DULinkLiStbloCkast;尾结点St

36、atusalloc(int);/内存分配Statusfree(int);内存回收StatusFirSLfit(int,int);/首次适应算法StatusBeSLfit(int,int);最正确适应算法voidShOW();查看分配StatusInitbloCk();开创空间表StatusInitblOCk()开创带头结点的内存空间链表block-first=(DuLinkList)malloc(sizeof(DuLNoprior=NULL;block_first-next=block_last;blockast-prior=block_first;block-last-next=NULL;b

37、lock-last-data.address=0;block_last-data.size=MAX_length;block_last-data.ID=0;blockast-data.state=Free;returnOK;/分配主存Statusalloc(charch)intID=Ojequest=O;Printf(”请输入作业(分区号scanfls(%dID);PrintfC请输入需要分配的主存大小(单位:KB):”);scanf_s(n%du,&request);if(requestdata.ID=ID;temp-data.size=request;temp-data.state=Busy;DuLNode*p=block_first-next;while(p)(if(p-data.state=Free&p-data.size=request)有大小恰好适宜的空闲块p-data.state=Busy;p-data.ID=ID;returnOK;break;if(p-data.state=Free&p-data.sizerequest)有空闲块能满足需求且有剩余”temp-prior=p-prior;temp-next=p;temp-data.address=p-data.address;p-prior-next=temp;p-p

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号