广工操作系统实验报告.docx
- 文档编号:10969309
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:33
- 大小:274.12KB
广工操作系统实验报告.docx
《广工操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《广工操作系统实验报告.docx(33页珍藏版)》请在冰点文库上搜索。
广工操作系统实验报告
广工操作系统实验报告2012
操作系统实验报告
学生学院计算机学院
专业班级2011级计算机网络工程2班
学号
学生姓名
指导教师
2013年12月26日
实验一、进程调度4
实验二、作业调度8
1实验一进程调度
1、实验目的
编写并调试一个模拟的进程调度程序,采用“短进程优先”调度算法对五个进程进行调度。
以加深对进程的概念及进程调度算法的理解.
2、实验原理
在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。
对调度的处理又都可采用不同的调度方式和调度算法。
调度算法是指:
根据系统的资源分配策略所规定的资源分配算法。
短进程优先调度算法是指对短进程优先调度的算法,它是从后备队列中选择一个或者若干个进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
短进程优先调度源程序如下:
#include
#definen5
#definenum5
#definemax65535
typedefstructpro
{
intPRO_ID;//进程号
intarrive_time;//到达时间
intsum_time;//运行总时间
intflag;
}Pro;
//整数排序//选出第一个到达的进程
intbubble(inttemp[])
{
inti,j,tem=0;
for(i=1;i { intlastX=1; for(j=0;j { if(temp[j]>temp[j+1]) { tem=temp[j]; temp[j]=temp[j+1]; temp[j+1]=tem; lastX=0; } } if(lastX==1)break; } returntemp[0]; } //进程排序//选出运行时间最短的进程 Probubble(Prop[]) { inti,j; Protemp={0}; Pros[num]; for(i=0;i s[i]=p[i]; } for(i=1;i { intlastX=1; for(j=0;j { if(s[j].sum_time>s[j+1].sum_time) { temp=s[j]; s[j]=s[j+1]; s[j+1]=temp; lastX=0; } } if(lastX==1)break; } returns[0]; } voidSPF(intp) { if(n>0) { inti,j,k,l,tc=0; Proseq[n]; Protemp_seq[n]; printf("****************************************************************\n"); printf("11网络2班杜伟彦3111006325\n"); printf("\n"); printf("实验一: 短进程优先调度算法SPF\n"); printf("请依次输入5个进程的进程号、到达时间和执行时间\n");printf("****************************************************************\n"); for(i=0;i scanf("%d,%d,%d",&seq[i].PRO_ID,&seq[i].arrive_time,&seq[i].sum_time); } printf("调度顺序是: \n"); //初始化tc inttemp[num]; for(i=0;i { temp[i]=seq[i].arrive_time; } tc=bubble(temp);//tc是断点,相当把第一个到达的进程时间赋值给tc //flag表示对应i的pro的队列情况 //-1表示未进入过队列,0表示在队列,1表示被清除 for(i=0;i seq[i].flag=-1; } for(i=0;i for(j=0;j if(seq[j].flag! =1&&seq[j].arrive_time<=tc){ seq[j].flag=0; } } for(j=0;j temp_seq[j]=seq[j]; if(seq[j].flag! =0){ temp_seq[j].sum_time=max; } } l=bubble(temp_seq).PRO_ID; for(j=0;j if(l==seq[j].PRO_ID){ k=j; } } tc=tc+bubble(temp_seq).sum_time;//进程运行的总时间 seq[k].flag=1; printf("%d",l); } printf("\n"); } } voidmain() { SPF(n);//调用函数 fflush(stdin); getchar(); } 运行结果: 结果分析与实验小结 短进程优先调度适合大部分短进程,不过不适合长进程长时间运行。 一开始程序不能停止,会直接返回,后来加上fflush(stdin);getchar();问题解决了。 2实验二作业调度 1、实验目的 本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。 2、实验内容及要求 1、为单道批处理系统设计一个作业调度程序 (1)、编写并调试一个单道处理系统的作业调度模拟程序。 (2)、作业调度算法: 分别采用先来先服务(FCFS)、响应比高者优先(HRN)的调度算法。 (3)、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的CPU时限等因素。 (4)、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息: 作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。 作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。 每个作业的最初状态总是等待W。 (5)、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。 2、模拟批处理多道操作系统的作业调度 (1)、写并调试一个作业调度模拟程序。 (2)、作业调度算法: 分别采用先来先服务(FCFS)和短作业优先调度算法。 (3)、在批处理系统中,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求,所需要的资源是否得到满足。 作业调度程序负责从输入井选择若干个作业进入主存,为它们分配必要的资源,当它们能够被进程调度选中时,就可占用处理器运行。 作业调度选择一个作业的必要条件是系统中现有的尚未分配的资源可满足该作业的资源要求。 但有时系统中现有的尚未分配的资源既可满足某个作业的要求也可满足其它一些作业的要求,那么,作业调度必须按一定的算法在这些作业中作出选择。 当作业正常运行完毕或因发生错误非正常终止时,作业进入完成状态,此时,系统将收回该作业所占用的全部资源,并清除有关的JCB。 并输出显示作业运行情况及作业输出结果。 3、实验设计方案及原理 1、编写并调试一个单道处理系统的作业等待模拟程序。 假设在单道批处理环境下有四个作业JOB1、JOB2、JOB3、JOB4,已知它们进入系统的时间、估计运行时间。 分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法,计算出作业的平均周转时间和带权的平均周转时间。 对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。 4、源程序清单(需附详细的注释) #include #include #include #definegetpch(type)(type*)malloc(sizeof(type)) #definenull0 intn; floatT1=0,T2=0; inttimes=0; structjcb//作业控制块 { charname[10];//作业名 intreachtime;//作业到达时间 intstarttime;//作业开始时间 intneedtime;//作业需要运行的时间 floatsuper;//作业的响应比 intfinishtime;//作业完成时间 floatcycletime;//作业周转时间 floatcltime;//作业带权周转时间 charstate;//作业状态 structjcb*next;//结构体指针 }*ready=NULL,*p,*q; typedefstructjcbJCB; voidinital()//建立作业控制块队列,先将其排成先来先服务的模式队列 { inti; printf("\n输入作业数: "); scanf("%d",&n); for(i=0;i { p=getpch(JCB); printf("\nNo.%d输入作业名: ",i); scanf("%s",p->name); 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; } } } voidoutput(JCB*q,intj){/*显示所有作业的情况*/ JCB*pr=ready;floatf=0.0; printf("所有作业的情况: \n");//列表显示所有作业的情况 if(j==3){ printf("作业名\t\t到达时间\t所需运行间\t响应比\t\t作业状态\n");printf("%s\t\t%d\t\t%d\t\t%f\t%c\n",q->name,q->reachtime,q->needtime,q->super,q->state); while(pr){ if(pr->super<=0)printf("%s\t\t%d\t\t%d\t\t%f\t%c\n",pr->name,pr->reachtime,pr->needtime,f,pr->state); elseprintf("%s\t\t%d\t\t%d\t\t%f\t%c\n",pr->name,pr->reachtime,pr->needtime,pr->super,pr->state); pr=pr->next; } } else{ printf("作业名\t\t到达时间\t所需运行间\t作业状态\n"); printf("%s\t\t%d\t\t%d\t\t%c\t\n",q->name,q->reachtime,q->needtime,q->state); while(pr){printf("%s\t\t%d\t\t%d\t\t%c\t\n",pr->name,pr->reachtime,pr->needtime,pr->state); pr=pr->next; } } } voiddisp(JCB*q,intm)//显示作业运行后的周转时间及带权周转时间等 { if(m==3)//显示高响应比算法调度作业后的运行情况 {output(q,m); printf("\n作业%s正在运行,估计其运行情况: \n",q->name); printf("开始运行时刻\t完成时刻\t周转时间\t带权周转时间\t相应比\n\n");printf("%d\t\t%d\t\t%f\t%f\t%f\n",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带权周转时间\n\n"); printf("%d\t\t%d\t\t%f\t%f\n",q->starttime,q->finishtime,q->cycletime,q->cltime); getch(); } } voidrunning(JCB*p,intm)//运行作业 { 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->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(); } voidsuper()//计算队列中作业的高响应比 { JCB*padv; padv=ready; do{if(padv->state=='W'&&(padv->reachtime)<=times) {padv->super=(float)(times-padv->reachtime+padv->needtime)/padv->needtime; } padv=padv->next; }while(padv! =NULL); } voidfinal()//最后打印作业的平均周转时间,平均带权周转时间 { floats,t; t=T1/n; s=T2/n; getch(); printf("\n\n作业已经全部完成! "); printf("\n%d个作业的平均周转时间是: %f",n,t); printf("\n%d个作业的平均带权周转时间是%f: \n\n\n",n,s); } voidhrn(intm)//高响应比算法 { JCB*min; inti,iden; system("cls"); inital(); for(i=0;i { p=min=ready;iden=1; super();do{if(p->state=='W'&&p->reachtime<=times) if(iden) { min=p;iden=0; } elseif(p->super>min->super)min=p; p=p->next; }while(p! =NULL); running(min,m);//调用running()函数 }//for final();//调用running()函数 } voidfcfs(intm)//先来先服务算法 { inti,iden; system("cls"); inital(); for(i=0;i { p=ready;iden=1; do{ if(p->state=='W'&&p->reachtime<=times)iden=0; if(iden)p=p->next; }while(p! =NULL&&iden); if(iden) { i--;printf("\n没有满足要求的进程,需等待"); times++; if(times>100){printf("\n时间过长");getch();} } else{ running(p,m);//调用running()函数 } } final();//调用running()函数 } voidmain()//主函数 { intm; while (1){ printf("***************************************"); printf("11网络2班杜伟彦3111006325\n"); printf("实验2-作业调度系统\n"); printf("1.先来先服务算法\n"); printf("2.响应比高者优先算法\n"); printf("3.退出程序\n"); printf("***************************************\n"); printf("选择所要操作: \n"); scanf("%d",&m); switch(m)//选择所要操作 { case1: //fcfs先来先服务算法 fcfs(m); getch(); times=0; main(); break; case2: //hrn响应比高者优先算法 hrn(m); getch(); times=0; main(); break; case3: //退出程序 exit(0); default: printf("选择错误,重新选择."); getch(); system("cls"); } } } 5、程序运行结果 5.1先来先服务算法 5.2响应比高者优先算法 6、结果分析与实验小结 参考了几个作业调度的范例,作业调度实践起来并不难,但需要慢慢调试。 和同学讨论了设计思路之后就开始做了,虽然有小错误,但是经过反复调试也修正了BUG。 3实验三动态分区分配方式的模拟 1、实验目的: 了解动态分区分配方式中的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解 2、实验内容: (1)用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程和回收过程。 其中,空闲分区通过空闲分区链(表)来管理;在进行内存分配时,系统优先使用空闲区低端的空间。 (2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: •作业1申请130KB •作业2申请60KB •作业3申请100KB •作业2释放60KB •作业4申请200KB •作业3释放100KB •作业1释放130KB •作业5申请140KB •作业6申请60KB •作业7申请50KB •作业8申请60KB 请分别采用首次适应算法和最佳适应算法进行内存的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。 3、思考: 讨论各种分配算法的特点。 (1)首次适应算法。 使用该算法进行内存分配时,从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。 然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。 该算法倾向于使用内存中低地址部分的空闲分区,在高地址部分的空闲分区很少被利用,从而保留了高地址部分的大空闲区。 显然为以后到达的大作业分配大的内存空间创造了条件。 缺点在于低址部分不断被划分,留下许多难以利用、很小的空闲区,而每次查找又都从低址部分开始,这无疑会增加查找的开销。 (2)最佳适应算法。 该算法总是把既能满足要求,又是最小的空闲分区分配给作业。 为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。 这样每次找到的第一个满足要求的空闲区,必然是最优的。 孤立地看,该算法似乎是最优的,但事实上并不一定。 因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。 同时每次分配后必须重新排序,这也带来了一定的开销。 4、源程序清单(需附详细的注释) #include #include #defineFree0//空闲状态 #defineBusy1//已用状态 #defineOK1//完成 #defineERROR0//出错 #defineMAX_length640//最大内存空间为640KB typedefintStatus; typedefstructfreearea//定义一个空闲区说明表结构 { intID;//分区号 longsize;//分区大小 longaddress;//分区地址 intstate;//状态 }ElemType; //----------线性表的双向链表存储结构------------ typedefstructDuLNode//doublelinkedlist { ElemTypedata; structDuLNode*prior;//前趋指针 structDuLNode*next;//后继指
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)