2023年广工操作系统实验报告

上传人:豆*** 文档编号:165974037 上传时间:2022-10-30 格式:DOC 页数:37 大小:336KB
收藏 版权申诉 举报 下载
2023年广工操作系统实验报告_第1页
第1页 / 共37页
2023年广工操作系统实验报告_第2页
第2页 / 共37页
2023年广工操作系统实验报告_第3页
第3页 / 共37页
资源描述:

《2023年广工操作系统实验报告》由会员分享,可在线阅读,更多相关《2023年广工操作系统实验报告(37页珍藏版)》请在装配图网上搜索。

1、操作系统实验报告 学生学院 计算机学院 专业班级2023级计算机网络工程2班学 号 学生姓名 指导教师 2023年 12月 26 日目录实验一、进程调度4实验二、作业调度8实验三、动态分区分派方式的模拟15实验四、文献系统241 实验一 进程调度1、 实验目的 编写并调试一个模拟的进程调度程序,采用“短进程优先”调度算法对五个进程进行调度。以加深对进程的概念及进程调度算法的理解 2、实验原理 在多道程序系统中,一个作业被提交后必须通过解决机调度后,方能获得解决机执行。对调度的解决又都可采用不同的调度方式和调度算法。调度算法是指:根据系统的资源分派策略所规定的资源分派算法。短进程优先调度算法是指

2、对短进程优先调度的算法,它是从后备队列中选择一个或者若干个进程,将解决机分派给它,使它立即执行并一直执行到完毕,或发生某事件而被阻塞放弃解决机时再重新调度。短进程优先调度源程序如下:#include#define n 5#define num 5#define max 65535typedef struct proint PRO_ID;/进程号int arrive_time;/到达时间int sum_time;/运营总时间int flag;Pro;/整数排序 /选出第一个到达的进程 int bubble(int temp) int i,j,tem=0; for(i=1;inum;i+)int

3、lastX=1;for(j=0;jtempj+1) tem=tempj; tempj=tempj+1; tempj+1=tem; lastX=0;if(lastX=1) break;return temp0; /进程排序 /选出运营时间最短的进程 Pro bubble(Pro p) int i,j;Pro temp=0;Pro snum;for(i=0;inum;i+)si=pi;for(i=1;inum;i+)int lastX=1;for(j=0;jsj+1.sum_time) temp=sj; sj=sj+1; sj+1=temp; lastX=0;if(lastX=1) break;r

4、eturn s0; void SPF(int p)if(n0) int i,j,k,l,tc=0;Pro seqn;Pro temp_seqn;printf(*n);printf(11网络2班 杜伟彦 n); printf(n);printf(实验一:短进程优先调度算法SPFn);printf(请依次输入5个进程的进程号、到达时间和执行时间n);printf(*n); for(i=0;in;i+) scanf(%d,%d,%d,&seqi.PRO_ID,&seqi.arrive_time,&seqi.sum_time);printf(调度顺序是:n);/初始化tcint tempnum;for

5、(i=0;inum;i+) tempi=seqi.arrive_time;tc=bubble(temp);/tc是断点,相称把第一个到达的进程时间赋值给tc/flag 表达相应i的pro的队列情况/-1表达未进入过队列,0表达在队列,1表达被清除for(i=0;in;i+)seqi.flag=-1; for(i=0;in;i+) for(j=0;jn;j+) if(seqj.flag!=1&seqj.arrive_time=tc) seqj.flag=0; for(j=0;jn;j+) temp_seqj=seqj; if(seqj.flag!=0) temp_seqj.sum_time=ma

6、x; l=bubble(temp_seq).PRO_ID;for(j=0;jn;j+)if(l=seqj.PRO_ID)k=j; tc=tc+bubble(temp_seq).sum_time;/进程运营的总时间 seqk.flag=1; printf(%d,l);printf(n);void main()SPF(n);/调用函数fflush(stdin);getchar();运营结果:结果分析与实验小结短进程优先调度适合大部分短进程,但是不适合长进程长时间运营。一开始程序不能停止,会直接返回,后来加上fflush(stdin);getchar();问题解决了。2 实验二 作业调度1、实验目的

7、本实验规定学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。2、实验内容及规定 1、为单道批解决系统设计一个作业调度程序(1)、编写并调试一个单道解决系统的作业调度模拟程序。(2)、作业调度算法:分别采用先来先服务(FCFS)、响应比高者优先(HRN)的调度算法。 (3)、由于在单道批解决系统中,作业一投入运营,它就占有计算机的一切资源直到作业完毕为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。(4)、每个作业由一个作业控制块JCB表达,JCB可以包含如下信息:作业名、提交

8、时间、所需的运营时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待W(Wait)、运营R(Run)和完毕F(Finish)三种状态之一。每个作业的最初状态总是等待W。(5)、对每种调度算法都规定打印每个作业开始运营时刻、完毕时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺陷。2、模拟批解决多道操作系统的作业调度(1)、写并调试一个作业调度模拟程序。(2)、作业调度算法:分别采用先来先服务(FCFS)和短作业优先调度算法。(3)、在批解决系统中,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源规定,所需要的资源是否得到

9、满足。作业调度程序负责从输入井选择若干个作业进入主存,为它们分派必要的资源,当它们可以被进程调度选中时,就可占用解决器运营。作业调度选择一个作业的必要条件是系统中现有的尚未分派的资源可满足该作业的资源规定。但有时系统中现有的尚未分派的资源既可满足某个作业的规定也可满足其它一些作业的规定,那么,作业调度必须按一定的算法在这些作业中作出选择。当作业正常运营完毕或因发生错误非正常终止时,作业进入完毕状态,此时,系统将收回该作业所占用的所有资源,并清除有关的JCB。并输出显示作业运营情况及作业输出结果。3、实验设计方案及原理1、编写并调试一个单道解决系统的作业等待模拟程序。 假设在单道批解决环境下有四

10、个作业JOB1、JOB2、JOB3、JOB4,已知它们进入系统的时间、估计运营时间。分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法,计算出作业的平均周转时间和带权的平均周转时间 。 对每种调度算法都规定打印每个作业开始运营时刻、完毕时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺陷。4、源程序清单(需附具体的注释)#include #include #include #define getpch(type) (type*)malloc(sizeof(type) #define null 0int n;f

11、loat T1=0,T2=0;int times=0;struct jcb /作业控制块 char name10; /作业名 int reachtime; /作业到达时间 int starttime; /作业开始时间 int needtime; /作业需要运营的时间 float super; /作业的响应比 int finishtime; /作业完毕时间 float cycletime; /作业周转时间 float cltime; /作业带权周转时间 char state; /作业状态 struct jcb *next; /结构体指针*ready=NULL,*p,*q;typedef stru

12、ct jcb JCB; void inital() /建立作业控制块队列,先将其排成先来先服务的模式队列int i;printf(n输入作业数:);scanf(%d,&n);for(i=0;iname); getch(); p-reachtime=i; printf(作业默认到达时间:%d,i); printf(n输入作业要运营的时间:); scanf(%d,&p-needtime); p-state=W; p-next=NULL; if(ready=NULL) ready=q=p; else q-next=p; q=p; void output(JCB* q,int j) /*显示所有作业的

13、情况*/ JCB *pr=ready;float f=0.0; printf(所有作业的情况: n);/列表显示所有作业的情况 if(j=3) printf(作业名tt到达时间t所需运营间t响应比tt作业状态n); printf(%stt%dtt%dtt%ft%cn, q-name,q-reachtime,q-needtime,q-super,q-state); while(pr) if(pr-supername,pr-reachtime,pr-needtime,f,pr-state); else printf(%stt%dtt%dtt%ft%cn, pr-name,pr-reachtime,

14、pr-needtime,pr-super,pr-state); pr = pr-next; else printf(作业名tt到达时间t所需运营间t作业状态n); printf(%stt%dtt%dtt%ctn, q-name,q-reachtime,q-needtime,q-state); while(pr) printf(%stt%dtt%dtt%ctn, pr-name,pr-reachtime,pr-needtime,pr-state); pr = pr-next; void disp(JCB* q,int m) /显示作业运营后的周转时间及带权周转时间等 if(m=3) /显示高响应

15、比算法调度作业后的运营情况 output(q,m); printf(n作业%s正在运营,估计其运营情况:n,q-name); printf(开始运营时刻t完毕时刻t周转时间t带权周转时间t相应比nn); printf(%dtt%dtt%ft%ft%fn,q-starttime,q-finishtime,q-cycletime,q-cltime,q-super); getch(); else / 显示先来先服务,最短作业优先算法调度后作业的运营情况 output(q,m); printf(n作业%s正在运营,估计其运营情况:n,q-name); printf(开始运营时刻t完毕时刻t周转时间t带

16、权周转时间nn); printf(%dtt%dtt%ft%fn,q-starttime,q-finishtime,q-cycletime,q-cltime); getch(); void running(JCB *p,int m) /运营作业 if(p=ready) /先将要运营的作业从队列中分离出来 ready=p-next; p-next=NULL; else q=ready; while(q-next!=p) q=q-next; q-next=p-next; p-starttime=times; /计算作业运营后的完毕时间,周转时间等等 p-state=R; p-finishtime=p

17、-starttime+p-needtime; p-cycletime=(float)(p-finishtime-p-reachtime); p-cltime=(float)(p-cycletime/p-needtime); T1+=p-cycletime; T2+=p-cltime; disp(p,m); /调用disp()函数,显示作业运营情况 times+=p-needtime; p-state=F; printf(n作业%s已经完毕!n请输入任意键继续.n,p-name); free(p); /释放运营后的作业 getch();void super() /计算队列中作业的高响应比 JCB

18、 *padv; padv=ready;do if(padv-state=W&(padv-reachtime)super=(float)(times-padv-reachtime+padv-needtime)/padv-needtime; padv=padv-next; while(padv!=NULL);void final() /最后打印作业的平均周转时间,平均带权周转时间 float s,t; t=T1/n; s=T2/n; getch(); printf(nn作业已经所有完毕!); printf(n%d个作业的平均周转时间是:%f,n,t); printf(n%d个作业的平均带权周转时间

19、是%f:nnn,n,s); void hrn(int m) /高响应比算法 JCB *min; int i,iden; system(cls); inital(); for(i=0;istate=W&p-reachtimesupermin-super) min=p; p=p-next; while(p!=NULL);running(min,m); /调用running()函数 /for final(); /调用running()函数void fcfs(int m) /先来先服务算法 int i,iden; system(cls); inital(); for(i=0;istate=W&p-re

20、achtimenext; while(p!=NULL&iden) ; if(iden) i-;printf(n没有满足规定的进程,需等待); times+; if(times100)printf(n时间过长);getch(); else running(p,m); /调用running()函数 final(); /调用running()函数 void main() /主函数 int m; while(1) printf(*); printf(11网络2班 杜伟彦 n); printf(实验2-作业调度系统n); printf(1.先来先服务算法n); printf(2.响应比高者优先算法n);

21、 printf(3.退出程序n); printf(*n); printf(选择所要操作:n); scanf(%d,&m); switch(m)/选择所要操作 case 1:/fcfs先来先服务算法 fcfs(m); getch(); times=0; main(); break; case 2:/hrn响应比高者优先算法 hrn(m); getch(); times=0; main(); break; case 3:/退出程序 exit(0); default: printf(选择错误,重新选择.); getch(); system(cls); 5、程序运营结果5.1先来先服务算法 5.2响应

22、比高者优先算法 6、结果分析与实验小结 参考了几个作业调度的范例,作业调度实践起来并不难,但需要慢慢调试。和同学讨论了设计思绪之后就开始做了,虽然有小错误,但是通过反复调试也修正了BUG。3 实验三 动态分区分派方式的模拟1、实验目的:了解动态分区分派方式中的数据结构和分派算法,并进一步加深对动态分区存储管理方式及其实现过程的理解2、实验内容:(1)用C语言分别实现采用初次适应算法和最佳适应算法的动态分区分派过程和回收过程。其中,空闲分区通过空闲分区链(表)来管理;在进行内存分派时,系统优先使用空闲区低端的空间。(2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:作业1申请1

23、30KB作业2申请60KB作业3申请100KB作业2释放60KB作业4申请200KB作业3释放100KB作业1释放130KB作业5申请140KB作业6申请60KB作业7申请50KB作业8申请60KB请分别采用初次适应算法和最佳适应算法进行内存的分派和回收,规定每次分派和回收后显示出空闲内存分区链的情况。3、思考:讨论各种分派算法的特点。(1) 初次适应算法。使用该算法进行内存分派时,从空闲分区链首开始查找,直至找到一个能满足其大小规定的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分派给请求者,余下的空闲分区仍留在空闲分区链中。该算法倾向于使用内存中低地址部分的空闲分区,在高地址部

24、分的空闲分区很少被运用,从而保存了高地址部分的大空闲区。显然为以后到达的大作业分派大的内存空间发明了条件。缺陷在于低址部分不断被划分,留下许多难以运用、很小的空闲区,而每次查找又都从低址部分开始,这无疑会增长查找的开销。(2) 最佳适应算法。该算法总是把既能满足规定,又是最小的空闲分区分派给作业。为了加速查找,该算法规定将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足规定的空闲区,必然是最优的。孤立地看,该算法似乎是最优的,但事实上并不一定。由于每次分派后剩余的空间一定是最小的,在存储器中将留下许多难以运用的小空闲区。同时每次分派后必须重新排序,这也带来了一定的

25、开销。4、源程序清单(需附具体的注释) #include#include #define Free 0 /空闲状态#define Busy 1 /已用状态#define OK 1 /完毕#define ERROR 0 /犯错#define MAX_length 640 /最大内存空间为640KBtypedef int Status; typedef struct freearea/定义一个空闲区说明表结构int ID; /分区号long size; /分区大小long address; /分区地址int state; /状态ElemType; /- 线性表的双向链表存储结构 -typedef

26、struct DuLNode /double linked listElemType data; struct DuLNode *prior; /前趋指针struct DuLNode *next; /后继指针DuLNode,*DuLinkList; DuLinkList block_first; /头结点DuLinkList block_last; /尾结点 Status alloc(int);/内存分派Status free(int); /内存回收Status First_fit(int,int);/初次适应算法Status Best_fit(int,int); /最佳适应算法void sh

27、ow();/查看分派Status Initblock();/开创空间表 Status Initblock()/开创带头结点的内存空间链表block_first=(DuLinkList)malloc(sizeof(DuLNode);block_last=(DuLinkList)malloc(sizeof(DuLNode);block_first-prior=NULL;block_first-next=block_last;block_last-prior=block_first;block_last-next=NULL;block_last-data.address=0;block_last-d

28、ata.size=MAX_length;block_last-data.ID=0;block_last-data.state=Free;return OK; /- 分 配 主 存 -Status alloc(int ch)int ID,request;coutID;coutrequest;if(request0 |request=0) cout分派大小不合适,请重试!endl;return ERROR; if(ch=2) /选择最佳适应算法if(Best_fit(ID,request)=OK) cout分派成功!endl;else cout内存局限性,分派失败!endl;return OK;e

29、lse /默认初次适应算法if(First_fit(ID,request)=OK) cout分派成功!endl;else cout内存局限性,分派失败!data.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;return OK;break;if(p-data.state=Free & p-data

30、.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.address+temp-data.size;p-data.size-=request;return OK;break;p=p-next;return ERROR;/- 最佳适应算法 -Status Best_fit(int ID,int request)int ch; /记录最小剩余空间DuLink

31、List temp=(DuLinkList)malloc(sizeof(DuLNode); temp-data.ID=ID; temp-data.size=request;temp-data.state=Busy;DuLNode *p=block_first-next;DuLNode *q=NULL; /记录最佳插入位置while(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)i

32、f(p-data.state=Free & p-data.size=request)/空闲块大小恰好合适p-data.ID=ID;p-data.state=Busy;return OK;break;if(p-data.state=Free & p-data.sizerequest)/空闲块大于分派需求if(p-data.size-requestdata.size-request;/更新剩余最小值q=p;/更新最佳位置指向p=p-next;if(q=NULL) return ERROR;/没有找到空闲块else/找到了最佳位置并实现分派temp-prior=q-prior;temp-next=q

33、;temp-data.address=q-data.address;q-prior-next=temp;q-prior=temp;q-data.address+=request;q-data.size=ch;return OK; /- 主 存 回 收 -Status free(int ID)DuLNode *p=block_first;while(p)if(p-data.ID=ID)p-data.state=Free;p-data.ID=Free;if(p-prior-data.state=Free)/与前面的空闲块相连p-prior-data.size+=p-data.size;p-prio

34、r-next=p-next;p-next-prior=p-prior;if(p-next-data.state=Free)/与后面的空闲块相连 p-data.size+=p-next-data.size;p-next-next-prior=p;p-next=p-next-next;break;p=p-next;return OK; /- 显示主存分派情况 -void show()cout+n;cout+ 主 存 分 配 情 况 +n;coutnext;while(p)coutdata.ID=Free) coutFreeendl;else coutdata.IDendl;cout起始地址:dat

35、a.addressendl;cout分区大小:data.size KBendl;coutdata.state=Free) cout空 闲endl;else cout已分派endl;cout-next; /- 主 函 数-void main()int ch;/算法选择标记cout11网络工程2班 杜伟彦 n;cout 实验三 n;cout 动态分区分派方式的模拟 n;cout 1初次适应算法n;cout 2最佳适应算法n;coutch;Initblock(); /开创空间表int choice; /操作选择标记while(1) cout* 1: 分派内存 n;cout* 2: 回收内存 n;co

36、ut* 3: 查看分派 n; cout* 0: 退 出 n; coutchoice;if(choice=1) alloc(ch); / 分派内存else if(choice=2) / 内存回收int ID;coutID;free(ID);else if(choice=3) show();/显示主存else if(choice=0) break; /退出else /输入操作有误cout输入有误,请重试!endl;continue;5、 程序运营结果初次适应算法:6、结果分析与实验小结 本次实验比较难,初次最佳适应算法和对已分派分区的释放原理比较繁琐,这里同样采用双链表指针操作结构体来存储已分派分区。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!