您好,欢迎访问三七文档
淮海工学院计算机工程学院实验报告书课程名:操作系统原理A题目:进程调度班级:计算机142学号:2014122793姓名:刘娜评语:成绩:指导教师:批阅时间:年月日一、目的与要求进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用Java或C/C++语言编写一个进程调度模拟程序,至少使用先来先服务、短进程优先、最高优先权优先或时间片轮转法四种算法中的两种算法来实现进程调度。通过本实验可加深对进程调度算法的理解。二、实验内容1、设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。2、模拟调度程序至少使用先来先服务、短进程优先、最高优先权优先或时间片轮转法四种算法中的两种算法来实现进程调度。3、程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。三、实验步骤1.先来先服务开始p=headi=0p-status==’j’q=pp=p-nextp=p-nextp-atimet?t=p1-atimet+=p1-stime………..t+=p1-stime………..输出结果结束《大型数据库系统概论》实验报告-2-2.短进程优先开始输入nintin,j=iki+tp[i].atimep[j].atimePcbtemp1;temp1=p[i];p[i]=p[j];p[j]=temp1;i++,j++p[j].atime=p[i].ftimet++min=p[i+1].stimep[k+1].stimeminmin=p[k+1].stime;x=k+1pcbtemp2;temp2=p[i+1];p[i+1]=p[x];p[x]=temp2;i==0i++《大型数据库系统概论》实验报告-3-四、测试数据与实验结果(可以抓图粘贴)1.先来先服务#includestdio.h#includestdlib.htypedefstructPCB{charname[8];//进程名charstatus;//运行状态intatime;//到达时间intstime;//服务时间intsttime;//开始时间intftime;//结束时间floatz;//周转时间floatw;//带权周转时间doubleaz;//平均周转时间doubleaw;//平均带权周转时间structPCB*next;//指向下个进程}pcb;inti;intt;//计时器intn;//进程个数pcb*head=NULL,*p,*q;//进程链表指针doublex=0,y=0;voidfcfs(pcb*p1){t=p1-atimet?p1-atime:t;p[i].sttime=p[i].atimep[i].ftime=p[i].atime+p[i].stimep[i].sttime=p[i-1].ftimep[i].ftime=p[i-1].ftime+p[i].stimep[i].z=p[i].ftime-p[i].atime……输出结果结束《大型数据库系统概论》实验报告-4-p1-sttime=t;printf(\n时刻:%d.当前开始运作作业%s\n,t,p1-name);t+=p1-stime;p1-status='r';p1-ftime=t;p1-z=p1-ftime-p1-atime;p1-w=p1-z/p1-stime;x+=p1-z;y+=p1-w;p1-az=x/n;p1-aw=y/n;printf(到达时间开始时间服务时间完成时间周转时间带权周转时间\n);printf(%6d%10d%10d%8d%10.1f%10.2f\n,p1-atime,p1-sttime,p1-stime,p1-ftime,p1-z,p1-w);}voidFCFS(){inti;p=head;for(i=0;in;i++){if(p-status=='j'){q=p;fcfs(q);}p=p-next;}printf(\n平均周转时间平均带权周转时间\n);printf(%10.2f%10.2f\n,q-az,q-aw);}voidinput(){intnum;printf(\n进程个数:);scanf(%d,&n);printf(\n进程名到达时间服务时间\n);for(num=0;numn;num++){p=(pcb*)malloc(sizeof(pcb));scanf(%s\t%d\t%d,&p-name,&p-atime,&p-stime);if(head==NULL){head=p;q=p;t=p-atime;《大型数据库系统概论》实验报告-5-}if(p-atimet)t=p-atime;q-next=p;p-sttime=0;p-ftime=0;p-z=0;p-w=0;p-next=NULL;p-status='j';q=p;}}voidmain(){printf(FCFS\n);input();p=head;FCFS();}《大型数据库系统概论》实验报告-6-2.短进程优先#includestdio.htypedefstructPCB{charname[8];//进程名intatime;//到达时间intstime;//服务时间intsttime;//开始时间intftime;//结束时间floatz;//周转时间floatw;//带权周转时间doubleaz;//平均周转时间doubleaw;//平均带权周转时间}pcb;pcba[100];intn,i;doubleb=0,c=0;voidinput(pcb*p){printf(请输入进程个数:);scanf(%d,&n);printf(\n进程名到达时间服务时间\n);for(i=0;in;i++){scanf(%s%d%d,&p[i].name,&p[i].atime,&p[i].stime);}}voidSJF(pcb*p){floatatime=0,stime=0,sttime=0,ftime=0,z=0,w=0,az=0,aw=0;for(i=0;in;i++)for(intj=0;j=i;j++)if(p[i].atimep[j].atime){pcbtemp1;temp1=p[i];p[i]=p[j];p[j]=temp1;}for(i=0;in-1;i++)《大型数据库系统概论》实验报告-7-{if(i==0)p[i].ftime=p[i].atime+p[i].stime;elsep[i].ftime=p[i-1].ftime+p[i].stime;intt=0;for(intj=i+1;j=n-1;j++){if(p[j].atime=p[i].ftime)t++;}intmin=p[i+1].stime;intx=i+1;for(intk=i+1;ki+t;k++){if(p[k+1].stimemin){min=p[k+1].stime;x=k+1;}}pcbtemp2;temp2=p[i+1];p[i+1]=p[x];p[x]=temp2;}printf(进程名到达时间开始时间服务时间完成时间周转时间带权周转时间\n);for(i=0;in;i++){if(i==0){p[i].sttime=p[i].atime;p[i].ftime=p[i].atime+p[i].stime;}else{p[i].sttime=p[i-1].ftime;p[i].ftime=p[i-1].ftime+p[i].stime;}p[i].z=p[i].ftime-p[i].atime;p[i].w=p[i].z/p[i].stime;b+=p[i].z;c+=p[i].w;printf(%s%6d%10d%10d%8d%10.1f%10.2f\n,p[i].name,p[i].atime,p[i].sttime,p[i].stime,p[i].ftime,p[i].z,p[i].w);《大型数据库系统概论》实验报告-8-}printf(\n平均周转时间平均带权周转时间\n);printf(%10.2f%10.2f\n,b/n,c/n);}voidmain(){input(a);printf(SJF\n);SJF(a);}五、结果分析与实验体会结果通过验证正确对于先来先服务与短进程优先算法,含义都理解,平时做在本子上的题也做的像模像样,但是一旦涉及编程代码,就会觉得力不从心,自己尝试着不借助其他自己编,但是总是错漏百出,缺胳膊少腿的,总体很不严谨,总是缺少那一两个约束,而导致编不出自己想要的结果。以后,还是要多锻炼锻炼自己的编程。
本文标题:进程调度
链接地址:https://www.777doc.com/doc-5608405 .html